mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 18:41:56 +01:00
f0deff867a
The main bug here was the following situation: Suppose we set up a completely new master2 as an extra multi-master to an existing slave that already has a different master1 for domain_id=0. When the slave tries to connect to master2, master2 will not have anything that slave requests in domain_id=0, but that is fine as master2 is supposedly meant to serve eg. domain_id=1. (This is MDEV-4485). But suppose that master2 then actually starts sending events from domain_id=0. In this case, the fix for MDEV-4485 was incomplete, and the code would fail to give the error that the position requested by the slave in domain_id=0 was missing from the binlogs of master2. This could lead to lost events or completely wrong replication. The patch for this bug fixes this issue. In addition, it cleans up the code a bit, getting rid of the fake_gtid_hash in the code. And the error message when slave and master have diverged due to alternate future is clarified, as requested in the bug description.
118 lines
3.3 KiB
Text
118 lines
3.3 KiB
Text
--let $rpl_topology=1->2
|
|
--source include/rpl_init.inc
|
|
|
|
--connection server_2
|
|
--source include/stop_slave.inc
|
|
SET @slave_old_strict= @@GLOBAL.gtid_strict_mode;
|
|
SET GLOBAL gtid_strict_mode= 1;
|
|
CHANGE MASTER TO master_use_gtid=slave_pos;
|
|
--source include/start_slave.inc
|
|
|
|
--connection server_1
|
|
SET @master_old_strict= @@GLOBAL.gtid_strict_mode;
|
|
SET GLOBAL gtid_strict_mode= 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 ORDER BY a;
|
|
|
|
--source include/stop_slave.inc
|
|
|
|
--connection server_1
|
|
INSERT INTO t1 VALUES (2);
|
|
INSERT INTO t1 VALUES (3);
|
|
--let $old_gtid_pos= `SELECT @@GLOBAL.gtid_current_pos`
|
|
RESET MASTER;
|
|
--replace_result $old_gtid_pos OLD_GTID_POS
|
|
eval SET GLOBAL gtid_slave_pos= '$old_gtid_pos';
|
|
|
|
--connection server_2
|
|
--source include/start_slave.inc
|
|
|
|
--connection server_1
|
|
INSERT INTO t1 VALUES (4);
|
|
--save_master_pos
|
|
|
|
--connection server_2
|
|
SET sql_log_bin= 0;
|
|
CALL mtr.add_suppression("The binlog on the master is missing the GTID");
|
|
SET sql_log_bin= 1;
|
|
--let $slave_io_errno=1236
|
|
--source include/wait_for_slave_io_error.inc
|
|
|
|
STOP SLAVE SQL_THREAD;
|
|
--replace_result $old_gtid_pos OLD_GTID_POS
|
|
eval SET GLOBAL gtid_slave_pos= '$old_gtid_pos';
|
|
|
|
--source include/start_slave.inc
|
|
--sync_with_master
|
|
SELECT * FROM t1 ORDER BY a;
|
|
|
|
--source include/stop_slave.inc
|
|
RESET SLAVE ALL;
|
|
RESET MASTER;
|
|
SET GLOBAL gtid_slave_pos= '0-2-10';
|
|
|
|
--connection server_1
|
|
--replace_result $SERVER_MYPORT_2 SERVER_MYPORT_2
|
|
eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $SERVER_MYPORT_2,
|
|
master_user= 'root', master_use_gtid=CURRENT_POS;
|
|
START SLAVE;
|
|
|
|
--connection server_2
|
|
INSERT INTO t1 VALUES (11);
|
|
--save_master_pos
|
|
|
|
--connection server_1
|
|
SET sql_log_bin= 0;
|
|
CALL mtr.add_suppression("which is not in the master's binlog. Since the master's binlog contains GTIDs with higher sequence numbers, it probably means that the slave has diverged");
|
|
SET sql_log_bin= 1;
|
|
--let $slave_io_errno=1236
|
|
--source include/wait_for_slave_io_error.inc
|
|
|
|
--connection server_1
|
|
STOP SLAVE SQL_THREAD;
|
|
SET GLOBAL gtid_slave_pos= '0-2-10';
|
|
SET GLOBAL gtid_strict_mode= 0;
|
|
--source include/start_slave.inc
|
|
--sync_with_master
|
|
SELECT * FROM t1 ORDER BY a;
|
|
|
|
--source include/stop_slave.inc
|
|
RESET SLAVE ALL;
|
|
--let $old_gtid_pos= `SELECT @@GLOBAL.gtid_current_pos`
|
|
INSERT INTO t1 VALUES (12);
|
|
--save_master_pos
|
|
|
|
--connection server_2
|
|
INSERT INTO t1 VALUES (22);
|
|
--replace_result $SERVER_MYPORT_1 SERVER_MYPORT_1
|
|
eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $SERVER_MYPORT_1,
|
|
master_user= 'root', master_use_gtid=CURRENT_POS;
|
|
START SLAVE;
|
|
SET sql_log_bin= 0;
|
|
CALL mtr.add_suppression("which is not in the master's binlog. Since the master's binlog contains GTIDs with higher sequence numbers, it probably means that the slave has diverged");
|
|
SET sql_log_bin= 1;
|
|
--let $slave_io_errno=1236
|
|
--source include/wait_for_slave_io_error.inc
|
|
STOP SLAVE SQL_THREAD;
|
|
SET GLOBAL gtid_strict_mode= 0;
|
|
CHANGE MASTER TO master_use_gtid=SLAVE_POS;
|
|
--replace_result $old_gtid_pos OLD_GTID_POS
|
|
eval SET GLOBAL gtid_slave_pos= '$old_gtid_pos';
|
|
--source include/start_slave.inc
|
|
--sync_with_master
|
|
SELECT * FROM t1 ORDER BY a;
|
|
|
|
# Clean up.
|
|
--connection server_2
|
|
SET GLOBAL gtid_strict_mode= @slave_old_strict;
|
|
|
|
--connection server_1
|
|
DROP TABLE t1;
|
|
SET GLOBAL gtid_strict_mode= @master_old_strict;
|
|
|
|
--source include/rpl_end.inc
|