有時候我們需要跨庫join查詢,但是配置多資料源成本又太高,Oracle提供了DBLink功能,MySQL中也有類似的實作:federated-engine,
-
MySQL中使用federated引擎的表能夠映射遠程資料庫的表,在本地的使用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,
`weapon_id` int(11),
PRIMARY KEY (`id`),
KEY `i_wpn_id` (`weapon_id`) USING BTREE #### 顯式宣告索引
) ENGINE = FEDERATED DEFAULT CONNECTION = 'mysql://root:[email protected]:3306/yang_dev/t_remote_button' CHARSET = utf8-mb4;
只要本地表創建完成,就實作了兩表的實時同步,此時就可以像操作本地表一樣操作遠程表,
另一種方式是在資料庫級別的同步,適合更大粒度的同步,
注意:
- 遠程表不能是視圖,
- 由于遠程連接語法中已使用了特殊符號@,所以連接遠程表的用戶名和密碼中皆不可包含@,
- 其實本地表只存了表結構,真實資料仍然在遠程表,所有的資料操作最終都落實到了遠程表,所以這樣做可能會增加遠程表的壓力,
- 默認情況下在本地可以對遠程表進行任何讀寫操作,為了安全起見,建議實踐中給遠程資料庫和被連接的表做單獨的用戶權限隔離,如將remote用戶在某幾張表上的權限設為只讀,
- 遠程表如果有索引,本地表也必須顯式宣告,方能生效;若遠程表的索引發生變更,本地表務必重新宣告,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/78538.html
標籤:MySQL
