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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM