mirror of
https://github.com/MariaDB/server.git
synced 2025-08-26 01:44:06 +03:00
This patch fixes two problems described as follows: 1 - If there is an on-going transaction and a temporary table is created or dropped, any failed statement that follows the "create" or "drop commands" triggers a rollback and by consequence the slave will go out sync because the binary log will have a wrong sequence of events. To fix the problem, we changed the expression that evaluates when the cache should be flushed after either the rollback of a statment or transaction. 2 - When a "CREATE TEMPORARY TABLE SELECT * FROM" was executed the OPTION_KEEP_LOG was not set into the thd->options. For that reason, if the transaction had updated only transactional engines and was rolled back at the end (.e.g due to a deadlock) the changes were not written to the binary log, including the creation of the temporary table. To fix the problem, we have set the OPTION_KEEP_LOG into the thd->options when a "CREATE TEMPORARY TABLE SELECT * FROM" is executed.
74 lines
2.0 KiB
Plaintext
74 lines
2.0 KiB
Plaintext
source include/master-slave.inc;
|
|
source include/have_innodb.inc;
|
|
|
|
call mtr.add_suppression("Deadlock found");
|
|
|
|
--echo **** On Master ****
|
|
connection master;
|
|
SET SESSION BINLOG_FORMAT=ROW;
|
|
CREATE TABLE t1 (a INT PRIMARY KEY, b INT);
|
|
INSERT INTO t1 VALUES (1,1), (2,2), (3,3), (4,4);
|
|
--echo **** On Slave ****
|
|
sync_slave_with_master;
|
|
SHOW STATUS LIKE 'Slave_retried_transactions';
|
|
# since bug#31552/31609 idempotency is not default any longer. In order
|
|
# the following UPDATE t1 to pass the mode is switched temprorarily
|
|
set @@global.slave_exec_mode= 'IDEMPOTENT';
|
|
UPDATE t1 SET a = 5, b = 47 WHERE a = 1;
|
|
SELECT * FROM t1;
|
|
--echo **** On Master ****
|
|
connection master;
|
|
UPDATE t1 SET a = 5, b = 5 WHERE a = 1;
|
|
SELECT * FROM t1;
|
|
#SHOW BINLOG EVENTS;
|
|
--echo **** On Slave ****
|
|
sync_slave_with_master;
|
|
set @@global.slave_exec_mode= default;
|
|
SHOW STATUS LIKE 'Slave_retried_transactions';
|
|
SELECT * FROM t1;
|
|
source include/show_slave_status2.inc;
|
|
DROP TABLE t1;
|
|
|
|
--echo **** On Master ****
|
|
connection master;
|
|
SET SQL_LOG_BIN= 0;
|
|
DROP TABLE t1;
|
|
SET SQL_LOG_BIN= 1;
|
|
|
|
# BUG#Bug #53259 Unsafe statement binlogged in statement format w/MyIsam temp tables
|
|
#
|
|
SET SESSION BINLOG_FORMAT=MIXED;
|
|
CREATE TABLE t_myisam (id INT, PRIMARY KEY (id)) engine= MyIsam;
|
|
INSERT INTO t_myisam (id) VALUES(1);
|
|
CREATE TABLE t_innodb (id INT) engine= Innodb;
|
|
INSERT INTO t_innodb (id) VALUES(1);
|
|
|
|
let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
|
|
BEGIN;
|
|
INSERT INTO t_innodb(id) VALUES(2);
|
|
INSERT INTO t_myisam(id) VALUES(3);
|
|
CREATE TEMPORARY TABLE x (id INT);
|
|
--error 1062
|
|
INSERT INTO t_myisam(id) VALUES(4),(1);
|
|
INSERT INTO t_innodb(id) VALUES(5);
|
|
COMMIT;
|
|
|
|
SELECT * FROM t_innodb;
|
|
SELECT * FROM t_myisam;
|
|
|
|
--sync_slave_with_master
|
|
|
|
SELECT * FROM t_innodb;
|
|
SELECT * FROM t_myisam;
|
|
|
|
--connection master
|
|
|
|
BEGIN;
|
|
CREATE TEMPORARY TABLE tmp2 SELECT * FROM t_innodb;
|
|
INSERT INTO t_innodb(id) VALUES(1);
|
|
INSERT INTO t_innodb(id) VALUES(1);
|
|
ROLLBACK;
|
|
source include/show_binlog_events.inc;
|
|
|
|
DROP TABLE t_myisam, t_innodb;
|