被问到使用mysql的FEDERATED进行远程同步,多个服务器数据库的情况下同步不了? 之前对FEDERATED不了解,所以测试了一下,发现是可以的啊,主要是中间那个数据库要多加个中间表。反正都测试了就写出来记录一下:
目标:有数据库a、b、c,另b的fed_user表插入一条数据后,a的user,c的c_user 都同时插入数据;深入地,fed_user的更新、删除操作也需要进行同步。
没有多台机器的远程资源,测试为模拟,所以在本机操作,测试步骤:
1、数据库a创建表user
CREATE TABLE `user` (
`uid` BIGINT(20) NOT NULL AUTO_INCREMENT,
`user_name` char(17) DEFAULT NULL COMMENT '用户名',
`user_pwd` char(32) DEFAULT NULL COMMENT '密码',
PRIMARY KEY (`uid`)
)
2、数据库b创建fed_user表并FEDERATED连接a的user表
//密码有@不能使用该方法
CREATE TABLE `fed_user` (
`uid` BIGINT(20) NOT NULL AUTO_INCREMENT,
`user_name` char(17) DEFAULT NULL COMMENT '用户名',
`user_pwd` char(32) DEFAULT NULL COMMENT '密码',
PRIMARY KEY (`uid`)
) ENGINE=FEDERATED CONNECTION='mysql://root:123@[email protected]:3306/a/fed_user';
这时候回报错,因为密码里有@
改用:
CREATE SERVER fedlk
FOREIGN DATA WRAPPER mysql
OPTIONS (USER 'root',PASSWORD '123@4', HOST '127.0.0.1', PORT 3306, DATABASE 'a');
CREATE TABLE `fed_user` (
`uid` BIGINT(20) NOT NULL AUTO_INCREMENT,
`user_name` char(17) DEFAULT NULL COMMENT '用户名',
`user_pwd` char(32) DEFAULT NULL COMMENT '密码',
PRIMARY KEY (`uid`)
) ENGINE = FEDERATED DEFAULT CHARSET=utf8 CONNECTION = 'fedlk/user';
此时,插入b的fed_user数据后,a的user进行了同步。
3、数据库c创建表c_user
CREATE TABLE `c_user` (
`uid` BIGINT(20) NOT NULL AUTO_INCREMENT,
`user_name` char(17) DEFAULT NULL COMMENT '用户名',
`user_pwd` char(32) DEFAULT NULL COMMENT '密码',
PRIMARY KEY (`uid`)
)
4、数据库c先创建服务
CREATE SERVER fedlk_c
FOREIGN DATA WRAPPER mysql
OPTIONS (USER 'root',PASSWORD '123@4', HOST '127.0.0.1', PORT 3306, DATABASE 'c');
再a创建FEDERATED?引擎不能是FEDERATED了,修改引擎回报错。
尝试在a创建中间表user_bak,同时FEDERATED连接c的c_user
CREATE TABLE `user_bak` (
`uid` BIGINT(20) NOT NULL AUTO_INCREMENT,
`user_name` char(17) DEFAULT NULL COMMENT '用户名',
`user_pwd` char(32) DEFAULT NULL COMMENT '密码',
PRIMARY KEY (`uid`)
) ENGINE = FEDERATED DEFAULT CHARSET=utf8 CONNECTION = 'fedlk_c/c_user';
5、数据库a的user创建触发器
create trigger t_insert after INSERT
on `user` for each row
begin
INSERT INTO user_bak (uid,user_name,user_pwd)
VALUES(new.uid,new.user_name,new.user_pwd);
end;
最后的建表状态:
6、测试:
在数据库b执行
INSERT INTO fed_user(uid,user_name,user_pwd)
VALUES('8','8','8');
a的user-》a的user_bak-》c的c_user
都是插入了数据
然后尝试将刚刚插入那条数据进行更新和删除,发现只有a的user进行了更新,a的user_bak没变化,是否想到再写个触发器就行了。
7、a的user表添加更新触发器
create trigger t_update after update
on `user` for each row
begin
update user_bak set user_name=new.user_name,user_pwd=new.user_pwd where uid=new.uid;
end;
8、a的user表添加删除触发器
create trigger t_delete after delete
on `user` for each row
begin
if(OLD.uid not in
(select uid
from `user`))
then
delete from user_bak where uid = OLD.uid;
end if;
end;
于是a的user表有3个触发器
9、测试:
在数据库b的fed_user表分别执行更新和删除
a的user-》a的user_bak-》c的c_user
都进行了同步
参考链接:
https://blog.csdn.net/liangf05/article/details/49558107
https://blog.csdn.net/linjun20/article/details/88375841