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.
142 lines
3.4 KiB
Plaintext
142 lines
3.4 KiB
Plaintext
stop slave;
|
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
|
reset master;
|
|
reset slave;
|
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
|
start slave;
|
|
call mtr.add_suppression("Deadlock found");
|
|
**** On 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);
|
|
**** On Slave ****
|
|
SHOW STATUS LIKE 'Slave_retried_transactions';
|
|
Variable_name Value
|
|
Slave_retried_transactions 0
|
|
set @@global.slave_exec_mode= 'IDEMPOTENT';
|
|
UPDATE t1 SET a = 5, b = 47 WHERE a = 1;
|
|
SELECT * FROM t1;
|
|
a b
|
|
5 47
|
|
2 2
|
|
3 3
|
|
4 4
|
|
**** On Master ****
|
|
UPDATE t1 SET a = 5, b = 5 WHERE a = 1;
|
|
SELECT * FROM t1;
|
|
a b
|
|
5 5
|
|
2 2
|
|
3 3
|
|
4 4
|
|
**** On Slave ****
|
|
set @@global.slave_exec_mode= default;
|
|
SHOW STATUS LIKE 'Slave_retried_transactions';
|
|
Variable_name Value
|
|
Slave_retried_transactions 0
|
|
SELECT * FROM t1;
|
|
a b
|
|
5 47
|
|
2 2
|
|
3 3
|
|
4 4
|
|
SHOW SLAVE STATUS;
|
|
Slave_IO_State #
|
|
Master_Host 127.0.0.1
|
|
Master_User root
|
|
Master_Port MASTER_PORT
|
|
Connect_Retry 1
|
|
Master_Log_File master-bin.000001
|
|
Read_Master_Log_Pos #
|
|
Relay_Log_File #
|
|
Relay_Log_Pos #
|
|
Relay_Master_Log_File master-bin.000001
|
|
Slave_IO_Running Yes
|
|
Slave_SQL_Running Yes
|
|
Replicate_Do_DB
|
|
Replicate_Ignore_DB
|
|
Replicate_Do_Table
|
|
Replicate_Ignore_Table #
|
|
Replicate_Wild_Do_Table
|
|
Replicate_Wild_Ignore_Table
|
|
Last_Errno 0
|
|
Last_Error
|
|
Skip_Counter 0
|
|
Exec_Master_Log_Pos #
|
|
Relay_Log_Space #
|
|
Until_Condition None
|
|
Until_Log_File
|
|
Until_Log_Pos 0
|
|
Master_SSL_Allowed No
|
|
Master_SSL_CA_File
|
|
Master_SSL_CA_Path
|
|
Master_SSL_Cert
|
|
Master_SSL_Cipher
|
|
Master_SSL_Key
|
|
Seconds_Behind_Master #
|
|
Master_SSL_Verify_Server_Cert No
|
|
Last_IO_Errno #
|
|
Last_IO_Error #
|
|
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;
|