summaryrefslogtreecommitdiffstats
path: root/mysql-test/suite/rpl/t/rpl_gtid_startpos.test
diff options
context:
space:
mode:
Diffstat (limited to 'mysql-test/suite/rpl/t/rpl_gtid_startpos.test')
-rw-r--r--mysql-test/suite/rpl/t/rpl_gtid_startpos.test360
1 files changed, 360 insertions, 0 deletions
diff --git a/mysql-test/suite/rpl/t/rpl_gtid_startpos.test b/mysql-test/suite/rpl/t/rpl_gtid_startpos.test
new file mode 100644
index 00000000..c7bcc1bb
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_gtid_startpos.test
@@ -0,0 +1,360 @@
+--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