利用mysql的FEDERATED进行3个以上数据库的表数据同步

被问到使用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;

最后的建表状态:

利用mysql的FEDERATED进行3个以上数据库的表数据同步_第1张图片


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个触发器

利用mysql的FEDERATED进行3个以上数据库的表数据同步_第2张图片

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

 

你可能感兴趣的:(数据库,MYSQL)