MySQL数据库跨服务器数据同步

1.环境说明

MySQL 版本:5.7.20

本地数据库 A(作为 Zentao 数据库),本地数据库 B,本地程序 C;本地为 Windows 环境。

2.方案探索

方案 1:在 A 中写触发器,表中数据变化时将 ID 发给 C,由 C 在 A 中查询变化的数据,写入 B。过程中需要安装 mysql-udf-http 插件

(参考:https://www.2cto.com/database/201801/713571.html)

方案 2

在 A 中用触发器监控数据的变化,然后调用存储过程将数据推送给 B ,用 BDlink 进行数据库跨库。

DBlink 是 oracle 进行跨库访问的方法,SQL Server 可以用 linkServer。在 mysql5.0 版本以上,可以采用 FEDERATED 引擎(默认引擎为 InnoDB)。

(参考:https://blog.csdn.net/langkeziju/article/details/50462943)

所以值得注意:建表时指定引擎为 FEDERATED

ENGINE=FEDERATED CONNECTION='mysql://user:password@ip:port/test1/test_table';

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE federated_table (
id int(20) NOT NULL auto_increment,
name varchar(32) NOT NULL default '',
age varchar(4) NOT NULL default '0',
sts char(1) NOT NULL default '0',
office VARCHAR(64) NOT NULL default '0',
telephone VARCHAR(15) NOT NULL default '0',
PRIMARY KEY (id),
KEY name (name),
KEY age (age),
KEY sts (sts),
KEY telephone (telephone),
KEY office (office)

) ENGINE=FEDERATED CONNECTION='mysql://user:password@ip:port/test1/test_table';

前提条件是可以访问远程数据库,配置好读写权限,mysql 开启 FEDERATED 引擎。

建完后本地数据与远程数据一样,进行 curd 操作都可同步。

既然通过 FEDERATED 可以将数据同步过来,那么可以在 B 中建立 A 的映射。

因为映射表在程序 C 中并没有实际意义,需要将映射表的某些字段与 B 实际业务表的数据进行同步,可以采用 程序进行操作 或者 利用触发器和存储过程。

触发器示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
drop TRIGGER updateFromFed; #删除触发器,建立后需要删除才能修改


delimiter $$ #修改语句结束标志为$$
create TRIGGER insertFromFederated AFTER INSERT
on federated_table for each ROW
begin #状态=1执行插入操作
DECLARE de VARCHAR(128);
set de = CONCAT(IFNULL(new.name,''),'-',IFNULL(new.age,''),'-',IFNULL(new.office,''));
if new.sts="1" THEN

INSERT into local1(id,name,description,sts)
values (new.id,new.name,de,new.sts);
INSERT into local2(id,name,office,sts)
values (new.id,de,new.office,new.sts);
END IF;
END $$
delimiter ;

参考:https://blog.csdn.net/qq_33556185/article/details/77745449

存储过程示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#mysql 下面的例子在把select into 的ID写死的时候设置参数值为空,但是在使用传进来的ID作为参数时设置参数值不为空。
show create procedure test;#查看
CALL test();#调用
drop procedure if exists test;#删除
in id VARCHAR(32)
delimiter $$
create PROCEDURE test()
begin
DECLARE id VARCHAR(32);
set id='8302';
DECLARE v_name VARCHAR(128)

SELECT local2.name INTO v_name from local2 where id = 5;
select id,v_name;
#INSERT into local2(id,name,office,sts) VALUES (id,des,'办公室','8');
end $$
delimiter ;

show engines;

参考:http://www.shouce.ren/api/view/a/11695

作者

Catooilg

发布于

2020-08-05

更新于

2023-02-05

许可协议

评论