federated儲存引擎實現跨伺服器的資料訪問

wzq609發表於2015-04-12

【前言】資料庫之間的跨伺服器的訪問在實際的工作中經常用到,最常見的是不同資料庫的資料比對和資料抽取。針對這個需求ORACLE可以透過透明閘道器和DBLINK的方式來滿足;MySQL提供了儲存引擎federated可以實現該功能;

 

【1】FEDERATED的安裝

首先檢查資料庫當前儲存引擎的安裝情況,預設的情況下FEDERATED的儲存引擎不會隨著資料庫進行安裝的;

1.1 檢查資料庫當前儲存引擎的安裝指令碼:show engines

image

當前的資料庫沒有安裝FEDERATED;

 

1.2 透過INSTALL PLUGIN的方式安裝federated儲存引

mysql> install plugin federated soname 'ha_federated.so';

Query OK, 0 rows affected, 1 warning (0.08 sec)

mysql> show engines;

image

顯示當前FEDERATED儲存引擎已經安裝好,但是未啟用;

 

1.3 啟動FEDERATED儲存引擎,修改/etc/my.cnf引數,在[mysqld]下面新增:federated,重啟mysql

mysql> show engines
image

 

【2】FEDERATED的使用

當要訪問遠端的表時,需要在本地的資料庫建立一個具有同樣表結構使用FEDERATED儲存引擎的表,當訪問這個表的時候,系統會自動遠端訪問到遠端的資料庫表;

 

測試步驟和環境說明

在伺服器A 資料庫test下面建立表john

mysql>CREATE TABLE `john` (  `id` varchar(32) DEFAULT NULL,UNIQUE KEY `index-123` (`id`) )

ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

mysql> insert into john values(1),(2),(3);
Query OK, 3 rows affected (0.11 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from john;
+------+
| id   |
+------+
| 1    |
| 2    |
| 3    |
+------+

 

在伺服器B 資料庫test下面建立相應的表federated_john

mysql> CREATE TABLE federated_john (
    ->   `id` varchar(32) DEFAULT NULL,
    ->   UNIQUE KEY `index-123` (`id`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    -> ENGINE=FEDERATED CONNECTION='mysql://root:123456@192.168.47.167:3306/test/john';

 

mysql> select * from federated_john;
+------+
| id   |
+------+
| 1    |
| 2    |
| 3    |
+------+
3 rows in set (0.37 sec) #請注意執行時間

mysql> insert into federated_john values(4),(5),(6);    #可以透過federated_john修改資料
Query OK, 3 rows affected (0.16 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from federated_john;
+------+
| id   |
+------+
| 1    |
| 2    |
| 3    |
| 4    |
| 5    |
| 6    |
+------+
6 rows in set (0.04 sec)

 

在伺服器A下面查詢

mysql> select * from john;
+------+
| id   |
+------+
| 1    |
| 2    |
| 3    |
| 4    |
| 5    |
| 6    |
+------+
6 rows in set (0.00 sec)   #資料同樣被修改;

 

在伺服器B下面檢視儲存資料,只有表結構並沒有相應的資料

image

 

【3】連線指令碼注意事項,federated連線字串的格式說明

mysql> CREATE TABLE federated_john (
    ->   `id` varchar(32) DEFAULT NULL,
    ->   UNIQUE KEY `index-123` (`id`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    -> ENGINE=FEDERATED CONNECTION='mysql://root:123456@192.168.47.167:3306/test/john';

其中CONNECTION的格式如下:

mysql://user_name[:password]@host_name[:port_num]/db_name/tbl_name

 

【總結】利用federated儲存引擎構建表的時候,可以快速實現跨資料庫的訪問和修改,為一些特殊場景的應用提供了良好的解決辦法;

由於是跨主機的訪問,所以當表數量級別達到十萬以上的時候,整個訪問的速度相對本機有很明顯的效率問題。

......................................................................................................................................................................………………………………………………………………………………….

本文作者:JOHN,某上市公司DBA,業餘時間專注於資料庫的技術管理,從管理的角度去運用技術。

技術部落格:獵人筆記                                                資料庫技術群:367875324 (請備註資料庫型別)

......................................................................................................................................................................…………………………………………………………………………………….

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12679300/viewspace-1570483/,如需轉載,請註明出處,否則將追究法律責任。

相關文章