mirror of
https://github.com/MariaDB/server.git
synced 2026-05-15 19:37:16 +02:00
The bug was that if mysql.slave_gtid_pos was missing, operations on variables gtid_slave_pos, gtid_binlog_pos, and gtid_current_pos would fail, and continue to fail even after the table was fixed, until server restart. Now setting the variables retry loading the table, succeeding if it has been restored. And querying the variables when the table is not there acts as if the table was there and was empty. Also, attempt to fix a race in the rpl.rpl_gtid_basic test case.
210 lines
6.9 KiB
Text
210 lines
6.9 KiB
Text
--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_FILE> $binlog_pos <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_FILE> $binlog_pos <BINLOG_POS> $gtid_pos_server_1 <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_FILE> $binlog_pos <BINLOG_POS> $gtid_pos_server_1 <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);
|
|
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;
|
|
|
|
--connection server_1
|
|
DROP TABLE t1;
|
|
|
|
|
|
--source include/rpl_end.inc
|