视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
mysql通过中间表实现数据的“部分复制”_MySQL
2020-11-09 18:36:11 责编:小采
文档
 bitsCN.com

mysql通过中间表实现数据的“部分复制”

一、基本思路
1.在主库上,为不同的从库建立各自的中间表
2.主库与从库之间只对“中间表”进行复制操作
3.从库上,“中间表”通过触发器,实现与“实体表”的数据同步
二、主库结构与配置
主库结构:

主库配置:

三、从库结构与配置
(以其中的一个从库为例)
从库结构:

其中从库“中间表”上触发器内容如下:


use rel_db;
drop trigger if exists slave_trigger_before_insert_staffinfo_middle_100;
DELIMITER //
create trigger slave_trigger_before_insert_staffinfo_middle_100 before insert on staffinfo_middle_100 for each row
begin
insert into staffinfo values(new.i_userid,new.v_username);
end;
//
DELIMITER ;

从库配置:

四、测试
a)准备数据
1.主库数据初始化

2.从库数据初始化

3.从库开启复制功能

b)数据分发与复制
4.主库分发数据


use rel_db;
drop procedure if exists master_data_dispatch;
DELIMITER //
create procedure master_data_dispatch()
begin
declare i int;
declare v_name varchar(30);
declare staffinfo_cursor CURSOR FOR SELECT i_userid,v_username FROM staffinfo;
declare CONTINUE HANDLER FOR SQLSTATE '02000' SET i =null;
OPEN staffinfo_cursor;
FETCH staffinfo_cursor INTO i,v_name;
WHILE ( i is not null) DO
if (i>=100)and(i<200)and(not exists(select * from staffinfo_middle_100 where i_userid=i)) then
insert into staffinfo_middle_100 values(i,v_name);
else if (i>=200)and(i<300)and(not exists(select * from staffinfo_middle_200 where i_userid=i)) then
insert into staffinfo_middle_200 values(i,v_name);
end if;
end if;
FETCH staffinfo_cursor INTO i,v_name;
END WHILE;
CLOSE staffinfo_cursor;
end
//
DELIMITER ;
call master_data_dispatch;

5.从库“实体表”查询数据

五、说明
1.一旦设置了replicate-do-db,后面的replicate-ignore-db将不起作用(待进一步验证)
replicate-do-table、replicate-ignore-table与之类似
2.主库触发器中(已正确指定difiner)的插入操作无法被同步到从库:只是把触发器的
 调用语句写进了二进制文件,从库中不存 在该触发器。
3.TRIGGER 一般来说是和引发的SQL是在同一个事务中的,也就是说,只要SQL或TRIGGER只
 要有一个出错(包括引发的自定义错误),系统就会自动ROLLBACK,不需要也不能在TRIGGER
 中写ROLLBACK语句.这个是和SQLSERVER不同的,SQLSERVER一般是自动COMMIT的.两
 种数据库机制不一样.如果想SQL中ROLLBACK,TRIGGER中COMMIT,就要用到自治事务了。
4.自治事务可以把SQL的提交和回滚和TRIGGER中的提交和回滚分开。

bitsCN.com

下载本文
显示全文
专题