mirror of
https://github.com/MariaDB/server.git
synced 2025-05-07 04:01:59 +03:00
The sql_slave_skip_counter is important to be able to recover replication from certain errors. Often, an appropriate solution is to set sql_slave_skip_counter to skip over a problem event. But setting sql_slave_skip_counter produced an error in GTID mode, with a suggestion to instead set @@gtid_slave_pos to point past the problem event. This however is not always possible; for example, in case of an INCIDENT event, that event does not have any GTID to assign to @@gtid_slave_pos. With this patch, sql_slave_skip_counter now works in GTID mode the same was as in non-GTID mode. When set, that many initial events are skipped when the SQL thread starts, plus as many extra events are needed to completely skip any partially skipped event group. The GTID position is updated to point past the skipped event(s).
77 lines
2.1 KiB
Plaintext
77 lines
2.1 KiB
Plaintext
--source include/have_debug.inc
|
|
--source include/master-slave.inc
|
|
|
|
--echo *** Test MDEV-6120, output of current GTID when a replication error is logged to the errorlog ***
|
|
--connection master
|
|
CREATE TABLE t1(a INT PRIMARY KEY);
|
|
--sync_slave_with_master
|
|
|
|
--connection slave
|
|
--source include/stop_slave.inc
|
|
CHANGE MASTER TO master_use_gtid=slave_pos;
|
|
|
|
--connection master
|
|
INSERT INTO t1 VALUES (1);
|
|
SET gtid_seq_no=100;
|
|
INSERT INTO t1 VALUES (2);
|
|
INSERT INTO t1 VALUES (3);
|
|
INSERT INTO t1 VALUES (4);
|
|
--save_master_pos
|
|
|
|
--connection slave
|
|
SET sql_log_bin=0;
|
|
INSERT INTO t1 VALUES (2);
|
|
SET sql_log_bin=1;
|
|
|
|
START SLAVE;
|
|
--let $slave_sql_errno=1062
|
|
--source include/wait_for_slave_sql_error.inc
|
|
|
|
--source include/stop_slave.inc
|
|
# Skip the problem event from the master.
|
|
SET GLOBAL gtid_slave_pos= "0-1-100";
|
|
--source include/start_slave.inc
|
|
--sync_with_master
|
|
|
|
SELECT * FROM t1 ORDER BY a;
|
|
|
|
--connection master
|
|
|
|
SET @dbug_save= @@debug_dbug;
|
|
SET debug_dbug= '+d,incident_database_resync_on_replace';
|
|
REPLACE INTO t1 VALUES (5);
|
|
SET debug_dbug= @dbug_save;
|
|
--save_master_pos
|
|
|
|
--connection slave
|
|
--let $slave_sql_errno=1590
|
|
--source include/wait_for_slave_sql_error.inc
|
|
--source include/stop_slave.inc
|
|
SET sql_slave_skip_counter=1;
|
|
--source include/start_slave.inc
|
|
--sync_with_master
|
|
|
|
SELECT * FROM t1 ORDER BY a;
|
|
|
|
|
|
# Check error log for correct messages.
|
|
let $log_error_= `SELECT @@GLOBAL.log_error`;
|
|
if(!$log_error_)
|
|
{
|
|
# MySQL Server on windows is started with --console and thus
|
|
# does not know the location of its .err log, use default location
|
|
let $log_error_ = $MYSQLTEST_VARDIR/log/mysqld.2.err;
|
|
}
|
|
--let SEARCH_FILE=$log_error_
|
|
--let SEARCH_RANGE=-50000
|
|
--let SEARCH_PATTERN=Slave SQL: Error 'Duplicate entry .* on query\. .*Query: '.*', Gtid 0-1-100, Internal MariaDB error code:|Slave SQL: Could not execute Write_rows.*table test.t1; Duplicate entry.*, Gtid 0-1-100, Internal MariaDB error
|
|
--source include/search_pattern_in_file.inc
|
|
--let SEARCH_PATTERN=Slave SQL: The incident LOST_EVENTS occured on the master\. Message: <none>, Internal MariaDB error code: 1590
|
|
--source include/search_pattern_in_file.inc
|
|
|
|
|
|
--connection master
|
|
DROP TABLE t1;
|
|
|
|
--source include/rpl_end.inc
|