FEDERATED 儲存引擎讓本地 MySQL 實例透過建立「遠端表映射」直接查詢/修改遠端 MySQL 實例的表,類似 Oracle DB Link。本文涵蓋啟用引擎、建立映射表、連線字串格式、增刪改查驗證、DDL 限制、安全性考量。
SHOW ENGINES;
若 FEDERATED 顯示 NO,編輯 my.cnf 在 [mysqld] 區段新增:
federated
重啟 MySQL 服務後再次 SHOW ENGINES 確認顯示 YES。
本地建表結構必須與遠端表完全一致(欄位、型別、索引、主鍵),引擎指定 ENGINE=FEDERATED,連線資訊寫在 CONNECTION 選項。
-- 1. 取得遠端表建表語句 SHOW CREATE TABLE sakila.actor; -- 2. 本地建立映射表 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';
mysql://username[:password]@hostname[:port]/db_name/tbl_name
username:遠端資料庫帳號password:可選,明文寫在表定義中有安全風險(SHOW CREATE TABLE 可見)hostname:遠端 IP 或主機名port:預設 3306db_name/tbl_name:遠端資料庫與表名CONNECTION='mysql://user@remote_host/db/tbl' CONNECTION='mysql://user:pass@remote_host:3306/db/tbl' CONNECTION='mysql://user:pass@remote_host/db/tbl'
-- 查詢 SELECT * FROM test.federated_actor LIMIT 5; -- 更新(同步到遠端) UPDATE test.federated_actor SET last_name='GUINESS1' WHERE actor_id=1; -- 驗證遠端同步 SELECT * FROM sakila.actor WHERE actor_id=1;
本地操作會透過連線池轉發至遠端實例執行,遠端資料即時變更。
| 項目 | 說明 |
|---|---|
| DDL 不支援 | ALTER TABLE 會報錯 Table storage engine doesn't have this option |
| 索引建立 | 需在遠端建立,本地映射表同步定義 |
| 交易支援 | 不支援跨實例交易(本地 COMMIT 不保證遠端原子性) |
| 效能 | 每次查詢需建立遠端連線,延遲較高,不適合高頻核心業務 |
| 密碼明文 | 建議建立專用唯讀帳號、限制來源 IP、或使用 SSH 隧道/VPN |
| 遠端表刪除 | DROP TABLE 僅刪除本地映射,遠端實表不受影響 |
FEDERATEDX(MariaDB 改良版)、應用層雙寫、CDC 工具、分散式資料庫。