MySQL 無原生 DBLink,但可透過 FEDERATED 存儲引擎 在本地建立映射遠程表的「虛擬表」,實現跨實例查詢。本文完整演示從 Source 端建表授權、Target 端啟用 FEDERATED、建立映射表到驗證查詢的全流程。
sources,表 sCREATE TABLE s SELECT * FROM mysql.user;
SHOW CREATE TABLE s;
(輸出結構含 42 個欄位,ENGINE=InnoDB, CHARSET=latin1)
GRANT ALL PRIVILEGES ON sources.s TO 'dex'@'%' IDENTIFIED BY 'xiaojun';
GRANT ALL PRIVILEGES ON sources.s TO 'dex'@'192.168.100.42' IDENTIFIED BY 'xiaojun';
FLUSH PRIVILEGES;
SHOW ENGINES;
-- FEDERATED | NO 表示未啟用
-- 嘗試安裝插件(若提示已存在則跳過)
INSTALL PLUGIN federated SONAME 'ha_federated.so';
# /etc/my.cnf
[mysqld]
federated
service mysql restart
SHOW ENGINES;
-- FEDERATED | YES 表示啟用成功
結構必須與 Source 端 s 表完全一致,引擎指定 FEDERATED,連線資訊寫在 CONNECTION 選項:
CREATE TABLE `links` (
`Host` char(60) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
`User` char(16) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
`Password` char(41) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-- ... 其餘 39 個欄位完全複製 SHOW CREATE TABLE 輸出 ...
`password_expired` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N'
) ENGINE=FEDERATED
DEFAULT CHARSET=latin1
CONNECTION='mysql://dex:xiaojun@192.168.100.41:3306/sources/s';
CONNECTION 格式解析:
mysql://:協議固定dex:xiaojun:用戶名:密碼@192.168.100.41:3306:遠程主機:端口/sources/s:資料庫/表名mysql> SELECT COUNT(*) FROM links;
+----------+
| count(*) |
+----------+
| 12 |
+----------+
1 row in set (0.00 sec)
查詢成功,遠程表資料可透過本地 links 表直接存取。
| 特性 | 說明 |
|---|---|
| WHERE 條件下推 | 支援:SELECT * FROM links WHERE Host='%' 會在遠程端過濾 |
| JOIN 操作 | 可與本地表 JOIN,但遠程表無索引統計,優化器可能選擇錯誤執行計畫 |
| INSERT/UPDATE/DELETE | 支援(需遠程用戶有寫權限),事務不支援跨實例 |
| DDL 同步 | 不支援:Source 端 ALTER TABLE 需手動同步修改 Target 映射表結構 |
| 連線池/超時 | 每個查詢建立新連線,高併發下延遲大,建議配合 ProxySQL 或應用層快取 |
| SSL 加密 | 支援 mysqls:// 協議,需配置憑證 |
FEDERATED 引擎是 MySQL 跨實例查詢的輕量利器,掌握其啟用、映射表建立、連線字串格式與效能特性,能快速解決「偶爾查一下隔壁庫的表」的需求。