方案:触发器
优点: 工作效率和开发效率上有很大的提高
缺点: 增加数据库服务器的开销
在同一个mysql实例中:
在数据库sakila中创建insert触发器
use sakila;
mysql> delimiter $$
mysql> create trigger insert_trigger after insert on user_test for each row
-> BEGIN
-> insert into test.user_test(id,username_test) VALUES (new.id,new.username_test);
-> insert into world.user_test(id,username_test) VALUES (new.id,new.username_test);
-> end $$
根据sql可以看出:为user_test表的每一行创建一个名为insert_trigger的【insert 插入】触发器,动作是:插入到test数据库的user_test表(id,username_test) 值为新值,第二行同义。当需要多个数据库同步时增加这里的sql即可。
在数据库sakila中创建update触发器
use sakila;
mysql> delimiter $$
mysql> create trigger update_trigger after update on user_test for each row
-> begin
-> update test.user_test set username_test = new.username_test where id = new.id;
-> update world.user_test set username_test = new.username_test where id = new.id;
-> end $$
大意相同,不过是insert变为update
参考文章:mysql同一实例多个数据库数据同步_怎么配置mysql同步多个库_木一番的博客-CSDN博客
那如果说是不同的mysql实例呢?
解决方案:Federated数据引擎
检查本地mysql是否支持Federated数据引擎
执行 show ENGINES; 语句
Support值为NO,说明未支持该引擎。需修改mysql的配置文件进行设置。
找到mysql的配置文件,在[mysqld]后添加federated即可;添加完成,重启mysql服务再次查询该引擎状态为YES即为支持。
在本地数据库中创建一个可以映射远程表数据的桥接表 [结构与远程服务器一致,下面叫本地]
注意:该表与远程服务器中需要同步数据的表结构一致(创建表结构即可,表数据会映射过来)
在原来的表结构后加上:
ENGINE=FEDERATED CONNECTION = 'mysql://user:password@ip:port/databaseName/tableName';
参考:
Mysql 触发器-两个数据库的表数据同步-步骤与问题解决_双数据库同步_瑶山的博客-CSDN博客
mysql 触发器同步远程服务器上数据库 - 创客未来 - 博客园 (cnblogs.com)