mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-04 04:46:15 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			373 lines
		
	
	
	
		
			9.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			373 lines
		
	
	
	
		
			9.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
if (`SELECT $PS_PROTOCOL + $CURSOR_PROTOCOL > 0`)
 | 
						|
{
 | 
						|
   --skip Test temporarily disabled for ps-protocol and cursor-protocol
 | 
						|
}
 | 
						|
--source include/no_valgrind_without_big.inc
 | 
						|
--let $rpl_topology=1->2
 | 
						|
--source include/rpl_init.inc
 | 
						|
--source include/have_innodb.inc
 | 
						|
 | 
						|
--echo *** Test normal shutdown/restart of slave server configured as a GTID slave. ***
 | 
						|
 | 
						|
--connection server_1
 | 
						|
CREATE TABLE t1 (a INT PRIMARY KEY);
 | 
						|
INSERT INTO t1 VALUES (1);
 | 
						|
--save_master_pos
 | 
						|
 | 
						|
--connection server_2
 | 
						|
--sync_with_master
 | 
						|
--source include/stop_slave.inc
 | 
						|
 | 
						|
--let $status_items= Master_Log_File,Using_Gtid
 | 
						|
--source include/show_slave_status.inc
 | 
						|
 | 
						|
 | 
						|
# Now try to restart the slave mysqld server without starting the slave first
 | 
						|
# threads after the CHANGE MASTER.
 | 
						|
# When the slave restarts, it should reconnect using GTID.
 | 
						|
# We test that it really uses GTID by purging on the master the
 | 
						|
# old binlog the slave would need if connecting with old style
 | 
						|
# file name/offset.
 | 
						|
 | 
						|
--write_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
 | 
						|
wait
 | 
						|
EOF
 | 
						|
FLUSH LOGS;
 | 
						|
--shutdown_server
 | 
						|
--source include/wait_until_disconnected.inc
 | 
						|
 | 
						|
--connection server_1
 | 
						|
FLUSH LOGS;
 | 
						|
--let $purge_binlogs_to=master-bin.000002
 | 
						|
--source include/wait_for_purge.inc
 | 
						|
--source include/show_binary_logs.inc
 | 
						|
INSERT INTO t1 VALUES (2);
 | 
						|
FLUSH LOGS;
 | 
						|
INSERT INTO t1 VALUES (3);
 | 
						|
--source include/save_master_gtid.inc
 | 
						|
--source include/show_binary_logs.inc
 | 
						|
 | 
						|
# Let the slave mysqld server start again.
 | 
						|
--append_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
 | 
						|
restart: --skip-slave-start=0
 | 
						|
EOF
 | 
						|
 | 
						|
--connection server_2
 | 
						|
--enable_reconnect
 | 
						|
--source include/wait_until_connected_again.inc
 | 
						|
 | 
						|
--source include/sync_with_master_gtid.inc
 | 
						|
SELECT * FROM t1 ORDER BY a;
 | 
						|
 | 
						|
 | 
						|
--echo *** Test normal shutdown/restart of master server, check binlog state is preserved. ***
 | 
						|
 | 
						|
--connection server_1
 | 
						|
SET SESSION gtid_domain_id= 1;
 | 
						|
INSERT INTO t1 VALUES (4);
 | 
						|
--replace_column 2 # 4 # 5 #
 | 
						|
SHOW BINLOG EVENTS IN 'master-bin.000003' LIMIT 1,1;
 | 
						|
FLUSH LOGS;
 | 
						|
--replace_column 2 # 4 # 5 # 6 #
 | 
						|
SHOW BINLOG EVENTS IN 'master-bin.000004' LIMIT 1,1;
 | 
						|
 | 
						|
--write_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
 | 
						|
wait
 | 
						|
EOF
 | 
						|
--shutdown_server
 | 
						|
--source include/wait_until_disconnected.inc
 | 
						|
 | 
						|
--append_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
 | 
						|
restart
 | 
						|
EOF
 | 
						|
 | 
						|
--connection default
 | 
						|
--enable_reconnect
 | 
						|
--source include/wait_until_connected_again.inc
 | 
						|
--connection server_1
 | 
						|
--enable_reconnect
 | 
						|
--source include/wait_until_connected_again.inc
 | 
						|
 | 
						|
--replace_column 2 # 4 # 5 # 6 #
 | 
						|
SHOW BINLOG EVENTS IN 'master-bin.000005' LIMIT 1,1;
 | 
						|
--source include/show_binary_logs.inc
 | 
						|
 | 
						|
INSERT INTO t1 VALUES(5);
 | 
						|
--source include/save_master_gtid.inc
 | 
						|
 | 
						|
--connection server_2
 | 
						|
--source include/sync_with_master_gtid.inc
 | 
						|
FLUSH NO_WRITE_TO_BINLOG TABLES;
 | 
						|
SELECT * FROM t1 ORDER BY a;
 | 
						|
 | 
						|
--echo *** Test that @@gtid_slave_pos and @@gtid_current_pos are correctly loaded even if slave threads have not started. ***
 | 
						|
--let $slave_pos1= `SELECT @@GLOBAL.gtid_slave_pos`
 | 
						|
--let $current_pos1= `SELECT @@GLOBAL.gtid_current_pos`
 | 
						|
 | 
						|
--write_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
 | 
						|
wait
 | 
						|
EOF
 | 
						|
--shutdown_server
 | 
						|
--source include/wait_until_disconnected.inc
 | 
						|
 | 
						|
--append_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
 | 
						|
restart: --skip-slave-start=1 --skip-log-bin
 | 
						|
EOF
 | 
						|
--enable_reconnect
 | 
						|
--source include/wait_until_connected_again.inc
 | 
						|
--disable_query_log
 | 
						|
eval SET @slave_pos1= "$slave_pos1";
 | 
						|
eval SET @current_pos1= "$current_pos1";
 | 
						|
--enable_query_log
 | 
						|
SET @slave_pos2= @@GLOBAL.gtid_slave_pos;
 | 
						|
SET @current_pos2= @@GLOBAL.gtid_current_pos;
 | 
						|
SELECT IF(@slave_pos1=@slave_pos2, "OK", CONCAT(@slave_pos1, " != ", @slave_pos2));
 | 
						|
SELECT IF(@current_pos1=@current_pos2, "OK", CONCAT(@current_pos1, " != ", @current_pos2));
 | 
						|
 | 
						|
--connection server_1
 | 
						|
INSERT INTO t1 VALUES (6);
 | 
						|
--save_master_pos
 | 
						|
 | 
						|
--connection server_2
 | 
						|
--source include/start_slave.inc
 | 
						|
--sync_with_master
 | 
						|
SELECT * FROM t1 ORDER BY a;
 | 
						|
 | 
						|
 | 
						|
--echo *** MDEV-4490: Old-style master position points at the last GTID event after slave restart ***
 | 
						|
 | 
						|
--connection server_1
 | 
						|
INSERT INTO t1 VALUES (7);
 | 
						|
--save_master_pos
 | 
						|
 | 
						|
--connection server_2
 | 
						|
--sync_with_master
 | 
						|
FLUSH NO_WRITE_TO_BINLOG TABLES;
 | 
						|
SELECT * FROM t1 ORDER BY a;
 | 
						|
 | 
						|
# Now we restart the slave server. When it restarts, there is nothing new
 | 
						|
# to replicate. Check that the position is nevertheless updated and
 | 
						|
# MASTER_POS_WAIT() works correctly and detects that we are up-to-date.
 | 
						|
 | 
						|
--write_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
 | 
						|
wait
 | 
						|
EOF
 | 
						|
--shutdown_server
 | 
						|
--source include/wait_until_disconnected.inc
 | 
						|
 | 
						|
--append_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
 | 
						|
restart: --skip-slave-start=0
 | 
						|
EOF
 | 
						|
--enable_reconnect
 | 
						|
--source include/wait_until_connected_again.inc
 | 
						|
 | 
						|
--source include/wait_for_slave_to_start.inc
 | 
						|
 | 
						|
--connection server_1
 | 
						|
--save_master_pos
 | 
						|
 | 
						|
--connection server_2
 | 
						|
--sync_with_master
 | 
						|
SELECT * FROM t1 ORDER BY a;
 | 
						|
 | 
						|
 | 
						|
--echo *** MDEV-4486: Allow to start old-style replication even if mysql.gtid_slave_pos is unavailable
 | 
						|
 | 
						|
# In GTID mode, the old-style replication position is also updated. But during
 | 
						|
# GTID connect, the old-style position is not known until receiving the fake
 | 
						|
# GTID list event, which contains the required position value. If we happened
 | 
						|
# to stop the slave above before this fake GTID list event, the test could fail
 | 
						|
# with duplicate key errors due to switching to non-GTID mode at a wrong
 | 
						|
# position too far back in the binlog.
 | 
						|
#
 | 
						|
# Work-around this by injecting an extra dummy event and syncing the slave to
 | 
						|
# it, ensuring the old-style position will be updated.
 | 
						|
#
 | 
						|
# This work-around could be removed after MDEV-33996 is fixed.
 | 
						|
--connection server_1
 | 
						|
INSERT INTO t1 VALUES (8);
 | 
						|
DELETE FROM t1 WHERE a=8;
 | 
						|
--save_master_pos
 | 
						|
--connection server_2
 | 
						|
--sync_with_master
 | 
						|
 | 
						|
--connection server_2
 | 
						|
--source include/stop_slave.inc
 | 
						|
CHANGE MASTER TO master_use_gtid= no;
 | 
						|
--source include/start_slave.inc
 | 
						|
 | 
						|
--connection server_1
 | 
						|
INSERT INTO t1 VALUES (8);
 | 
						|
--save_master_pos
 | 
						|
 | 
						|
--connection server_2
 | 
						|
--sync_with_master
 | 
						|
FLUSH NO_WRITE_TO_BINLOG TABLES;
 | 
						|
SELECT * FROM t1 ORDER BY a;
 | 
						|
--source include/stop_slave.inc
 | 
						|
 | 
						|
SET sql_log_bin= 0;
 | 
						|
ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB;
 | 
						|
SET sql_log_bin= 1;
 | 
						|
 | 
						|
--write_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
 | 
						|
wait
 | 
						|
EOF
 | 
						|
--shutdown_server
 | 
						|
--source include/wait_until_disconnected.inc
 | 
						|
 | 
						|
--append_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
 | 
						|
restart: --skip-slave-start=1 --skip-innodb
 | 
						|
EOF
 | 
						|
--enable_reconnect
 | 
						|
--source include/wait_until_connected_again.inc
 | 
						|
 | 
						|
--error ER_UNKNOWN_STORAGE_ENGINE
 | 
						|
SELECT * FROM mysql.gtid_slave_pos;
 | 
						|
SET sql_log_bin=0;
 | 
						|
call mtr.add_suppression("Failed to load slave replication state from table");
 | 
						|
call mtr.add_suppression("Unable to load replication GTID slave state");
 | 
						|
SET sql_log_bin=1;
 | 
						|
--let rpl_allow_error= 1
 | 
						|
--source include/start_slave.inc
 | 
						|
--connection server_1
 | 
						|
INSERT INTO t1 VALUES (9);
 | 
						|
--save_master_pos
 | 
						|
 | 
						|
--connection server_2
 | 
						|
--sync_with_master
 | 
						|
FLUSH NO_WRITE_TO_BINLOG TABLES;
 | 
						|
SELECT * FROM t1 ORDER BY a;
 | 
						|
 | 
						|
# Put things back as they were.
 | 
						|
--write_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
 | 
						|
wait
 | 
						|
EOF
 | 
						|
--shutdown_server
 | 
						|
--source include/wait_until_disconnected.inc
 | 
						|
 | 
						|
--append_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
 | 
						|
restart:  
 | 
						|
EOF
 | 
						|
--enable_reconnect
 | 
						|
--source include/wait_until_connected_again.inc
 | 
						|
SET sql_log_bin= 0;
 | 
						|
ALTER TABLE mysql.gtid_slave_pos ENGINE=Aria;
 | 
						|
SET sql_log_bin= 1;
 | 
						|
# Do a second restart to get the mysql.gtid_slave_pos table loaded with
 | 
						|
# the right engine.
 | 
						|
--write_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
 | 
						|
wait
 | 
						|
EOF
 | 
						|
--shutdown_server
 | 
						|
--source include/wait_until_disconnected.inc
 | 
						|
 | 
						|
--append_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
 | 
						|
restart:  
 | 
						|
EOF
 | 
						|
--enable_reconnect
 | 
						|
--source include/wait_until_connected_again.inc
 | 
						|
 | 
						|
--source include/start_slave.inc
 | 
						|
 | 
						|
--connection server_1
 | 
						|
INSERT INTO t1 VALUES (10);
 | 
						|
--save_master_pos
 | 
						|
 | 
						|
--connection server_2
 | 
						|
--sync_with_master
 | 
						|
--source include/stop_slave.inc
 | 
						|
CHANGE MASTER TO master_use_gtid= slave_pos;
 | 
						|
--source include/start_slave.inc
 | 
						|
 | 
						|
--echo *** MDEV-4692: mysql.gtid_slave_pos accumulates values for a domain ***
 | 
						|
SELECT domain_id, COUNT(*) FROM mysql.gtid_slave_pos GROUP BY domain_id;
 | 
						|
 | 
						|
--connection server_1
 | 
						|
INSERT INTO t1 VALUES (11);
 | 
						|
--save_master_pos
 | 
						|
 | 
						|
--connection server_2
 | 
						|
--sync_with_master
 | 
						|
FLUSH NO_WRITE_TO_BINLOG TABLES;
 | 
						|
SELECT domain_id, COUNT(*) FROM mysql.gtid_slave_pos GROUP BY domain_id;
 | 
						|
 | 
						|
--write_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
 | 
						|
wait
 | 
						|
EOF
 | 
						|
--shutdown_server
 | 
						|
--source include/wait_until_disconnected.inc
 | 
						|
 | 
						|
--append_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
 | 
						|
restart:  
 | 
						|
EOF
 | 
						|
--enable_reconnect
 | 
						|
--source include/wait_until_connected_again.inc
 | 
						|
--source include/start_slave.inc
 | 
						|
 | 
						|
--connection server_1
 | 
						|
INSERT INTO t1 VALUES (12);
 | 
						|
INSERT INTO t1 VALUES (13);
 | 
						|
--save_master_pos
 | 
						|
 | 
						|
--connection server_2
 | 
						|
--sync_with_master
 | 
						|
FLUSH NO_WRITE_TO_BINLOG TABLES;
 | 
						|
SELECT domain_id, COUNT(*) FROM mysql.gtid_slave_pos GROUP BY domain_id;
 | 
						|
 | 
						|
 | 
						|
--echo *** MDEV-4650: show variables; ERROR 1946 (HY000): Failed to load replication slave GTID position ***
 | 
						|
 | 
						|
--connection server_2
 | 
						|
SET sql_log_bin=0;
 | 
						|
--let $old_pos= `SELECT @@GLOBAL.gtid_slave_pos`
 | 
						|
RENAME TABLE mysql.gtid_slave_pos TO mysql.old_gtid_slave_pos;
 | 
						|
SET sql_log_bin=1;
 | 
						|
 | 
						|
--write_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
 | 
						|
wait
 | 
						|
EOF
 | 
						|
--shutdown_server
 | 
						|
--source include/wait_until_disconnected.inc
 | 
						|
 | 
						|
# Let the slave mysqld server start again.
 | 
						|
--append_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
 | 
						|
restart
 | 
						|
EOF
 | 
						|
 | 
						|
--enable_reconnect
 | 
						|
--source include/wait_until_connected_again.inc
 | 
						|
 | 
						|
--disable_result_log
 | 
						|
SHOW VARIABLES;
 | 
						|
--enable_result_log
 | 
						|
SHOW VARIABLES LIKE 'gtid_slave_pos';
 | 
						|
--error ER_CANNOT_LOAD_SLAVE_GTID_STATE,ER_NO_SUCH_TABLE
 | 
						|
SET GLOBAL gtid_slave_pos = '0-1-2';
 | 
						|
SHOW WARNINGS;
 | 
						|
 | 
						|
# Restore things.
 | 
						|
 | 
						|
SET sql_log_bin=0;
 | 
						|
RENAME TABLE mysql.old_gtid_slave_pos TO mysql.gtid_slave_pos;
 | 
						|
CALL mtr.add_suppression("Failed to load slave replication state from table mysql.gtid_slave_pos");
 | 
						|
SET sql_log_bin=1;
 | 
						|
 | 
						|
SHOW VARIABLES LIKE 'gtid_slave_pos';
 | 
						|
SET GLOBAL gtid_slave_pos = '0-1-2';
 | 
						|
SHOW VARIABLES LIKE 'gtid_slave_pos';
 | 
						|
 | 
						|
# Don't let .result file depend on old state of gtid_slave_pos
 | 
						|
--disable_query_log
 | 
						|
--disable_result_log
 | 
						|
eval SET GLOBAL gtid_slave_pos = '$old_pos';
 | 
						|
--enable_query_log
 | 
						|
--enable_result_log
 | 
						|
 | 
						|
--source include/start_slave.inc
 | 
						|
 | 
						|
 | 
						|
--connection server_1
 | 
						|
DROP TABLE t1;
 | 
						|
 | 
						|
--source include/rpl_end.inc
 |