以前在使用 MS SQL Server 的時候因為可能必須跟別個資料庫進行串接,有可能會利用到 DBLink 來操作 SQL命令 來遠端資料庫,在 MySQL 本身並不具有 DBLink,但幸好也有對應的方法可以使用,也就是 federated 引擎
在 MySQL 中針對不同的功能提供了各式儲存引擎,其中 federated 就是一個針對遠程資料庫操作的實現,透過 federated 所創建的資料表只會在 local 建立含有 schema 的空資料表,而 data 來源則是遠端
MySQL 啟動 federated 引擎
一般預設 MySQL 都會搭載 federated 引擎但不見得有開啟,本篇會從安裝 federated 開始
檢查 federated 是否有開啟,如果 federated 的 Support = YES 代表你可以略過以下解決方案建立 federated 資料表!
$ mysql -uroot -p mysql> show engines; Engine Support FEDERATED YES CSV YES MyISAM DEFAULT InnoDB YES MEMORY YES MRG_MYISAM YES
一般在建立 federated 引擎可能會遇到兩種狀況
狀況1. federated Support = NO,從 5.1.26 開始 MySQL 預設不開啟 federated 引擎,所以必須從 my.cnf 加入 federated 啟動
$ vim /etc/my.cnf federated $ service mysqld restart $ mysql -uroot -p mysql> show engines; FEDERATED YES
狀況2. 沒有 federated,連 support = no 都沒有,這代表在安裝 MySQL 的時候沒有編譯進來,可以選擇動態編譯,但你必須確認擁有 ha_federated.so 的 lib,通常在 /usr/lib64/mysql/plugin 或是 /usr/local/mysql/lib/mysql/plugin
mysql> install plugin federated soname 'ha_federated.so'; $ vim /etc/my.cnf federated $ service mysqld restart $ mysql -uroot -p mysql> show engines; FEDERATED YES
以上都沒有問題之後就可以接下來建立 federated table
CREATE TABLE `remote_article` ( `id` mediumint(8) unsigned NOT NULL DEFAULT '0', `typeid` smallint(5) unsigned NOT NULL DEFAULT '0', `body` mediumtext, `redirecturl` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`), KEY `typeid` (`id`) ) ENGINE=FEDERATED DEFAULT CHARSET=utf8 CONNECTION='mysql://root:rootpass@192.168.0.10:3306/dbname/article';
建立 federated table 必須注意的點是 ENGINE 必須使用 federated,然後使用 CONNECTION 參數來告訴 federated 遠端資料庫的連線資訊
使用 federated 因為是使用網路連線來抓取 data,所以使用 federated 的時候網路狀況可能是一項瓶頸,但這是一個比較不耗費本機資源的方式,實作上其實還是可以利用 replication 將資料複寫回來,避免網路中斷的狀況