diff options
author | Alfranio Correia <alfranio.correia@sun.com> | 2010-05-19 18:01:12 +0100 |
---|---|---|
committer | Alfranio Correia <alfranio.correia@sun.com> | 2010-05-19 18:01:12 +0100 |
commit | 89850be0f51a2f761aa88236e5ced7d5a7eddd03 (patch) | |
tree | 9ed3c78ca4cde71b084f4fea32d25ea20c93c844 /mysql-test | |
parent | f59684b86e2f7005119fd51de16777ae67c9956c (diff) | |
download | mariadb-git-89850be0f51a2f761aa88236e5ced7d5a7eddd03.tar.gz |
BUG#53560 CREATE TEMP./DROP TEMP. are not binglogged correctly after a failed statement
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.
Diffstat (limited to 'mysql-test')
-rw-r--r-- | mysql-test/suite/binlog/r/binlog_stm_mix_innodb_myisam.result | 3 | ||||
-rw-r--r-- | mysql-test/suite/rpl/r/rpl_temporary_errors.result | 57 | ||||
-rw-r--r-- | mysql-test/suite/rpl/t/rpl_temporary_errors.test | 40 |
3 files changed, 100 insertions, 0 deletions
diff --git a/mysql-test/suite/binlog/r/binlog_stm_mix_innodb_myisam.result b/mysql-test/suite/binlog/r/binlog_stm_mix_innodb_myisam.result index b3f9baed2dd..a26fcc1dc1a 100644 --- a/mysql-test/suite/binlog/r/binlog_stm_mix_innodb_myisam.result +++ b/mysql-test/suite/binlog/r/binlog_stm_mix_innodb_myisam.result @@ -364,6 +364,9 @@ master-bin.000001 # Query # # use `test`; INSERT INTO t1 values (10,10) master-bin.000001 # Query # # BEGIN master-bin.000001 # Query # # use `test`; INSERT INTO t2 values (100,100) master-bin.000001 # Query # # COMMIT +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO t2 values (101,101) +master-bin.000001 # Query # # ROLLBACK master-bin.000001 # Query # # use `test`; DROP TABLE t1,t2 reset master; create table t1 (a int) engine=innodb; diff --git a/mysql-test/suite/rpl/r/rpl_temporary_errors.result b/mysql-test/suite/rpl/r/rpl_temporary_errors.result index d14380a6369..2bd1b691901 100644 --- a/mysql-test/suite/rpl/r/rpl_temporary_errors.result +++ b/mysql-test/suite/rpl/r/rpl_temporary_errors.result @@ -81,4 +81,61 @@ Last_SQL_Errno 0 Last_SQL_Error DROP TABLE t1; **** On Master **** +SET SQL_LOG_BIN= 0; DROP TABLE t1; +SET SQL_LOG_BIN= 1; +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); +BEGIN; +INSERT INTO t_innodb(id) VALUES(2); +INSERT INTO t_myisam(id) VALUES(3); +CREATE TEMPORARY TABLE x (id INT); +INSERT INTO t_myisam(id) VALUES(4),(1); +ERROR 23000: Duplicate entry '1' for key 'PRIMARY' +INSERT INTO t_innodb(id) VALUES(5); +COMMIT; +SELECT * FROM t_innodb; +id +1 +2 +5 +SELECT * FROM t_myisam; +id +1 +3 +4 +SELECT * FROM t_innodb; +id +1 +2 +5 +SELECT * FROM t_myisam; +id +1 +3 +4 +BEGIN; +CREATE TEMPORARY TABLE tmp2 SELECT * FROM t_innodb; +INSERT INTO t_innodb(id) VALUES(1); +INSERT INTO t_innodb(id) VALUES(1); +ROLLBACK; +Warnings: +Warning 1196 Some non-transactional changed tables couldn't be rolled back +show binlog events from <binlog_start>; +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO t_innodb(id) VALUES(2) +master-bin.000001 # Query # # use `test`; INSERT INTO t_myisam(id) VALUES(3) +master-bin.000001 # Query # # use `test`; CREATE TEMPORARY TABLE x (id INT) +master-bin.000001 # Query # # use `test`; INSERT INTO t_myisam(id) VALUES(4),(1) +master-bin.000001 # Query # # use `test`; INSERT INTO t_innodb(id) VALUES(5) +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Query # # use `test`; CREATE TEMPORARY TABLE tmp2 SELECT * FROM t_innodb +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO t_innodb(id) VALUES(1) +master-bin.000001 # Query # # use `test`; INSERT INTO t_innodb(id) VALUES(1) +master-bin.000001 # Query # # ROLLBACK +DROP TABLE t_myisam, t_innodb; diff --git a/mysql-test/suite/rpl/t/rpl_temporary_errors.test b/mysql-test/suite/rpl/t/rpl_temporary_errors.test index 3b373e00a62..4bc374cdca7 100644 --- a/mysql-test/suite/rpl/t/rpl_temporary_errors.test +++ b/mysql-test/suite/rpl/t/rpl_temporary_errors.test @@ -1,4 +1,5 @@ source include/master-slave.inc; +source include/have_innodb.inc; call mtr.add_suppression("Deadlock found"); @@ -30,4 +31,43 @@ 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; |