--source include/have_innodb.inc --let $rpl_topology=1->2->3->4 --source include/rpl_init.inc # Set up a 4-deep replication topology, then test various fail-overs # using GTID. # # A -> B -> C -> D connection server_1; --source include/wait_for_binlog_checkpoint.inc --let $binlog_file = query_get_value(SHOW MASTER STATUS,File,1) --let $binlog_pos = query_get_value(SHOW MASTER STATUS,Position,1) --echo *** GTID position should be empty here *** --replace_result $binlog_file $binlog_pos eval SELECT BINLOG_GTID_POS('$binlog_file',$binlog_pos); CREATE TABLE t1 (a INT PRIMARY KEY, b VARCHAR(10)) ENGINE=MyISAM; CREATE TABLE t2 (a INT PRIMARY KEY, b VARCHAR(10)) ENGINE=InnoDB; INSERT INTO t1 VALUES (1, "m1"); INSERT INTO t1 VALUES (2, "m2"), (3, "m3"), (4, "m4"); INSERT INTO t2 VALUES (1, "i1"); BEGIN; INSERT INTO t2 VALUES (2, "i2"), (3, "i3"); INSERT INTO t2 VALUES (4, "i4"); COMMIT; save_master_pos; source include/wait_for_binlog_checkpoint.inc; --let $binlog_file = query_get_value(SHOW MASTER STATUS,File,1) --let $binlog_pos = query_get_value(SHOW MASTER STATUS,Position,1) --let $gtid_pos_server_1 = `SELECT @@gtid_binlog_pos` --echo *** GTID position should be non-empty here *** --replace_result $binlog_file $binlog_pos $gtid_pos_server_1 eval SELECT BINLOG_GTID_POS('$binlog_file',$binlog_pos); connection server_2; sync_with_master; source include/wait_for_binlog_checkpoint.inc; --let $binlog_file = query_get_value(SHOW MASTER STATUS,File,1) --let $binlog_pos = query_get_value(SHOW MASTER STATUS,Position,1) --echo *** GTID position should be the same as on server_1 *** --replace_result $binlog_file $binlog_pos $gtid_pos_server_1 eval SELECT BINLOG_GTID_POS('$binlog_file',$binlog_pos); SELECT * FROM t1 ORDER BY a; SELECT * FROM t2 ORDER BY a; save_master_pos; connection server_3; sync_with_master; SELECT * FROM t1 ORDER BY a; SELECT * FROM t2 ORDER BY a; save_master_pos; connection server_4; sync_with_master; SELECT * FROM t1 ORDER BY a; SELECT * FROM t2 ORDER BY a; --echo *** Now take out D, let it fall behind a bit, and then test re-attaching it to A *** connection server_4; --source include/stop_slave.inc connection server_1; INSERT INTO t1 VALUES (5, "m1a"); INSERT INTO t2 VALUES (5, "i1a"); save_master_pos; connection server_4; --replace_result $MASTER_MYPORT MASTER_PORT eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $MASTER_MYPORT, MASTER_USE_GTID=CURRENT_POS; --source include/start_slave.inc sync_with_master; SELECT * FROM t1 ORDER BY a; SELECT * FROM t2 ORDER BY a; --echo *** Now move B to D (C is still replicating from B) *** connection server_2; --source include/stop_slave.inc --replace_result $SERVER_MYPORT_4 SERVER_MYPORT_4 eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $SERVER_MYPORT_4, MASTER_USE_GTID=CURRENT_POS; --source include/start_slave.inc connection server_4; UPDATE t2 SET b="j1a" WHERE a=5; save_master_pos; connection server_2; sync_with_master; SELECT * FROM t1 ORDER BY a; SELECT * FROM t2 ORDER BY a; --echo *** Now move C to D, after letting it fall a little behind *** connection server_3; --source include/stop_slave.inc connection server_1; BEGIN; INSERT INTO t2 VALUES (6, "i6b"); INSERT INTO t2 VALUES (7, "i7b"); COMMIT; connection server_3; --replace_result $SERVER_MYPORT_4 SERVER_MYPORT_4 eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $SERVER_MYPORT_4, MASTER_USE_GTID=CURRENT_POS; --source include/start_slave.inc # This time, let's sync up without reference to binlog on D. --let $wait_condition= SELECT COUNT(*) = 7 FROM t2 --source include/wait_condition.inc SELECT * FROM t2 ORDER BY a; --echo *** Now change everything back to what it was, to make rpl_end.inc happy # Also check that MASTER_USE_GTID=CURRENT_POS is still enabled. connection server_2; # We need to sync up server_2 before switching. If it happened to have reached # the point 'UPDATE t2 SET b="j1a" WHERE a=5' it will fail to connect to # server_1, which is (deliberately) missing that transaction. --let $wait_condition= SELECT COUNT(*) = 7 FROM t2 --source include/wait_condition.inc --source include/stop_slave.inc --replace_result $MASTER_MYPORT MASTER_MYPORT eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $MASTER_MYPORT; --source include/start_slave.inc --source include/wait_for_slave_to_start.inc connection server_3; --source include/stop_slave.inc --replace_result $SLAVE_MYPORT SLAVE_MYPORT eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $SLAVE_MYPORT; --source include/start_slave.inc --let $wait_condition= SELECT COUNT(*) = 7 FROM t2 --source include/wait_condition.inc connection server_4; --source include/stop_slave.inc --replace_result $SERVER_MYPORT_3 SERVER_MYPORT_3 eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $SERVER_MYPORT_3; --source include/start_slave.inc connection server_1; DROP TABLE t1,t2; --echo *** A few more checks for BINLOG_GTID_POS function *** --let $valid_binlog_name = query_get_value(SHOW BINARY LOGS,Log_name,1) --error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT SELECT BINLOG_GTID_POS(); --error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT SELECT BINLOG_GTID_POS('a'); --error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT SELECT BINLOG_GTID_POS('a',1,NULL); SELECT BINLOG_GTID_POS(1,'a'); SELECT BINLOG_GTID_POS(NULL,NULL); SELECT BINLOG_GTID_POS('',1); SELECT BINLOG_GTID_POS('a',1); eval SELECT BINLOG_GTID_POS('$valid_binlog_name',-1); eval SELECT BINLOG_GTID_POS('$valid_binlog_name',0); eval SELECT BINLOG_GTID_POS('$valid_binlog_name',18446744073709551615); eval SELECT BINLOG_GTID_POS('$valid_binlog_name',18446744073709551616); --echo *** Some tests of @@GLOBAL.gtid_binlog_state *** --connection server_2 --source include/stop_slave.inc --connection server_1 SET @old_state= @@GLOBAL.gtid_binlog_state; --error ER_BINLOG_MUST_BE_EMPTY SET GLOBAL gtid_binlog_state = ''; RESET MASTER; SET GLOBAL gtid_binlog_state = ''; FLUSH LOGS; --source include/show_binary_logs.inc SET GLOBAL gtid_binlog_state = '0-1-10,1-2-20,0-3-30'; --source include/show_binary_logs.inc --let $binlog_file= master-bin.000001 --let $binlog_start= 4 --source include/show_binlog_events.inc SELECT @@GLOBAL.gtid_binlog_pos; SELECT @@GLOBAL.gtid_binlog_state; --error ER_BINLOG_MUST_BE_EMPTY SET GLOBAL gtid_binlog_state = @old_state; RESET MASTER; SET GLOBAL gtid_binlog_state = @old_state; # Check that slave can reconnect again, despite the RESET MASTER, as we # restored the state. CREATE TABLE t1 (a INT PRIMARY KEY); SET gtid_seq_no=100; INSERT INTO t1 VALUES (1); --let $master_pos= `SELECT @@GLOBAL.gtid_binlog_pos` --connection server_2 --source include/start_slave.inc # We cannot just use sync_with_master as we've done RESET MASTER, so # slave old-style position is wrong. # So sync on gtid position instead. --let $wait_condition= SELECT @@GLOBAL.gtid_binlog_pos = '$master_pos' --source include/wait_condition.inc SELECT * FROM t1; # Check that the IO gtid position in SHOW SLAVE STATUS is also correct. --let $status_items= Gtid_IO_Pos --source include/show_slave_status.inc --connection server_1 DROP TABLE t1; --source include/rpl_end.inc