有時候我們需要跨庫join查詢,但是配置多數據源成本又太高,Oracle提供了DBLink功能,MySQL中也有類似的實現:federated engine。 1. MySQL中使用federated引擎的表能夠映射遠程資料庫的表,本地的這張表相當於遠程資料庫某表在本地的引用,在本地對錶的操作能夠實 ...
有時候我們需要跨庫join查詢,但是配置多數據源成本又太高,Oracle提供了DBLink功能,MySQL中也有類似的實現:federated-engine。
- MySQL中使用federated引擎的表能夠映射遠程資料庫的表,本地的這張表相當於遠程資料庫某表在本地的引用,在本地對錶的操作能夠實時的反應到遠程表上,包括CRUD。
- 要實現首先需要開啟本地庫的federated引擎【遠程資料庫不需要任何配置】,使用SHOW ENGINES;語句查詢本地庫是否開啟了federated-engine;如果沒有開啟,修改mysqlData目錄下的my.ini配置文件,在文件末尾追加一行【federated】字元串,然後重啟MySQL伺服器就可以了。
註意:在linux環境,是在/etc/my.cnf文件末尾追加一行【federated】字元串。 - 前提是本地表必須與遠程表的結構相同【最好直接拷貝遠程表的建表SQL】,在創建本地表時指定遠程表的鏈接與地址。
CREATE TABLE `t_button` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE = FEDERATED DEFAULT CONNECTION = 'mysql://root:[email protected]:3306/yang_dev/t_remote_button' CHARSET = utf8-mb4;
只要本地表創建完成,就實現了兩表的實時同步,此時就可以像操作本地表一樣操作遠程表。
另一種方式是在資料庫級別的同步,適合更大粒度的同步。
由於遠程連接中已經使用了@字元,所以用戶名和密碼中不能再有@字元。
註意:
- 其實本地表只存了表結構,真實數據仍然在遠程表,所有的數據操作最終都落實到了遠程表,所以這樣做可能會增加遠程表的壓力。
- 遠程表不能是視圖。
- 本地可以對對遠程表進行CRUD操作,為了安全起見,建議實踐中給遠程資料庫和連接的表做單獨的用戶許可權限制。