MySQL 的 FEDERATED 儲存引擎提供了一種類似 Oracle DBLink 的功能,讓本地資料庫能透過建立遠程連接表,直接查詢與操作遠端 MySQL 實例的資料。本文將以 MySQL 5.6.21 為測試環境,詳細說明如何啟用 FEDERATED 引擎、建立遠程連接表、進行資料操作,並探討其限制與注意事項。
預設情況下,MySQL 未啟用 FEDERATED 引擎。首先執行 SHOW ENGINES; 查看目前引擎狀態:
SHOW ENGINES;

若 FEDERATED 顯示為 NO,需修改設定檔 my.cnf(Windows 為 my.ini),在 [mysqld] 區段下新增:
federated
重啟 MySQL 服務後,再次執行 SHOW ENGINES; 即可看到 FEDERATED 狀態變為 YES。
本地建立的 FEDERATED 表結構必須與遠端表完全一致。以官方範例資料庫 sakila.actor 為例:
SHOW CREATE TABLE sakila.actor;
CREATE TABLE FEDERATED_actor ( `actor_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, `first_name` varchar(45) NOT NULL, `last_name` varchar(45) NOT NULL, `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`actor_id`), KEY `idx_actor_last_name` (`last_name`) ) ENGINE = FEDERATED CONNECTION = 'mysql://root:123456@127.0.0.1:3306/sakila/actor';
關鍵點說明:
ENGINE = FEDERATED:指定使用 FEDERATED 引擎CONNECTION 連接字串格式:mysql://user_name[:password]@host_name[:port_num]/db_name/tbl_namemysql://username:password@hostname:port/database/tablenamemysql://username@hostname/database/tablenamemysql://username:password@hostname/database/tablenameSHOW CREATE TABLE 或 SHOW TABLE STATUS 時皆可見,生產環境建議改用其他安全方案SELECT * FROM test.federated_actor;

USE test; UPDATE federated_actor SET last_name = 'GUINESS1' WHERE actor_id = 1; SELECT * FROM test.federated_actor; SELECT * FROM sakila.actor;

對本地 FEDERATED 表進行更新,遠端原始表資料也會同步異動,雙向同步即時生效。
ALTER TABLE federated_actor ADD COLUMN idtest INT DEFAULT 0; -- Error Code: 1031. Table storage engine for 'federated_actor' doesn't have this option
FEDERATED 引擎不支援 ALTER TABLE,需在遠端直接修改表結構,再同步調整本地表定義。
DROP TABLE test.federated_actor;
僅移除本地連接定義,遠端實體表與資料保持不變。
FEDERATED 引擎為 MySQL 提供了跨實例查詢能力,類似異構資料庫的 DBLink。優點是實作簡單、即時同步;缺點則是配置較繁瑣、需在本地建立映射表、密碼明文存儲有安全風險、不支援 DDL、效能受網路延遲影響較大。期待後續 MySQL 版本能在安全性與效能上進一步優化。