博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql通过中间表实现数据的“部分复制”
阅读量:6324 次
发布时间:2019-06-22

本文共 2031 字,大约阅读时间需要 6 分钟。

一、基本思路

  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中的提交和回滚分开。

转载于:https://www.cnblogs.com/edisonfeng/archive/2013/05/23/3095331.html

你可能感兴趣的文章
day8--socket网络编程进阶
查看>>
分析Ajax爬取今日头条街拍美图
查看>>
内存分布简视图
查看>>
如何学习虚拟现实技术vr? vr初级入门教程开始
查看>>
第4 章序列的应用
查看>>
初识闭包
查看>>
hdu1874畅通工程续
查看>>
rails 字符串 转化为 html
查看>>
Yii2.0 下的 load() 方法的使用
查看>>
iOS8 Push Notifications
查看>>
各大名企笔试及面经大全(程序猿必读)
查看>>
轨磁条简介
查看>>
如何设计高扩展的在线网页制作平台
查看>>
SpringBoot整合MyBatis
查看>>
订餐系统之同步美团商家订单
查看>>
CentOS 6.9通过RPM安装EPEL源(http://dl.fedoraproject.org)
查看>>
采集音频和摄像头视频并实时H264编码及AAC编码
查看>>
堆排序算法
查看>>
STM32的TAMPER-RTC管脚作为Tamper的使用[转]
查看>>
[记]一个逐步“优化”的范例程序
查看>>