技巧篇:mysql远程跨库查询小结

使用场景,举例说明:

我有两台阿里云的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:[email protected]: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

你可能感兴趣的:(技巧篇:mysql远程跨库查询小结)