實現原理:使用Federated引擎本創建一個鏈接表實現,但是Federated 引擎只是一個按列的順序和類型解析遠程返回的數據流
準備工作:
1. 本地庫啟用 Federated 引擎
-
查看是否已啟用:
SHOW ENGINES;
如果Federated 引擎的
Support
是YES
就可以直接用;
如果是NO
:-
編輯 MySQL 配置文件
my.cnf
(Linux 一般在/etc/my.cnf
,Windows 在 MySQL 安裝目錄下) -
在
[mysqld]
段加:federated
-
重啟 MySQL。
-
2. 確保遠程庫允許連接
-
遠程 MySQL 要創建一個能被本地 MySQL 訪問的賬號,比如:
CREATE USER 'federated_user'@'本地IP' IDENTIFIED BY '密碼'; GRANT SELECT ON remote_db.* TO 'federated_user'@'本地IP'; FLUSH PRIVILEGES;
-
測試是否能直接用
mysql -h遠程IP -u federated_user -p
登錄。
3. 在本地建 Federated 表
假設遠程有:
-- 遠程 MySQL (192.168.1.200)
CREATE DATABASE remote_db;
USE remote_db;
CREATE TABLE user_info (id INT PRIMARY KEY,name VARCHAR(50),age INT
);
INSERT INTO user_info VALUES (1, 'Alice', 25), (2, 'Bob', 30);
本地建一個 Federated 表:
需要先從遠程表獲取對應的表結構創建sql
SHOW CREATE TABLE remote_user_info\G
本地創建(把 InnoDB
改成 FEDERATED
)
CREATE TABLE remote_user_info (id INT PRIMARY KEY,name VARCHAR(50),age INT
) ENGINE=FEDERATED
CONNECTION='mysql://federated_user:密碼@192.168.1.200:3306/remote_db/user_info';
參數說明
- mysql://
協議標識,固定寫mysql://
表示 Federated 連接到 MySQL 數據源。 - federated_user
遠程 MySQL 用戶名(必須有訪問遠程表的權限)。 - 密碼
對應的遠程 MySQL 用戶密碼。 - 192.168.1.200
遠程 MySQL 主機的 IP 地址(也可以寫域名)。 - 3306
遠程 MySQL 端口(默認是 3306)。 - remote_db
遠程 MySQL 數據庫名(schema 名)。 - user_info
遠程 MySQL 表名。
4. 跨庫查詢示例
假設本地有個 local_db.local_orders
表:
SELECT o.order_id, u.name, u.age
FROM local_orders o
JOIN remote_user_info u ON o.user_id = u.id;
這時 remote_user_info
實際就是訪問遠程 MySQL 的數據了。
5. 注意事項
- 性能:每次訪問 Federated 表都會發 SQL 到遠程庫 → 網絡延遲會影響速度
- DDL 限制:
ALTER TABLE
對 Federated 表有限制,無法修改表結構。而且本地表結構必須與遠程表完全一樣,如果遠程表結構變了,本地 Federated 表也要手動同步修改 - 事務支持:Federated 不支持跨庫事務(和 Oracle DBLINK 一樣的問題)
- 安全:連接串的密碼是明文存儲的,生產環境注意賬號權限最小化
- 刪除: 刪除本地表,遠程表不會刪除