MySQL 無原生 DBLINK,但可透過 FEDERATED 儲存引擎 建立「遠端表映射」,像查本地表一樣查詢遠端 MySQL 資料。本文演示從 Source 建表授權到 Target 建立 FEDERATED 表的完整流程。
Source (192.168.1.100) Target (192.168.1.101)
+------------------+ +------------------+
| Database: src | <--SQL--> | Engine=FEDERATED|
| Table: s | (MySQL | Table: s_fed |
| Engine=InnoDB | Protocol) | -> src.s |
+------------------+ +------------------+
-- 1. 建表(示範用 mysql.user 結構)
CREATE TABLE src.s SELECT * FROM mysql.user;
-- 2. 建立遠端連線專用帳號
CREATE USER 'fed_user'@'192.168.1.101' IDENTIFIED BY 'StrongPass123';
GRANT SELECT, INSERT, UPDATE, DELETE ON src.s TO 'fed_user'@'192.168.1.101';
FLUSH PRIVILEGES;
-- 檢查支援
SHOW ENGINES;
-- 若 FEDERATED 顯示 NO,需啟用:
-- my.cnf [mysqld] 區段加入:federated=1 → 重啟
-- 或動態載入(需插件檔存在):
INSTALL PLUGIN FEDERATED SONAME 'ha_federated.so';
關鍵:結構必須與 Source 表完全一致(欄位名、型別、順序、索引)。最簡單:SHOW CREATE TABLE src.s 複製結構,改引擎與連線資訊。
CREATE TABLE `s_fed` (
`Host` CHAR(60) NOT NULL DEFAULT '',
`User` CHAR(16) NOT NULL DEFAULT '',
`Password` CHAR(41) NOT NULL DEFAULT '',
-- ... 其餘欄位完全複製 ...
PRIMARY KEY (`Host`,`User`)
) ENGINE=FEDERATED
DEFAULT CHARSET=utf8
CONNECTION='mysql://fed_user:StrongPass123@192.168.1.100:3306/src/s';
CONNECTION 字串格式:mysql://user:pass@host:port/db/table。s_fed)。-- 查詢
SELECT * FROM s_fed LIMIT 5;
-- 寫入(需 Source 授權 INSERT)
INSERT INTO s_fed (Host, User, Password) VALUES ('%', 'test_fed', '*HASH');
-- 刪除/更新同理
| 項目 | 說明 |
|---|---|
| 網路往返 | 每次查詢/寫入皆發起 TCP 連線,延遲 = 網路 RTT + 遠端執行時間 |
| 無索引下推 | WHERE 條件在 Target 評估,全表掃描後再過濾,大表效能極差 |
| 無事務支援 | 跨 FEDERATED 表操作不具備 ACID |
| 連線數 | 每個 FEDERATED 表操作獨立連線,高併發易耗盡遠端 max_connections |
| DDL 限制 | ALTER TABLE、TRUNCATE 不支援 |
| 字符集 | 雙端字符集不一致會導致亂碼 |