--source include/have_innodb.inc --let $rpl_topology=1->2 --source include/rpl_init.inc --echo *** Test connecting with empty GTID state to start from very beginning of binlog *** --connection server_2 --source include/stop_slave.inc RESET MASTER; RESET SLAVE; --connection server_1 RESET MASTER; # Create an empty binlog file, to check that empty binlog state is handled correctly. FLUSH LOGS; CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; --save_master_pos --connection server_2 SET GLOBAL gtid_slave_pos=""; --replace_result $MASTER_MYPORT MASTER_PORT eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $MASTER_MYPORT, MASTER_USE_GTID=SLAVE_POS; --source include/start_slave.inc --sync_with_master SELECT * FROM t1; --connection server_1 INSERT INTO t1 VALUES (1); --save_master_pos --connection server_2 --sync_with_master SELECT * FROM t1; --source include/stop_slave.inc --echo *** Test that master gives error when slave asks for empty gtid pos and binlog files have been purged. *** --connection server_1 FLUSH LOGS; INSERT INTO t1 VALUES (2); --save_master_pos --let $purge_binlogs_to=master-bin.000003 --source include/wait_for_purge.inc --source include/show_binary_logs.inc --connection server_2 SET GLOBAL gtid_slave_pos=""; --replace_result $MASTER_MYPORT MASTER_PORT eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $MASTER_MYPORT, MASTER_USE_GTID=SLAVE_POS; START SLAVE; --let $slave_io_errno= 1236 --source include/wait_for_slave_io_error.inc --source include/stop_slave.inc --replace_result $MASTER_MYPORT MASTER_PORT eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $MASTER_MYPORT, MASTER_LOG_FILE="master-bin.000003", MASTER_LOG_POS=4, MASTER_USE_GTID=NO; --source include/start_slave.inc --sync_with_master SELECT * FROM t1 ORDER BY a; SET sql_log_bin=0; call mtr.add_suppression('Could not find GTID state requested by slave in any binlog files'); SET sql_log_bin=1; --echo *** Test that we give warning when explict @@gtid_slave_pos=xxx that conflicts with what is in our binary log *** --source include/stop_slave.inc --connection server_1 INSERT INTO t1 VALUES(3); --source include/save_master_gtid.inc --connection server_2 SET GLOBAL gtid_slave_pos='0-1-3'; --replace_result $MASTER_MYPORT MASTER_PORT eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $MASTER_MYPORT, MASTER_USE_GTID=SLAVE_POS; --source include/start_slave.inc --source include/sync_with_master_gtid.inc SELECT * FROM t1 ORDER by a; --source include/stop_slave.inc --connection server_1 INSERT INTO t1 VALUES (4); --source include/save_master_gtid.inc --connection server_2 # Now add some local transactions that conflict with the GTID position # being set for @@gtid_slave_pos. INSERT INTO t1 VALUES (10); DELETE FROM t1 WHERE a=10; SET GLOBAL gtid_slave_pos='0-1-4'; # Try again after RESET MASTER to remove the conflicting binlog. RESET MASTER; SET GLOBAL gtid_slave_pos='0-1-4'; START SLAVE; --source include/sync_with_master_gtid.inc SELECT * FROM t1 ORDER by a; --connection server_1 DROP TABLE t1; --save_master_pos --connection server_2 --sync_with_master --echo *** MDEV-4275: I/O thread restart duplicates events in relay log *** --connection server_2 --source include/stop_slave.inc RESET SLAVE ALL; RESET MASTER; --connection server_1 RESET MASTER; --connection server_2 SET GLOBAL gtid_slave_pos=''; --replace_result $MASTER_MYPORT MASTER_PORT eval CHANGE MASTER TO master_host='127.0.0.1', master_port=$MASTER_MYPORT, master_user='root', master_use_gtid=slave_pos; --source include/start_slave.inc --connection server_1 CREATE TABLE t1 (a INT PRIMARY KEY); INSERT INTO t1 VALUES (1); --save_master_pos --connection server_2 --sync_with_master SELECT * FROM t1; --source include/stop_slave_io.inc START SLAVE IO_THREAD; --source include/wait_for_slave_io_to_start.inc --connection server_1 INSERT INTO t1 VALUES (2); --save_master_pos --connection server_2 --sync_with_master SELECT * FROM t1 ORDER BY a; --echo *** MDEV-4329: GTID_SLAVE_POS='' is not checked for conflicts with binlog *** # Test starting the slave completely from scratch, deleting all tables and # replicating from the start of the master's binlog. This requires RESET # MASTER is run on the slave to avoid old junk in the binlog. The bug was # that the code did not catch the error of missing RESET MASTER when an # empty GTID_SLAVE_POS='' was specified. --connection server_2 --source include/stop_slave.inc DROP TABLE t1; RESET SLAVE; SET GLOBAL gtid_slave_pos=""; RESET MASTER; SET GLOBAL gtid_slave_pos=""; --source include/start_slave.inc --sync_with_master SELECT * FROM t1 ORDER BY a; # Same thing, but this time using SQL_LOG_BIN=0 to avoid polluting the # slave binlog. --connection server_2 --source include/stop_slave.inc SET SQL_LOG_BIN=0; DROP TABLE t1; SET SQL_LOG_BIN=1; RESET SLAVE; SET GLOBAL gtid_slave_pos=""; # Ensure that the slave fails because of missing table to be dropped SET @save_slave_ddl_exec_mode=@@global.slave_ddl_exec_mode; SET GLOBAL slave_ddl_exec_mode=STRICT; --source include/start_slave.inc --sync_with_master SELECT * FROM t1 ORDER BY a; --echo *** Test that RESET SLAVE clears the Using_Gtid flag. *** --source include/stop_slave.inc --let $master_use_gtid_option= No --source include/reset_slave.inc --let $status_items= Using_Gtid --source include/show_slave_status.inc # Starting the slave now reverts to old-style position which defaults to # the first non-purged binlog file on the master. # This should give error due to table already existing. START SLAVE; --let $slave_sql_errno= 1050 --source include/wait_for_slave_sql_error.inc # Going back to using GTID should fix things. STOP SLAVE IO_THREAD; CHANGE MASTER TO MASTER_USE_GTID=SLAVE_POS; --source include/start_slave.inc --connection server_1 INSERT INTO t1 VALUES(3); --source include/save_master_gtid.inc --connection server_2 --source include/sync_with_master_gtid.inc SELECT * FROM t1 ORDER BY a; SET SQL_LOG_BIN=0; call mtr.add_suppression("Slave: Table 't1' already exists error.* 1050"); SET SQL_LOG_BIN=1; --echo *** Test reconnecting slave with GTID after purge logs on master. *** --connection server_1 FLUSH LOGS; INSERT INTO t1 VALUES (4); --source include/save_master_gtid.inc --connection server_2 --source include/sync_with_master_gtid.inc --source include/stop_slave.inc --connection server_1 FLUSH LOGS; FLUSH LOGS; --let $purge_binlogs_to=master-bin.000004 --source include/wait_for_purge.inc --source include/show_binary_logs.inc INSERT INTO t1 VALUES (5); --source include/save_master_gtid.inc --connection server_2 --replace_result $MASTER_MYPORT MASTER_PORT eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $MASTER_MYPORT; --source include/start_slave.inc --source include/sync_with_master_gtid.inc SELECT * FROM t1 ORDER BY a; --echo *** Test modifying binlog on slave and the effect on GTID state. *** --connection server_2 --source include/stop_slave.inc RESET MASTER; SET GLOBAL gtid_slave_pos=""; --connection server_1 RESET MASTER; TRUNCATE TABLE t1; INSERT INTO t1 VALUES (10); # Will be GTID 0-1-2 --source include/save_master_gtid.inc --connection server_2 --source include/start_slave.inc --source include/sync_with_master_gtid.inc SELECT * FROM t1; --let $value= query_get_value(SHOW SLAVE STATUS, "Using_Gtid", 1) eval SELECT '$value' AS Using_Gtid; --let $value= query_get_value(SHOW ALL SLAVES STATUS, "Gtid_Slave_Pos", 1) eval SELECT '$value' AS Gtid_Slave_Pos; UPDATE t1 SET a=9 WHERE a=10; UPDATE t1 SET a=10 WHERE a=9; --let $value= query_get_value(SHOW ALL SLAVES STATUS, "Gtid_Slave_Pos", 1) eval SELECT '$value' AS Gtid_Slave_Pos; --source include/stop_slave.inc SET GLOBAL gtid_slave_pos='0-1-2'; RESET MASTER; --let $value= query_get_value(SHOW ALL SLAVES STATUS, "Gtid_Slave_Pos", 1) eval SELECT '$value' AS Gtid_Slave_Pos; SET GLOBAL gtid_slave_pos='0-1-2'; --source include/start_slave.inc --let $value= query_get_value(SHOW ALL SLAVES STATUS, "Gtid_Slave_Pos", 1) eval SELECT '$value' AS Gtid_Slave_Pos; --echo *** MDEV-4483: Slave loses traditional master coordinates immediately on CHANGE MASTER TO MASTER_USE_GTID = 1 *** --connection server_2 --source include/stop_slave.inc DROP TABLE t1; RESET SLAVE ALL; CHANGE MASTER TO MASTER_USE_GTID=NO; RESET MASTER; SET GLOBAL gtid_slave_pos= ""; # Set up old-style replication. The bug was that CHANGE MASTER would clear # out the old-style binlog/relaylog coordinates when it should not. --replace_result $MASTER_MYPORT MASTER_PORT eval CHANGE MASTER TO master_host='127.0.0.1', master_port=$MASTER_MYPORT, master_user='root', master_use_gtid=no, master_log_file="", master_log_pos= 4; --connection server_1 DROP TABLE t1; RESET MASTER; CREATE TABLE t1 (a INT PRIMARY KEY); --save_master_pos --connection server_2 --source include/start_slave.inc --sync_with_master --source include/stop_slave.inc --connection server_1 INSERT INTO t1 VALUES (1); --let $log_file1= query_get_value(SHOW MASTER STATUS, "File", 1) --let $log_pos1= query_get_value(SHOW MASTER STATUS, "Position", 1) INSERT INTO t1 VALUES (2); --let $log_file2= query_get_value(SHOW MASTER STATUS, "File", 1) --let $log_pos2= query_get_value(SHOW MASTER STATUS, "Position", 1) --save_master_pos --connection server_2 # Get the slave to a point where the IO thread has fetched one event ahead # of the SQL thread (we want to test that CHANGE MASTER does not mess with # existing relay logs). --replace_result $log_file1 LOG_FILE1 $log_pos1 LOG_POS1 eval START SLAVE UNTIL master_log_file='$log_file1', master_log_pos=$log_pos1; --source include/wait_for_slave_sql_to_stop.inc SELECT * FROM t1; --let $slave_param= Read_Master_Log_Pos --let $slave_param_value= $log_pos2 --source include/wait_for_slave_param.inc --source include/stop_slave_io.inc # Test that we can change to GTID and back without loosing our # old-style slave position. CHANGE MASTER TO master_use_gtid=slave_pos; # Unknown GTID, so slave will fail to connect. SET GLOBAL gtid_slave_pos="0-42-42"; SET sql_log_bin=0; call mtr.add_suppression("Error: connecting slave requested to start from GTID"); SET sql_log_bin=1; START SLAVE; --let $slave_io_errno= 1236 --source include/wait_for_slave_io_error.inc STOP SLAVE SQL_THREAD; --source include/wait_for_slave_sql_to_stop.inc CHANGE MASTER TO master_use_gtid=no; --source include/start_slave.inc --sync_with_master SELECT * FROM t1 ORDER BY a; # Clean up. --connection server_1 DROP TABLE t1; --connection server_2 set @@global.slave_ddl_exec_mode=@save_slave_ddl_exec_mode; --source include/rpl_end.inc