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

posted @ 2013-05-23 18:09  edisonfeng  阅读(6327)  评论(0编辑  收藏  举报