MySQL使用dblink:本地端是不存任何数据的,使用DBLINK查询的是源端的数据。
首先show engines;查看FEDERATED是否已启用。
如图所示,support为no表示未启用dblink功能。MySQL8.0.28中此引擎是MySQL自带的,默认未启用。
关闭mysqld服务,centos7命令:systemctl stop mysqld;
vi /etc/my.cnf文件
[mysqld]
federated
................
修改完成后重启mysqld:systemctl start mysqld;
查看federated是否启用
目标端访问源端表:
在源端await数据库下创建一张测试表test,create table test(id int,name varchar(64));
插入几条数据
目标端创建一张表,表结构与源端最好一致,名称可以不一样。
create table test(id int,name varchar(64)) ENGINE=FEDERATED CONNECTION='mysql://await:1234@192.168.50.30/await/test';
表后面需要指定引擎为federated,CONNECTION='mysql://username:password@源端IP/databasename/tablename';
目标端中需要使用对应数据库,否则会提示No database selected
也可以创建一个server方便访问数据库中的多个表:
目标端:
create server test_link
FOREIGN DATA WRAPPER mysql
OPTIONS (user 'await',password '1234',host '192.168.50.30',database 'await');
目标端建表:
create table await(id int,name varchar(64),grade float) ENGINE=FEDERATED CONNECTION='test_link/test';
查询数据,发现报错
源端的test表无grade列,而新建的await表有,导致查询失败。
删掉重建await表。
可以查询到源端的数据。此时源端目标端新建表,即可通过server来访问。
注意:
1.本地进行插入删除和更新操作时,会将本地的操作发送到远程服务端进行操作,远程服务器产生结果,然后再返回到本地匹配行。
2.插入的数据量不能超过服务器之间最大的包大小,如果插入数据量过大,会导致包分解,并且可能发生回滚问题。
3.当使用字符串建立连接时,密码避免使用@符号,可以通过使用创建server的方法避免此问题。
4.建立的表不支持分区。




