使用场景,举例说明:
我有两台阿里云的ecs服务器,IP分别是:xxx.xxx.xxx.1,xxx.xxx.xxx.2
数据库分别是:IP为1的db1,IP为2的db2
db1中有张表sys_user:
建表SQL如下:
CREATE TABLE `sys_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
`username` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户名',
`password` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '密码',
`state` int(4) DEFAULT NULL COMMENT '状态,1正常,0待审核,-1删除',
`createtime` datetime DEFAULT NULL COMMENT '创建时间',
`operatortime` datetime DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
db2中,我想查看db1中的表sys_user数据
基于此,两台服务器之间的跨库查询,可以使用如下的方式进行(MySQL的FEDERATED):
首先,执行show engines;查看是否支持FEDERATED
image.png另外,编辑 /etc/my.cnf,在[mysqld]模块加入federated:
image.png
如果编辑了/etc/my.cnf,需要重新启动MySQL:
systemctl restart mysql
show engines返回的结果,支持FEDERATED的话,就可以在db2中建表了
建表SQL如下(需要注意的是ENGINE,CONNECTION,这里演示的是,该表的结构和db1中的sys_user保持一致):
CREATE TABLE `engin_sys_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
`username` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户名',
`password` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '密码',
`state` int(4) DEFAULT NULL COMMENT '状态,1正常,0待审核,-1删除',
`createtime` datetime DEFAULT NULL COMMENT '创建时间',
`operatortime` datetime DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=FEDERATED AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
CONNECTION='mysql://username:password@xxx.xxx.xxx.2:port/db/table'
另外,CONNECTION还可以使用另外一种方式(需要注意的是SERVER , WRAPPER):
CREATE SERVER server_dz
FOREIGN DATA WRAPPER mysql
OPTIONS (HOST 'xxx.xxx.xxx.2',USER 'xxx',PASSWORD 'xxx' ,PORT 3306,DATABASE 'db');
执行后,建表语句中可以使用:CONNECTION='server_dz',需要注意的是表名,要和db1中的保持一致
测试效果如下:
修改db1中sys_user的表数据后,再db2查看 engin_sys_user的表数据,结果如下图:
image.png
网友评论