实现原理:使用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 一样的问题)
- 安全:连接串的密码是明文存储的,生产环境注意账号权限最小化
- 删除: 删除本地表,远程表不会删除