mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
MDEV-26: Global transaction ID. First alpha release.
Merge of 10.0-mdev26 feature tree into 10.0-base. Global transaction ID is prepended to each event group in the binlog. Slave connect can request to start from GTID position instead of specifying file name/offset of master binlog. This facilitates easy switch to a new master. Slave GTID state is stored in a table mysql.rpl_slave_state, which can be InnoDB to get crash-safe slave state. GTID includes a replication domain ID, allowing to keep track of distinct positions for each of multiple masters.
This commit is contained in:
174
mysql-test/suite/rpl/t/rpl_gtid_errorhandling.test
Normal file
174
mysql-test/suite/rpl/t/rpl_gtid_errorhandling.test
Normal file
@ -0,0 +1,174 @@
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_debug.inc
|
||||
--source include/master-slave.inc
|
||||
|
||||
--echo *** Test that we check against incorrect table definition for mysql.rpl_slave_state ***
|
||||
--connection master
|
||||
CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB;
|
||||
--sync_slave_with_master
|
||||
|
||||
--connection slave
|
||||
--source include/stop_slave.inc
|
||||
ALTER TABLE mysql.rpl_slave_state CHANGE seq_no seq_no VARCHAR(20);
|
||||
START SLAVE;
|
||||
|
||||
--connection master
|
||||
INSERT INTO t1 VALUES (1);
|
||||
|
||||
--connection slave
|
||||
CALL mtr.add_suppression("Slave: Failed to open mysql.rpl_slave_state");
|
||||
--let $slave_sql_errno=1942
|
||||
--source include/wait_for_slave_sql_error.inc
|
||||
|
||||
--source include/stop_slave.inc
|
||||
ALTER TABLE mysql.rpl_slave_state CHANGE seq_no seq_no BIGINT UNSIGNED NOT NULL;
|
||||
ALTER TABLE mysql.rpl_slave_state DROP PRIMARY KEY;
|
||||
ALTER TABLE mysql.rpl_slave_state ADD PRIMARY KEY (sub_id, domain_id);
|
||||
START SLAVE;
|
||||
--let $slave_sql_errno=1942
|
||||
--source include/wait_for_slave_sql_error.inc
|
||||
|
||||
--source include/stop_slave.inc
|
||||
ALTER TABLE mysql.rpl_slave_state DROP PRIMARY KEY;
|
||||
START SLAVE;
|
||||
--let $slave_sql_errno=1942
|
||||
--source include/wait_for_slave_sql_error.inc
|
||||
|
||||
--source include/stop_slave.inc
|
||||
ALTER TABLE mysql.rpl_slave_state ADD PRIMARY KEY (sub_id);
|
||||
START SLAVE;
|
||||
--let $slave_sql_errno=1942
|
||||
--source include/wait_for_slave_sql_error.inc
|
||||
|
||||
--source include/stop_slave.inc
|
||||
ALTER TABLE mysql.rpl_slave_state DROP PRIMARY KEY;
|
||||
ALTER TABLE mysql.rpl_slave_state ADD PRIMARY KEY (domain_id, sub_id);
|
||||
--source include/start_slave.inc
|
||||
|
||||
--connection master
|
||||
--sync_slave_with_master
|
||||
|
||||
--connection slave
|
||||
SELECT * FROM t1;
|
||||
|
||||
|
||||
--echo *** Test requesting an explicit GTID position that conflicts with newer GTIDs of our own in the binlog. ***
|
||||
--connection slave
|
||||
--source include/stop_slave.inc
|
||||
|
||||
--connection master
|
||||
RESET MASTER;
|
||||
# This insert will be GTID 0-1-1
|
||||
INSERT INTO t1 VALUES (2);
|
||||
# And this will be GTID 0-1-2
|
||||
INSERT INTO t1 VALUES (4);
|
||||
|
||||
--connection slave
|
||||
SET sql_log_bin = 0;
|
||||
INSERT INTO t1 VALUES (2);
|
||||
SET sql_log_bin = 1;
|
||||
INSERT INTO t1 VALUES (3);
|
||||
|
||||
CHANGE MASTER TO master_use_gtid=1;
|
||||
--error ER_MASTER_GTID_POS_CONFLICTS_WITH_BINLOG
|
||||
SET GLOBAL gtid_pos = "0-1-1";
|
||||
--error ER_MASTER_GTID_POS_MISSING_DOMAIN
|
||||
SET GLOBAL gtid_pos = "";
|
||||
RESET MASTER;
|
||||
SET GLOBAL gtid_pos = "0-1-1";
|
||||
|
||||
START SLAVE;
|
||||
--let $wait_condition= SELECT COUNT(*) = 4 FROM t1
|
||||
--source include/wait_condition.inc
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
|
||||
|
||||
--echo *** Test slave requesting a GTID that is not present in the master's binlog ***
|
||||
--source include/stop_slave.inc
|
||||
SET GLOBAL gtid_pos = "0-1-3";
|
||||
START SLAVE;
|
||||
|
||||
SET sql_log_bin=0;
|
||||
CALL mtr.add_suppression("Got fatal error .* from master when reading data from binary log: 'Error: connecting slave requested to start from GTID .*, which is not in the master's binlog'");
|
||||
SET sql_log_bin=1;
|
||||
--let $slave_io_errno= 1236
|
||||
--source include/wait_for_slave_io_error.inc
|
||||
--let $status_items= Slave_IO_State, Last_IO_Errno, Last_IO_Error, Using_Gtid
|
||||
--source include/show_slave_status.inc
|
||||
|
||||
--let $rpl_only_running_threads= 1
|
||||
--source include/stop_slave.inc
|
||||
SET GLOBAL gtid_pos = "0-1-2";
|
||||
START SLAVE;
|
||||
--source include/wait_for_slave_to_start.inc
|
||||
|
||||
--connection master
|
||||
INSERT INTO t1 VALUES (5);
|
||||
|
||||
--connection slave
|
||||
--let $wait_condition= SELECT COUNT(*) = 5 FROM t1
|
||||
--source include/wait_condition.inc
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
|
||||
|
||||
--echo *** MDEV-4278: Slave does not detect that master is not GTID-aware ***
|
||||
|
||||
--connection slave
|
||||
--source include/stop_slave.inc
|
||||
|
||||
--connection master
|
||||
SET @old_dbug= @@global.DEBUG_DBUG;
|
||||
SET GLOBAL debug_dbug="+d,simulate_non_gtid_aware_master";
|
||||
|
||||
--connection slave
|
||||
START SLAVE;
|
||||
--let $slave_io_errno= 1233
|
||||
--source include/wait_for_slave_io_error.inc
|
||||
|
||||
--connection master
|
||||
SET GLOBAL debug_dbug= @old_dbug;
|
||||
INSERT INTO t1 VALUES (6);
|
||||
--save_master_pos
|
||||
|
||||
--connection slave
|
||||
START SLAVE;
|
||||
--sync_with_master
|
||||
SET sql_log_bin=0;
|
||||
CALL mtr.add_suppression("The slave I/O thread stops because master does not support MariaDB global transaction id");
|
||||
SET sql_log_bin=1;
|
||||
|
||||
|
||||
--echo *** Test error during record_gtid() (non-xid cases) ***
|
||||
|
||||
--connection slave
|
||||
--source include/stop_slave.inc
|
||||
|
||||
--connection master
|
||||
CREATE TABLE t2 (a INT) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (1);
|
||||
--save_master_pos
|
||||
|
||||
--connection slave
|
||||
SET @old_dbug= @@global.DEBUG_DBUG;
|
||||
SET GLOBAL debug_dbug="+d,gtid_inject_record_gtid";
|
||||
|
||||
START SLAVE;
|
||||
--let $slave_sql_errno= 1942
|
||||
--source include/wait_for_slave_sql_error.inc
|
||||
|
||||
SET GLOBAL debug_dbug= @old_dbug;
|
||||
|
||||
START SLAVE SQL_THREAD;
|
||||
--sync_with_master
|
||||
|
||||
SELECT * FROM t2;
|
||||
SET sql_log_bin=0;
|
||||
CALL mtr.add_suppression("Slave: Could not update replication slave gtid state");
|
||||
SET sql_log_bin=1;
|
||||
|
||||
|
||||
--connection master
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
|
||||
--source include/rpl_end.inc
|
Reference in New Issue
Block a user