mirror of
https://github.com/MariaDB/server.git
synced 2026-05-16 20:07:13 +02:00
If we have a 2+ node cluster which is replicating from an async master and the binlog_format is set to STATEMENT and multi-row inserts are executed on a table with an auto_increment column such that values are automatically generated by MySQL, then the server node generates wrong auto_increment values, which are different from what was generated on the async master. In the title of the MDEV-9519 it was proposed to ban start slave on a Galera if master binlog_format = statement and wsrep_auto_increment_control = 1, but the problem can be solved without such a restriction. The causes and fixes: 1. We need to improve processing of changing the auto-increment values after changing the cluster size. 2. If wsrep auto_increment_control switched on during operation of the node, then we should immediately update the auto_increment_increment and auto_increment_offset global variables, without waiting of the next invocation of the wsrep_view_handler_cb() callback. In the current version these variables retain its initial values if wsrep_auto_increment_control is switched on during operation of the node, which leads to inconsistent results on the different nodes in some scenarios. 3. If wsrep auto_increment_control switched off during operation of the node, then we must return the original values of the auto_increment_increment and auto_increment_offset global variables, as the user has set. To make this possible, we need to add a "shadow copies" of these variables (which stores the latest values set by the user). https://jira.mariadb.org/browse/MDEV-9519
161 lines
3.8 KiB
Text
161 lines
3.8 KiB
Text
connection node_1;
|
|
connection node_2;
|
|
connection node_2;
|
|
SET GLOBAL wsrep_forced_binlog_format='STATEMENT';
|
|
connection node_1;
|
|
SET GLOBAL wsrep_forced_binlog_format='STATEMENT';
|
|
CREATE TABLE t1 (
|
|
i int(11) NOT NULL AUTO_INCREMENT,
|
|
c char(32) DEFAULT 'dummy_text',
|
|
PRIMARY KEY (i)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
|
|
insert into t1(i) values(null);
|
|
select * from t1;
|
|
i c
|
|
1 dummy_text
|
|
insert into t1(i) values(null), (null), (null);
|
|
select * from t1;
|
|
i c
|
|
1 dummy_text
|
|
3 dummy_text
|
|
5 dummy_text
|
|
7 dummy_text
|
|
connection node_2;
|
|
select * from t1;
|
|
i c
|
|
1 dummy_text
|
|
3 dummy_text
|
|
5 dummy_text
|
|
7 dummy_text
|
|
SET GLOBAL wsrep_forced_binlog_format='none';
|
|
connection node_1;
|
|
SET GLOBAL wsrep_forced_binlog_format='none';
|
|
drop table t1;
|
|
SET SESSION binlog_format='STATEMENT';
|
|
show variables like 'binlog_format';
|
|
Variable_name Value
|
|
binlog_format STATEMENT
|
|
SET GLOBAL wsrep_auto_increment_control='OFF';
|
|
SET SESSION auto_increment_increment = 3;
|
|
SET SESSION auto_increment_offset = 1;
|
|
CREATE TABLE t1 (
|
|
i int(11) NOT NULL AUTO_INCREMENT,
|
|
c char(32) DEFAULT 'dummy_text',
|
|
PRIMARY KEY (i)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
|
|
insert into t1(i) values(null);
|
|
select * from t1;
|
|
i c
|
|
1 dummy_text
|
|
insert into t1(i) values(null), (null), (null);
|
|
select * from t1;
|
|
i c
|
|
1 dummy_text
|
|
4 dummy_text
|
|
7 dummy_text
|
|
10 dummy_text
|
|
connection node_2;
|
|
select * from t1;
|
|
i c
|
|
1 dummy_text
|
|
4 dummy_text
|
|
7 dummy_text
|
|
10 dummy_text
|
|
connection node_1;
|
|
SET GLOBAL wsrep_auto_increment_control='ON';
|
|
SET SESSION binlog_format='ROW';
|
|
show variables like 'binlog_format';
|
|
Variable_name Value
|
|
binlog_format ROW
|
|
show variables like '%auto_increment%';
|
|
Variable_name Value
|
|
auto_increment_increment 2
|
|
auto_increment_offset 1
|
|
wsrep_auto_increment_control ON
|
|
SET GLOBAL wsrep_auto_increment_control='OFF';
|
|
show variables like '%auto_increment%';
|
|
Variable_name Value
|
|
auto_increment_increment 3
|
|
auto_increment_offset 1
|
|
wsrep_auto_increment_control OFF
|
|
SET GLOBAL wsrep_auto_increment_control='ON';
|
|
drop table t1;
|
|
connection node_2;
|
|
SET GLOBAL wsrep_forced_binlog_format='ROW';
|
|
connection node_1;
|
|
SET GLOBAL wsrep_forced_binlog_format='ROW';
|
|
CREATE TABLE t1 (
|
|
i int(11) NOT NULL AUTO_INCREMENT,
|
|
c char(32) DEFAULT 'dummy_text',
|
|
PRIMARY KEY (i)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
|
|
insert into t1(i) values(null);
|
|
select * from t1;
|
|
i c
|
|
1 dummy_text
|
|
insert into t1(i) values(null), (null), (null);
|
|
select * from t1;
|
|
i c
|
|
1 dummy_text
|
|
3 dummy_text
|
|
5 dummy_text
|
|
7 dummy_text
|
|
connection node_2;
|
|
select * from t1;
|
|
i c
|
|
1 dummy_text
|
|
3 dummy_text
|
|
5 dummy_text
|
|
7 dummy_text
|
|
SET GLOBAL wsrep_forced_binlog_format='none';
|
|
connection node_1;
|
|
SET GLOBAL wsrep_forced_binlog_format='none';
|
|
drop table t1;
|
|
SET SESSION binlog_format='ROW';
|
|
show variables like 'binlog_format';
|
|
Variable_name Value
|
|
binlog_format ROW
|
|
SET GLOBAL wsrep_auto_increment_control='OFF';
|
|
SET SESSION auto_increment_increment = 3;
|
|
SET SESSION auto_increment_offset = 1;
|
|
CREATE TABLE t1 (
|
|
i int(11) NOT NULL AUTO_INCREMENT,
|
|
c char(32) DEFAULT 'dummy_text',
|
|
PRIMARY KEY (i)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
|
|
insert into t1(i) values(null);
|
|
select * from t1;
|
|
i c
|
|
1 dummy_text
|
|
insert into t1(i) values(null), (null), (null);
|
|
select * from t1;
|
|
i c
|
|
1 dummy_text
|
|
4 dummy_text
|
|
7 dummy_text
|
|
10 dummy_text
|
|
connection node_2;
|
|
select * from t1;
|
|
i c
|
|
1 dummy_text
|
|
4 dummy_text
|
|
7 dummy_text
|
|
10 dummy_text
|
|
connection node_1;
|
|
SET GLOBAL wsrep_auto_increment_control='ON';
|
|
show variables like 'binlog_format';
|
|
Variable_name Value
|
|
binlog_format ROW
|
|
show variables like '%auto_increment%';
|
|
Variable_name Value
|
|
auto_increment_increment 2
|
|
auto_increment_offset 1
|
|
wsrep_auto_increment_control ON
|
|
SET GLOBAL wsrep_auto_increment_control='OFF';
|
|
show variables like '%auto_increment%';
|
|
Variable_name Value
|
|
auto_increment_increment 3
|
|
auto_increment_offset 1
|
|
wsrep_auto_increment_control OFF
|
|
SET GLOBAL wsrep_auto_increment_control='ON';
|
|
drop table t1;
|