mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
BUG#47312: RBR: Disabling key on slave breaks replication:
HA_ERR_WRONG_INDEX In RBR, disabling keys on slave table will break replication when updating or deleting a record. When the slave thread tries to find the row, by searching in the storage engine, it checks whether the table has a key or not. If it has one, then the slave thread uses it to search the record. Nonetheless, the slave only checks whether the key exists or not, it does not verify if it is active. Should the key be disabled (eg, DBA has issued an ALTER TABLE ... DISABLE KEYS) then it will result in error: HA_ERR_WRONG_INDEX. This patch addresses this issue by making the slave thread also check whether the key is active or not before actually using it.
This commit is contained in:
26
mysql-test/suite/rpl/r/rpl_row_disabled_slave_key.result
Normal file
26
mysql-test/suite/rpl/r/rpl_row_disabled_slave_key.result
Normal file
@ -0,0 +1,26 @@
|
||||
stop slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
SET SQL_LOG_BIN=0;
|
||||
CREATE TABLE t (a int, b int, c int, key(b));
|
||||
SET SQL_LOG_BIN=1;
|
||||
CREATE TABLE t (a int, b int, c int);
|
||||
INSERT INTO t VALUES (1,2,4);
|
||||
INSERT INTO t VALUES (4,3,4);
|
||||
DELETE FROM t;
|
||||
DROP TABLE t;
|
||||
stop slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
CREATE TABLE t (a int, b int, c int, key(b));
|
||||
ALTER TABLE t DISABLE KEYS;
|
||||
INSERT INTO t VALUES (1,2,4);
|
||||
INSERT INTO t VALUES (4,3,4);
|
||||
DELETE FROM t;
|
||||
DROP TABLE t;
|
73
mysql-test/suite/rpl/t/rpl_row_disabled_slave_key.test
Normal file
73
mysql-test/suite/rpl/t/rpl_row_disabled_slave_key.test
Normal file
@ -0,0 +1,73 @@
|
||||
# BUG#47312: RBR: Disabling key on slave breaks replication:
|
||||
# HA_ERR_WRONG_INDEX
|
||||
#
|
||||
# Description
|
||||
# ===========
|
||||
#
|
||||
# This test case checks whether disabling a key on a slave breaks
|
||||
# replication or not.
|
||||
#
|
||||
# Case #1, shows that while not using ALTER TABLE... DISABLE KEYS and
|
||||
# the slave has no key defined while the master has one, replication
|
||||
# won't break.
|
||||
#
|
||||
# Case #2, shows that before patch for BUG#47312, if defining key on
|
||||
# slave table, and later disable it, replication would break. This
|
||||
# has been fixed.
|
||||
#
|
||||
|
||||
-- source include/master-slave.inc
|
||||
-- source include/have_binlog_format_row.inc
|
||||
|
||||
#
|
||||
# Case #1: master has key, but slave has not.
|
||||
# Replication does not break.
|
||||
#
|
||||
|
||||
SET SQL_LOG_BIN=0;
|
||||
CREATE TABLE t (a int, b int, c int, key(b));
|
||||
SET SQL_LOG_BIN=1;
|
||||
|
||||
-- connection slave
|
||||
|
||||
CREATE TABLE t (a int, b int, c int);
|
||||
|
||||
-- connection master
|
||||
|
||||
INSERT INTO t VALUES (1,2,4);
|
||||
INSERT INTO t VALUES (4,3,4);
|
||||
DELETE FROM t;
|
||||
|
||||
-- sync_slave_with_master
|
||||
|
||||
-- connection master
|
||||
DROP TABLE t;
|
||||
|
||||
-- sync_slave_with_master
|
||||
|
||||
#
|
||||
# Case #2: master has key, slave also has one,
|
||||
# but it gets disabled sometime.
|
||||
# Replication does not break anymore.
|
||||
#
|
||||
-- source include/master-slave-reset.inc
|
||||
-- connection master
|
||||
|
||||
CREATE TABLE t (a int, b int, c int, key(b));
|
||||
|
||||
-- sync_slave_with_master
|
||||
|
||||
ALTER TABLE t DISABLE KEYS;
|
||||
|
||||
-- connection master
|
||||
|
||||
INSERT INTO t VALUES (1,2,4);
|
||||
INSERT INTO t VALUES (4,3,4);
|
||||
DELETE FROM t;
|
||||
|
||||
-- sync_slave_with_master
|
||||
|
||||
-- connection master
|
||||
DROP TABLE t;
|
||||
|
||||
-- sync_slave_with_master
|
Reference in New Issue
Block a user