--source include/have_innodb.inc --source include/master-slave.inc # # Test for DO_DOMAIN_IDS=(M1, M2, ..) and IGNORE_DOMAIN_IDS=(N1, N2, ..) # connection slave; call mtr.add_suppression("Both DO_DOMAIN_IDS & IGNORE_DOMAIN_IDS lists can't be non-empty at the same time"); call mtr.add_suppression("DO_DOMAIN_IDS or IGNORE_DOMAIN_IDS lists can't be non-empty in non-GTID mode.*"); connection master; SET @@session.gtid_domain_id= 1; SELECT @@session.gtid_domain_id; CREATE TABLE t1(i INT) ENGINE=INNODB; INSERT INTO t1 VALUES(1); SELECT * FROM t1; --source include/save_master_gtid.inc connection slave; --source include/sync_with_master_gtid.inc ##### Case 0 : When both DO_DOMAIN_IDS and IGNORE_DOMAIN_IDS are empty. SELECT * FROM t1; ##### Case 1: When DO_DOMAIN_IDS is non-empty. --source include/stop_slave.inc let $do_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (BEFORE) : $do_domain_ids_before --echo IGNORE_DOMAIN_IDS (BEFORE) : $ignore_domain_ids_before # Replicate events belonging to "domain_id 1". CHANGE MASTER TO DO_DOMAIN_IDS=(1), MASTER_USE_GTID=slave_pos; --source include/start_slave.inc let $do_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (AFTER) : $do_domain_ids_after --echo IGNORE_DOMAIN_IDS (AFTER) : $ignore_domain_ids_after connection master; # Lets change the session domain_id to 2(not in DO_DOMAIN_IDS). SET @@session.gtid_domain_id= 2; # Should get filtered out on slave. INSERT INTO t1 VALUES(2); # Change it back to 1 (in DO_DOMAIN_IDS). SET @@session.gtid_domain_id= 1; # Should get applied on slave. INSERT INTO t1 VALUES(3); SELECT * FROM t1; --source include/save_master_gtid.inc connection slave; --source include/sync_with_master_gtid.inc SELECT * FROM t1; ##### Case 2: When IGNORE_DOMAIN_IDS is non-empty. --source include/stop_slave.inc let $do_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (BEFORE) : $do_domain_ids_before --echo IGNORE_DOMAIN_IDS (BEFORE) : $ignore_domain_ids_before # Ignore events belonging to "domain_id 1". CHANGE MASTER TO DO_DOMAIN_IDS=(), IGNORE_DOMAIN_IDS=(1), MASTER_USE_GTID=slave_pos; --source include/start_slave.inc let $do_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (AFTER) : $do_domain_ids_after --echo IGNORE_DOMAIN_IDS (AFTER) : $ignore_domain_ids_after connection master; # @@session.gtid_domain_id = 1 (in IGNORE_DOMAIN_IDS) SELECT @@session.gtid_domain_id; # Should get filtered out on slave. INSERT INTO t1 VALUES(4); # Change it to 2 (not in IGNORE_DOMAIN_IDS). SET @@session.gtid_domain_id= 2; # Should get applied on slave. INSERT INTO t1 VALUES(5); SELECT * FROM t1; --source include/save_master_gtid.inc connection slave; --source include/sync_with_master_gtid.inc SELECT * FROM t1; ##### Case 3: When both DO_DOMAIN_IDS and IGNORE_DOMAIN_IDS are non-empty --source include/stop_slave.inc let $do_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (BEFORE) : $do_domain_ids_before --echo IGNORE_DOMAIN_IDS (BEFORE) : $ignore_domain_ids_before --error ER_MASTER_INFO CHANGE MASTER TO DO_DOMAIN_IDS=(1), IGNORE_DOMAIN_IDS=(2), MASTER_USE_GTID=slave_pos; let $do_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (AFTER) : $do_domain_ids_after --echo IGNORE_DOMAIN_IDS (AFTER) : $ignore_domain_ids_after ##### Case 4: Multiple domain ids. --source include/stop_slave.inc let $do_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (BEFORE) : $do_domain_ids_before --echo IGNORE_DOMAIN_IDS (BEFORE) : $ignore_domain_ids_before # Replicate events belonging to "domain_id 1". CHANGE MASTER TO DO_DOMAIN_IDS=(4,4,5,1,7,7,7,1,1,2,6,8,1,4,5,5,9,3), IGNORE_DOMAIN_IDS=(), MASTER_USE_GTID=slave_pos; --source include/start_slave.inc let $do_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (AFTER) : $do_domain_ids_after --echo IGNORE_DOMAIN_IDS (AFTER) : $ignore_domain_ids_after connection master; # @@session.gtid_domain_id = 1 (in DO_DOMAIN_IDS) SELECT @@session.gtid_domain_id; # Should get applied on slave. INSERT INTO t1 VALUES(8); # Change it to 7 (in DO_DOMAIN_IDS). SET @@session.gtid_domain_id= 7; # Should get applied on slave. INSERT INTO t1 VALUES(9); # Change it to 10 (no in DO_DOMAIN_IDS). SET @@session.gtid_domain_id= 10; # Following should get filtered out on slave. INSERT INTO t1 VALUES(10); INSERT INTO t1 VALUES(11); START TRANSACTION; INSERT INTO t1 VALUES(12); INSERT INTO t1 VALUES(13); COMMIT; INSERT INTO t1 VALUES(14); INSERT INTO t1 VALUES(15); --source include/save_master_gtid.inc connection slave; --source include/sync_with_master_gtid.inc SELECT * FROM t1; ##### Case 5: Seconds_Behind_Master connection slave; --echo # Seconds_Behind_Master should be zero here because the slave is fully caught up and idle. --let $status_items= Seconds_Behind_Master --source include/show_slave_status.inc ##### Case 6: Stop slave before a transaction (involving MyISAM and InnoDB # table) being filtered commits. connection slave; --source include/stop_slave.inc let $do_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (BEFORE) : $do_domain_ids_before --echo IGNORE_DOMAIN_IDS (BEFORE) : $ignore_domain_ids_before # IGNORE_DOMAIN_IDS=(1) CHANGE MASTER TO DO_DOMAIN_IDS=(), IGNORE_DOMAIN_IDS=(1), MASTER_USE_GTID=slave_pos; --source include/start_slave.inc let $do_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (AFTER) : $do_domain_ids_after --echo IGNORE_DOMAIN_IDS (AFTER) : $ignore_domain_ids_after connection master; # following statements should not get filtered. SET @@session.gtid_domain_id=2; CREATE TABLE t2(i int) ENGINE=MYISAM; CREATE TABLE t3(i int) ENGINE=INNODB; SET @@session.gtid_domain_id=1; BEGIN; INSERT INTO t2 VALUES(1); INSERT INTO t3 VALUES(1); # Now switch to slave to stop replication. connection slave; --source include/stop_slave.inc --source include/wait_for_slave_to_stop.inc # Back to master to finish the transaction. connection master; INSERT INTO t2 VALUES(2); INSERT INTO t3 VALUES(2); COMMIT; --source include/save_master_gtid.inc # On slave to start replication. connection slave; --source include/start_slave.inc --source include/sync_with_master_gtid.inc SELECT * FROM t2; SELECT * FROM t3; ##### Case 7: Stop slave before a transaction (involving MyISAM and InnoDB # table) being filtered commits and start it back with filtering # disabled. connection master; SET @@session.gtid_domain_id=1; BEGIN; INSERT INTO t2 VALUES(3); INSERT INTO t3 VALUES(3); --source include/save_master_gtid.inc connection slave; --source include/sync_with_master_gtid.inc --source include/stop_slave.inc let $do_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (BEFORE) : $do_domain_ids_before --echo IGNORE_DOMAIN_IDS (BEFORE) : $ignore_domain_ids_before # Clear IGNORE_DOMAIN_IDS CHANGE MASTER TO DO_DOMAIN_IDS=(), IGNORE_DOMAIN_IDS=(), MASTER_USE_GTID=slave_pos; --source include/start_slave.inc let $do_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (AFTER) : $do_domain_ids_after --echo IGNORE_DOMAIN_IDS (AFTER) : $ignore_domain_ids_after connection master; INSERT INTO t2 VALUES(4); INSERT INTO t3 VALUES(4); COMMIT; --source include/save_master_gtid.inc connection slave; --source include/sync_with_master_gtid.inc SELECT * FROM t2; SELECT * FROM t3; ##### Case 8: Stop slave into the middle of a transaction and start it back # with filtering enabled. connection master; SET @@session.gtid_domain_id=1; BEGIN; INSERT INTO t2 VALUES(5); INSERT INTO t3 VALUES(5); --source include/save_master_gtid.inc connection slave; --source include/sync_with_master_gtid.inc --source include/stop_slave.inc let $do_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (BEFORE) : $do_domain_ids_before --echo IGNORE_DOMAIN_IDS (BEFORE) : $ignore_domain_ids_before # IGNORE_DOMAIN_IDS(1) CHANGE MASTER TO DO_DOMAIN_IDS=(), IGNORE_DOMAIN_IDS=(1), MASTER_USE_GTID=slave_pos; --source include/start_slave.inc let $do_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (AFTER) : $do_domain_ids_after --echo IGNORE_DOMAIN_IDS (AFTER) : $ignore_domain_ids_after connection master; INSERT INTO t2 VALUES(6); INSERT INTO t3 VALUES(6); COMMIT; --source include/save_master_gtid.inc connection slave; --source include/sync_with_master_gtid.inc SELECT * FROM t2; SELECT * FROM t3; ##### Case 9: Initially filter out events belonging to domain_id=2 and then # remove the rule to check if event are not being filtered out. connection slave; --source include/stop_slave.inc let $do_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (BEFORE) : $do_domain_ids_before --echo IGNORE_DOMAIN_IDS (BEFORE) : $ignore_domain_ids_before # IGNORE_DOMAIN_IDS(2) CHANGE MASTER TO IGNORE_DOMAIN_IDS=(2), MASTER_USE_GTID=slave_pos; --source include/start_slave.inc let $do_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (AFTER) : $do_domain_ids_after --echo IGNORE_DOMAIN_IDS (AFTER) : $ignore_domain_ids_after connection master; SET @@session.gtid_domain_id=2; BEGIN; INSERT INTO t2 VALUES(7); INSERT INTO t3 VALUES(7); COMMIT; --source include/save_master_gtid.inc # Clear the filter connection slave; --source include/sync_with_master_gtid.inc --source include/stop_slave.inc let $do_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (BEFORE) : $do_domain_ids_before --echo IGNORE_DOMAIN_IDS (BEFORE) : $ignore_domain_ids_before # IGNORE_DOMAIN_IDS() CHANGE MASTER TO IGNORE_DOMAIN_IDS=(), MASTER_USE_GTID=slave_pos; --source include/start_slave.inc let $do_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (AFTER) : $do_domain_ids_after --echo IGNORE_DOMAIN_IDS (AFTER) : $ignore_domain_ids_after connection master; SET @@session.gtid_domain_id=2; BEGIN; INSERT INTO t2 VALUES(8); INSERT INTO t3 VALUES(8); COMMIT; --source include/save_master_gtid.inc connection slave; --source include/sync_with_master_gtid.inc SELECT * FROM t2; SELECT * FROM t3; ##### Case 10: Test CHANGE MASTER with various "incompatible" combinations. connection slave; --source include/stop_slave.inc # 10a: Both DO_DOMAIN_IDS & IGNORE_DOMAIN_IDS can't be non-empty at the same # time. let $do_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (BEFORE) : $do_domain_ids_before --echo IGNORE_DOMAIN_IDS (BEFORE) : $ignore_domain_ids_before --error ER_MASTER_INFO CHANGE MASTER TO DO_DOMAIN_IDS=(1), IGNORE_DOMAIN_IDS=(1), MASTER_USE_GTID=SLAVE_POS; CHANGE MASTER TO DO_DOMAIN_IDS=(1), MASTER_USE_GTID=SLAVE_POS; --error ER_MASTER_INFO CHANGE MASTER TO IGNORE_DOMAIN_IDS=(1), MASTER_USE_GTID=SLAVE_POS; CHANGE MASTER TO DO_DOMAIN_IDS=(), IGNORE_DOMAIN_IDS=(1), MASTER_USE_GTID=SLAVE_POS; --error ER_MASTER_INFO CHANGE MASTER TO DO_DOMAIN_IDS=(1), MASTER_USE_GTID=SLAVE_POS; # 10b: Neither DO_DOMAIN_IDS nor IGNORE_DOMAIN_IDS can be set when # MASTER_USE_GTID=NO let $do_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (BEFORE) : $do_domain_ids_before --echo IGNORE_DOMAIN_IDS (BEFORE) : $ignore_domain_ids_before # MASTER_USE_GTID can't be set to NO when either of IGNORE_DOMAIN_IDS or # DO_DOMAIN_IDS is non-empty. --error ER_MASTER_INFO CHANGE MASTER TO MASTER_USE_GTID=NO; CHANGE MASTER TO DO_DOMAIN_IDS=(), IGNORE_DOMAIN_IDS=(), MASTER_USE_GTID=NO; --error ER_MASTER_INFO CHANGE MASTER TO DO_DOMAIN_IDS=(1), MASTER_USE_GTID=NO; --error ER_MASTER_INFO CHANGE MASTER TO IGNORE_DOMAIN_IDS=(1), MASTER_USE_GTID=NO; let $do_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (AFTER) : $do_domain_ids_after --echo IGNORE_DOMAIN_IDS (AFTER) : $ignore_domain_ids_after CHANGE MASTER TO IGNORE_DOMAIN_IDS=(1), DO_DOMAIN_IDS=(), MASTER_USE_GTID=SLAVE_POS; --source include/start_slave.inc # Cleanup connection master; SET @@session.gtid_domain_id=2; DROP TABLE t1, t2, t3; --source include/save_master_gtid.inc connection slave; --source include/sync_with_master_gtid.inc --source include/stop_slave.inc CHANGE MASTER TO DO_DOMAIN_IDS=(), IGNORE_DOMAIN_IDS=(); --source include/start_slave.inc --source include/rpl_end.inc