mirror of
https://github.com/MariaDB/server.git
synced 2025-08-26 01:44:06 +03:00
Problem: The following statements can cause the slave to go out of sync if logged in statement format: INSERT IGNORE...SELECT INSERT ... SELECT ... ON DUPLICATE KEY UPDATE REPLACE ... SELECT UPDATE IGNORE : CREATE ... IGNORE SELECT CREATE ... REPLACE SELECT Background: Since the order of the rows returned by the SELECT statement or otherwise may differ on master and slave, therefore the above statements may cuase the salve to go out of sync with the master. Fix: Issue a warning when statements like the above are exectued and the bin-logging format is statement. If the logging format is mixed, use row based logging. Marking a statement as unsafe has been done in the sql/sql_parse.cc instead of sql/sql_yacc.cc, because while parsing for a token has been done we cannot be sure if the parsing of the other tokens has been done as well. Six new warning messages has been added for each unsafe statement. binlog.binlog_unsafe.test has been updated to incoporate these additional unsafe statments. ****** BUG#11758262 - 50439: MARK INSERT...SEL...ON DUP KEY UPD,REPLACE...SEL,CREATE...[IGN|REPL] SEL Problem: The following statements can cause the slave to go out of sync if logged in statement format: INSERT IGNORE...SELECT INSERT ... SELECT ... ON DUPLICATE KEY UPDATE REPLACE ... SELECT UPDATE IGNORE : CREATE ... IGNORE SELECT CREATE ... REPLACE SELECT Background: Since the order of the rows returned by the SELECT statement or otherwise may differ on master and slave, therefore the above statements may cuase the salve to go out of sync with the master. Fix: Issue a warning when statements like the above are exectued and the bin-logging format is statement. If the logging format is mixed, use row based logging. Marking a statement as unsafe has been done in the sql/sql_parse.cc instead of sql/sql_yacc.cc, because while parsing for a token has been done we cannot be sure if the parsing of the other tokens has been done as well. Six new warning messages has been added for each unsafe statement. binlog.binlog_unsafe.test has been updated to incoporate these additional unsafe statments.
83 lines
3.2 KiB
Plaintext
83 lines
3.2 KiB
Plaintext
include/master-slave.inc
|
|
[connection master]
|
|
call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT");
|
|
CREATE TABLE t1 (
|
|
a int unsigned not null auto_increment primary key,
|
|
b int unsigned,
|
|
unique (b)
|
|
) ENGINE=innodb;
|
|
CREATE TABLE t2 (
|
|
a int unsigned, # to force INSERT SELECT to have a certain order
|
|
b int unsigned
|
|
) ENGINE=innodb;
|
|
INSERT INTO t1 VALUES (NULL, 1);
|
|
INSERT INTO t1 VALUES (NULL, 2);
|
|
INSERT INTO t1 VALUES (NULL, 3);
|
|
INSERT INTO t1 VALUES (NULL, 4);
|
|
INSERT INTO t2 VALUES (1, 1);
|
|
INSERT INTO t2 VALUES (2, 2);
|
|
INSERT INTO t2 VALUES (3, 5);
|
|
INSERT INTO t2 VALUES (4, 3);
|
|
INSERT INTO t2 VALUES (5, 4);
|
|
INSERT INTO t2 VALUES (6, 6);
|
|
INSERT IGNORE INTO t1 SELECT NULL, t2.b FROM t2 ORDER BY t2.a;
|
|
include/assert.inc [Count of elements in t1 should be 6.]
|
|
include/diff_tables.inc [master:test.t1 , slave:test.t1]
|
|
INSERT IGNORE INTO t1 SELECT NULL, t2.b FROM t2 ORDER BY t2.a;
|
|
include/assert.inc [Count of elements in t1 should be 6.]
|
|
include/assert.inc [In SBR or MIXED modes, the event in the binlog should be the same that was executed. In RBR mode, binlog position should stay unchanged.]
|
|
DROP TABLE t1;
|
|
DROP TABLE t2;
|
|
CREATE TABLE t1 (
|
|
a INT UNSIGNED NOT NULL PRIMARY KEY
|
|
) ENGINE=innodb;
|
|
CREATE TABLE t2 (
|
|
a INT UNSIGNED
|
|
) ENGINE=innodb;
|
|
INSERT INTO t1 VALUES (1);
|
|
INSERT INTO t2 VALUES (1);
|
|
INSERT INTO t1 SELECT t2.a FROM t2 ORDER BY t2.a ON DUPLICATE KEY UPDATE t1.a= t1.a;
|
|
include/assert.inc [Sum of elements in t1 should be 1.]
|
|
include/assert.inc [In SBR or MIXED modes, the event in the binlog should be the same that was executed. In RBR mode, binlog position should stay unchanged.]
|
|
drop table t1, t2;
|
|
CREATE TABLE t1 (
|
|
a int unsigned not null auto_increment primary key,
|
|
b int unsigned,
|
|
unique (b)
|
|
) ENGINE=myisam;
|
|
CREATE TABLE t2 (
|
|
a int unsigned, # to force INSERT SELECT to have a certain order
|
|
b int unsigned
|
|
) ENGINE=myisam;
|
|
INSERT INTO t1 VALUES (NULL, 1);
|
|
INSERT INTO t1 VALUES (NULL, 2);
|
|
INSERT INTO t1 VALUES (NULL, 3);
|
|
INSERT INTO t1 VALUES (NULL, 4);
|
|
INSERT INTO t2 VALUES (1, 1);
|
|
INSERT INTO t2 VALUES (2, 2);
|
|
INSERT INTO t2 VALUES (3, 5);
|
|
INSERT INTO t2 VALUES (4, 3);
|
|
INSERT INTO t2 VALUES (5, 4);
|
|
INSERT INTO t2 VALUES (6, 6);
|
|
INSERT IGNORE INTO t1 SELECT NULL, t2.b FROM t2 ORDER BY t2.a;
|
|
include/assert.inc [Count of elements in t1 should be 6.]
|
|
include/diff_tables.inc [master:test.t1 , slave:test.t1]
|
|
INSERT IGNORE INTO t1 SELECT NULL, t2.b FROM t2 ORDER BY t2.a;
|
|
include/assert.inc [Count of elements in t1 should be 6.]
|
|
include/assert.inc [In SBR or MIXED modes, the event in the binlog should be the same that was executed. In RBR mode, binlog position should stay unchanged.]
|
|
DROP TABLE t1;
|
|
DROP TABLE t2;
|
|
CREATE TABLE t1 (
|
|
a INT UNSIGNED NOT NULL PRIMARY KEY
|
|
) ENGINE=myisam;
|
|
CREATE TABLE t2 (
|
|
a INT UNSIGNED
|
|
) ENGINE=myisam;
|
|
INSERT INTO t1 VALUES (1);
|
|
INSERT INTO t2 VALUES (1);
|
|
INSERT INTO t1 SELECT t2.a FROM t2 ORDER BY t2.a ON DUPLICATE KEY UPDATE t1.a= t1.a;
|
|
include/assert.inc [Sum of elements in t1 should be 1.]
|
|
include/assert.inc [In SBR or MIXED modes, the event in the binlog should be the same that was executed. In RBR mode, binlog position should stay unchanged.]
|
|
drop table t1, t2;
|
|
include/rpl_end.inc
|