MDEV-4937: sql_slave_skip_counter does not work with GTID
As a side-effect of purge_relay_logs(), sql_slave_skip_counter was silently ignored in GTID mode. But sql_slave_skip_counter in fact is not a good match with GTID. And it is not really needed either, as users can explicitly set @@gtid_slave_pos to skip specific GTIDs, in a way that matches well how GTID replication works. So with this patch, we give an error on attempts to set sql_slave_skip_counter when using GTID, with a suggestion to use gtid_slave_pos instead, if needed.
This commit is contained in:
parent
f3a6f86ec3
commit
cc7925765e
@ -61,7 +61,13 @@ include/stop_slave.inc
|
|||||||
INSERT INTO t1 VALUES (5, "m1a");
|
INSERT INTO t1 VALUES (5, "m1a");
|
||||||
INSERT INTO t2 VALUES (5, "i1a");
|
INSERT INTO t2 VALUES (5, "i1a");
|
||||||
CHANGE MASTER TO master_host = '127.0.0.1', master_port = MASTER_PORT,
|
CHANGE MASTER TO master_host = '127.0.0.1', master_port = MASTER_PORT,
|
||||||
|
MASTER_USE_GTID=SLAVE_POS;
|
||||||
|
SET GLOBAL sql_slave_skip_counter=1;
|
||||||
|
ERROR HY000: When using GTID, @@sql_slave_skip_counter can not be used. Instead, setting @@gtid_slave_pos explicitly can be used to skip to after a given GTID position.
|
||||||
|
CHANGE MASTER TO master_host = '127.0.0.1', master_port = MASTER_PORT,
|
||||||
MASTER_USE_GTID=CURRENT_POS;
|
MASTER_USE_GTID=CURRENT_POS;
|
||||||
|
SET GLOBAL sql_slave_skip_counter=10;
|
||||||
|
ERROR HY000: When using GTID, @@sql_slave_skip_counter can not be used. Instead, setting @@gtid_slave_pos explicitly can be used to skip to after a given GTID position.
|
||||||
include/start_slave.inc
|
include/start_slave.inc
|
||||||
SELECT * FROM t1 ORDER BY a;
|
SELECT * FROM t1 ORDER BY a;
|
||||||
a b
|
a b
|
||||||
|
@ -68,8 +68,16 @@ save_master_pos;
|
|||||||
|
|
||||||
connection server_4;
|
connection server_4;
|
||||||
--replace_result $MASTER_MYPORT MASTER_PORT
|
--replace_result $MASTER_MYPORT MASTER_PORT
|
||||||
|
eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $MASTER_MYPORT,
|
||||||
|
MASTER_USE_GTID=SLAVE_POS;
|
||||||
|
# Test that sql_slave_skip_counter is prevented in GTID mode.
|
||||||
|
--error ER_SLAVE_SKIP_NOT_IN_GTID
|
||||||
|
SET GLOBAL sql_slave_skip_counter=1;
|
||||||
|
--replace_result $MASTER_MYPORT MASTER_PORT
|
||||||
eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $MASTER_MYPORT,
|
eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $MASTER_MYPORT,
|
||||||
MASTER_USE_GTID=CURRENT_POS;
|
MASTER_USE_GTID=CURRENT_POS;
|
||||||
|
--error ER_SLAVE_SKIP_NOT_IN_GTID
|
||||||
|
SET GLOBAL sql_slave_skip_counter=10;
|
||||||
--source include/start_slave.inc
|
--source include/start_slave.inc
|
||||||
sync_with_master;
|
sync_with_master;
|
||||||
SELECT * FROM t1 ORDER BY a;
|
SELECT * FROM t1 ORDER BY a;
|
||||||
|
@ -28,6 +28,7 @@ drop table t1;
|
|||||||
|
|
||||||
--connection server_2
|
--connection server_2
|
||||||
drop table t2;
|
drop table t2;
|
||||||
|
--save_master_pos
|
||||||
|
|
||||||
--connection server_3
|
--connection server_3
|
||||||
--sync_with_master 0,'m2'
|
--sync_with_master 0,'m2'
|
||||||
|
@ -6112,6 +6112,16 @@ void Binlog_checkpoint_log_event::pack_info(THD *thd, Protocol *protocol)
|
|||||||
{
|
{
|
||||||
protocol->store(binlog_file_name, binlog_file_len, &my_charset_bin);
|
protocol->store(binlog_file_name, binlog_file_len, &my_charset_bin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Log_event::enum_skip_reason
|
||||||
|
Binlog_checkpoint_log_event::do_shall_skip(rpl_group_info *rgi)
|
||||||
|
{
|
||||||
|
enum_skip_reason reason= Log_event::do_shall_skip(rgi);
|
||||||
|
if (reason == EVENT_SKIP_COUNT)
|
||||||
|
reason= EVENT_SKIP_NOT;
|
||||||
|
return reason;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@ -6668,6 +6678,16 @@ Gtid_list_log_event::do_apply_event(rpl_group_info *rgi)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Log_event::enum_skip_reason
|
||||||
|
Gtid_list_log_event::do_shall_skip(rpl_group_info *rgi)
|
||||||
|
{
|
||||||
|
enum_skip_reason reason= Log_event::do_shall_skip(rgi);
|
||||||
|
if (reason == EVENT_SKIP_COUNT)
|
||||||
|
reason= EVENT_SKIP_NOT;
|
||||||
|
return reason;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Gtid_list_log_event::pack_info(THD *thd, Protocol *protocol)
|
Gtid_list_log_event::pack_info(THD *thd, Protocol *protocol)
|
||||||
{
|
{
|
||||||
|
@ -3057,6 +3057,7 @@ public:
|
|||||||
bool is_valid() const { return binlog_file_name != 0; }
|
bool is_valid() const { return binlog_file_name != 0; }
|
||||||
#ifdef MYSQL_SERVER
|
#ifdef MYSQL_SERVER
|
||||||
bool write(IO_CACHE* file);
|
bool write(IO_CACHE* file);
|
||||||
|
enum_skip_reason do_shall_skip(rpl_group_info *rgi);
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -3274,6 +3275,7 @@ public:
|
|||||||
bool to_packet(String *packet);
|
bool to_packet(String *packet);
|
||||||
bool write(IO_CACHE *file);
|
bool write(IO_CACHE *file);
|
||||||
virtual int do_apply_event(rpl_group_info *rgi);
|
virtual int do_apply_event(rpl_group_info *rgi);
|
||||||
|
enum_skip_reason do_shall_skip(rpl_group_info *rgi);
|
||||||
#endif
|
#endif
|
||||||
static bool peek(const char *event_start, uint32 event_len,
|
static bool peek(const char *event_start, uint32 event_len,
|
||||||
uint8 checksum_alg,
|
uint8 checksum_alg,
|
||||||
|
@ -6555,3 +6555,5 @@ ER_CHANGE_SLAVE_PARALLEL_THREADS_ACTIVE
|
|||||||
eng "Cannot change @@slave_parallel_threads while another change is in progress"
|
eng "Cannot change @@slave_parallel_threads while another change is in progress"
|
||||||
ER_PRIOR_COMMIT_FAILED
|
ER_PRIOR_COMMIT_FAILED
|
||||||
eng "Commit failed due to failure of an earlier commit on which this one depends"
|
eng "Commit failed due to failure of an earlier commit on which this one depends"
|
||||||
|
ER_SLAVE_SKIP_NOT_IN_GTID
|
||||||
|
eng "When using GTID, @@sql_slave_skip_counter can not be used. Instead, setting @@gtid_slave_pos explicitly can be used to skip to after a given GTID position."
|
||||||
|
@ -3988,13 +3988,18 @@ bool update_multi_source_variable(sys_var *self_var, THD *thd,
|
|||||||
|
|
||||||
static bool update_slave_skip_counter(sys_var *self, THD *thd, Master_info *mi)
|
static bool update_slave_skip_counter(sys_var *self, THD *thd, Master_info *mi)
|
||||||
{
|
{
|
||||||
|
if (mi->using_gtid != Master_info::USE_GTID_NO)
|
||||||
|
{
|
||||||
|
my_error(ER_SLAVE_SKIP_NOT_IN_GTID, MYF(0));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (mi->rli.slave_running)
|
if (mi->rli.slave_running)
|
||||||
{
|
{
|
||||||
my_error(ER_SLAVE_MUST_STOP, MYF(0), mi->connection_name.length,
|
my_error(ER_SLAVE_MUST_STOP, MYF(0), mi->connection_name.length,
|
||||||
mi->connection_name.str);
|
mi->connection_name.str);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
/* The value was stored temporarly in thd */
|
/* The value was stored temporarily in thd */
|
||||||
mi->rli.slave_skip_counter= thd->variables.slave_skip_counter;
|
mi->rli.slave_skip_counter= thd->variables.slave_skip_counter;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user