1. 程式人生 > >MySQL的FEDERATED引擎實現類Oracle的DBlink

MySQL的FEDERATED引擎實現類Oracle的DBlink

mysql federated dblink

隨著業務的復雜度不斷的增加、數據庫不斷的切分,在分布式系統中往往一臺或幾臺數據庫並不能滿足我們的需求,所以常常需要多臺同時時用,而在平時需要通過其它服務器的數據庫獲取信息最為方便的就是數據鏈接,而比較常見的如Oracle中的DBlink一般,使用過Oracle的DBlink—數據庫的鏈接的人都知道可以跨服務器數據庫的來進行數據查詢。而在MySQL5.0以後中通過使用FEDERATED引擎也可以實現類似於Oracle中DBlink,在MySQL5.5開始默認安裝只是沒有啟用,同Oracle的DBlink一樣MySQL使用FEDERATED引擎實現外鏈接建議是在同一個局域網內,這樣可以減小彼此間的延遲,但兩者之間還是有很大區別的,在MySQL下使用FEDERATED引擎實現的外鏈接需要在本地數據庫中建虛擬表用以連接遠程數據庫,在這裏就就簡單的說明一下MySQL的FEDERATED引擎實現的數據庫外鏈接。

首先,需要註意的有幾點:

1、建立外鏈接於局域網內的環境實現最優;

2、使用FEDERATED引擎的外鏈接表,在本地是虛擬表,所以建表的示後不需要主鍵、索引、自增字段這些。同理,對本地虛擬表的結構修改,並不會修改遠程表的結構;

3、TRUNCATE(截斷表)會清除遠程表數據,DROP只會刪除本地虛擬表;

4、在虛擬表上不支持ALTER

在數據庫中是否有FEDERATED引擎可以通過如下來查看:

mysql> SHOW ENGINES;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.01 sec)

一般這種情況就是有FEDERATED引擎但是沒有啟用,啟用很簡單,在my.cnf或my.ini中的[mysqld]段中修改添加,如下:

[mysqld]
……
federated
……

重啟MySQL,此時再看就啟用了FEDERATED引擎

技術分享圖片

此時再本地數據庫建虛擬表用來鏈接遠程數據庫,其表結構可以通過在遠程數據庫中通過SHOW CREATE TABLE來查看DDL,但是要註意去掉主鍵、索引、自增字段,但是本地的虛擬表的表名可以不同,如遠程數據庫:192.168.2.25下的my_test庫下有一張book_price表,遠程數據庫上的DDL:

CREATE TABLE `book_price` (
  `book_name` varchar(255) NOT NULL DEFAULT '',
  `book_price` decimal(11,3) NOT NULL DEFAULT '0.000'
) ENGINE=InnoDB DEFAULT CHARSET=utf8

在本地數據庫中的DDL如下:

CREATE TABLE `book_price_local` (
  `book_name` varchar(255) NOT NULL DEFAULT '',
  `book_price` decimal(11,3) NOT NULL DEFAULT '0.000'
) ENGINE=FEDERATED DEFAULT CHARSET=utf8 CONNECTION='mysql://root:password#@192.168.2.25:3306/my_test/book_price'
#源端表DDL ENGINE=federated CONNECTION= 'mysql://用戶:密碼@IP地址:端口/庫名稱/表名稱';

這裏需要註意的是CONNECTION後則是遠程數據庫的連接信息,這裏要註意的是避免使用帶‘@’的密碼以免混淆,效果如下:

技術分享圖片技術分享圖片


MySQL的FEDERATED引擎實現類Oracle的DBlink