一、基本思路
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中的提交和回滾分開。