mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-30430: Enabling system versioning on tables without primary key breaks replication
When replicating MDL events for a table that uses system versioning without primary keys, ensure that for data sets with duplicate records, the updates to these records with duplicates are enacted on the correct row. That is, there was a bug (reported in MDEV-30430) such that the function to find the row to update would stop after finding the first matching record. However, in the absence of primary keys, the version of the record is needed to compare the row to ensure we are updating the correct one. The fix, therefore, updates the record comparison functionality to use system version columns when there are no primary keys on the table. Reviewed By: ============ Andrei Elkin <andrei.elkin@mariadb.com>
This commit is contained in:
@ -164,4 +164,28 @@ update t1 set i = 0;
|
||||
connection slave;
|
||||
connection master;
|
||||
drop table t1;
|
||||
# check versioned -> versioned replication without any keys on duplicate records
|
||||
connection master;
|
||||
create table t1 (a INT) with system versioning;
|
||||
insert into t1 values (1);
|
||||
insert into t1 values (1);
|
||||
delete from t1;
|
||||
connection slave;
|
||||
include/diff_tables.inc [master:test.t1,slave:test.t1]
|
||||
connection master;
|
||||
drop table t1;
|
||||
connection slave;
|
||||
# check unversioned -> versioned replication with non-unique keys on duplicate records
|
||||
connection master;
|
||||
set statement sql_log_bin=0 for create table t1 (a INT NOT NULL, b INT, INDEX(a,b));
|
||||
connection slave;
|
||||
set statement sql_log_bin=0 for create table t1 (a INT NOT NULL, b INT, INDEX(a,b)) with system versioning;
|
||||
connection master;
|
||||
insert into t1 values (1,1);
|
||||
insert into t1 values (1,1);
|
||||
delete from t1;
|
||||
connection slave;
|
||||
include/diff_tables.inc [master:test.t1,slave:test.t1]
|
||||
connection master;
|
||||
drop table t1;
|
||||
include/rpl_end.inc
|
||||
|
@ -133,4 +133,38 @@ sync_slave_with_master;
|
||||
connection master;
|
||||
drop table t1;
|
||||
|
||||
|
||||
#
|
||||
# MDEV-30430: Enabling system versioning on tables without primary key breaks replication
|
||||
# Note that bugs are only present with row binlog format
|
||||
#
|
||||
--echo # check versioned -> versioned replication without any keys on duplicate records
|
||||
connection master;
|
||||
create table t1 (a INT) with system versioning;
|
||||
insert into t1 values (1);
|
||||
insert into t1 values (1);
|
||||
delete from t1;
|
||||
sync_slave_with_master;
|
||||
--let $diff_tables= master:test.t1,slave:test.t1
|
||||
--source include/diff_tables.inc
|
||||
connection master;
|
||||
drop table t1;
|
||||
sync_slave_with_master;
|
||||
|
||||
--echo # check unversioned -> versioned replication with non-unique keys on duplicate records
|
||||
connection master;
|
||||
set statement sql_log_bin=0 for create table t1 (a INT NOT NULL, b INT, INDEX(a,b));
|
||||
connection slave;
|
||||
set statement sql_log_bin=0 for create table t1 (a INT NOT NULL, b INT, INDEX(a,b)) with system versioning;
|
||||
connection master;
|
||||
insert into t1 values (1,1);
|
||||
insert into t1 values (1,1);
|
||||
delete from t1;
|
||||
sync_slave_with_master;
|
||||
--let $diff_tables= master:test.t1,slave:test.t1
|
||||
--source include/diff_tables.inc
|
||||
|
||||
connection master;
|
||||
drop table t1;
|
||||
|
||||
--source include/rpl_end.inc
|
||||
|
Reference in New Issue
Block a user