MySQL FEDERATED 引擎允許在本地建立映射遠程 MySQL 表的「虛擬表」,實現跨實例查詢。本文詳細講解啟用方式、建表語法、連接字串格式、查看連結資訊與核心限制(僅支援 MySQL、無分散式事務、無推下條件優化),評估適用場景。
啟用 FEDERATED 引擎
# my.cnf / my.ini
[mysqld]
federated=ON
# 重啟生效
systemctl restart mysqld
# 驗證
SHOW ENGINES; -- FEDERATED 行應顯示 YES
建立遠程映射表
CREATE TABLE federated_table (
id INT(20) NOT NULL AUTO_INCREMENT,
name VARCHAR(32) NOT NULL DEFAULT '',
other INT(20) NOT NULL DEFAULT 0,
PRIMARY KEY (id),
KEY name (name),
KEY other_key (other)
) ENGINE=FEDERATED
DEFAULT CHARSET=utf8
CONNECTION='mysql://root@remote_host:3306/federated_db/test_table';
連接字串格式(四種常見)
| 格式 | 範例 | 適用場景 |
| 完整含密碼 | mysql://user:pass@host:port/db/tbl | 生產環境、需密碼認證 |
| 無密碼(信任網路) | mysql://user@host/db/tbl | 內網測試、已配置免密 |
| 含密碼無埠 | mysql://user:pass@host/db/tbl | 預設 3306 埠 |
| Unix Socket | mysql://user:pass@/var/run/mysqld.sock/db/tbl | 同機器 Socket 連線 |
查看連結資訊
SHOW CREATE TABLE federated_table;
-- 輸出 CONNECTION='mysql://root@remote_host:3306/federated_db/test_table'
SHOW TABLE STATUS LIKE 'federated_table';
-- Comment 欄位顯示連接字串
核心限制與避坑指南
| 限制 | 影響 | 對策 |
| 僅支援遠程 MySQL | 無法連 PostgreSQL、Oracle、SQL Server | 異構用 ETL 工具、CDC、或應用層聚合 |
| 不支援分散式事務 | START TRANSACTION 不會協調遠程提交/回滾 | 業務層實現補償事務、或避免跨實例寫入 |
| 無條件推下 | WHERE id=1 會先全表拉取再本地過濾,極慢 | 遠程建視圖/儲存過程預過濾、或改用應用層雙查詢 |
| 無索引統計 | 優化器無法獲取遠程索引基數,執行計劃不準 | 手動 ANALYZE TABLE、或用直連查詢 |
| 連線失敗無重試 | 遠程掛掉直接報錯,無連線池 | 應用層實現重試、熔斷、降級 |
| DDL 不同步 | 遠程結構變更本地不知情,查詢報錯 | 變更流程納入雙邊同步、或用 pt-online-schema-change 協調 |
適用場景評估
- ✅ 少量、低頻、唯讀跨實例查詢(如報表抽取配置表、字典表)。
- ✅ 遷移過渡期雙寫驗證(應用層雙寫,FEDERATED 校驗)。
- ❌ 高頻、大數據量、寫入、事務、連接不穩定場景。
現代替代方案
- MySQL 8.0 Clone Plugin:實例級快速複製、遠程掛載。
- CDC 工具:Canal、Debezium、Flink CDC 實時同步至下游。
- 應用層雙查詢:Service 層組合多資料源,邏輯可控、易除錯。
- 分庫分表中間件:ShardingSphere、MyCat 透明化跨分片查詢。
延伸閱讀
- 多個 MySQL 表結果集組合
- MySQL 分表處理實現方法
- MySQL 授權表使用示例
- MySQL 記憶體表效能陷阱
- 徹底清除 MySQL 殘留註冊表項目