mirror of
https://github.com/MariaDB/server.git
synced 2025-01-20 22:12:30 +01:00
bd53d21417
TRUNCATE TABLE fails to replicate when stmt-based binlogging is not supported. There were two separate problems with the code, both of which are fixed with this patch: 1. An error was printed by InnoDB for TRUNCATE TABLE in statement mode when the in isolation levels READ COMMITTED and READ UNCOMMITTED since InnoDB does permit statement-based replication for DML statements. However, the TRUNCATE TABLE is not transactional, but is a DDL, and should therefore be allowed to be replicated as a statement. 2. The statement was not logged in mixed mode because of the error above, but the error was not reported to the client. This patch fixes the problem by treating TRUNCATE TABLE a DDL, that is, it is always logged as a statement and not reporting an error from InnoDB for TRUNCATE TABLE. mysql-test/extra/binlog_tests/binlog_truncate.test: Adding new test to check that TRUNCATE TABLE is written correctly to the binary log. mysql-test/extra/rpl_tests/rpl_truncate.test: Removing redundant testing by eliminating settings of BINLOG_FORMAT. mysql-test/extra/rpl_tests/rpl_truncate_helper.test: Replacing slave and master reset code with include file. Removing settings of BINLOG_FORMAT. Replacing printing of table contents to compare master and slave with diff_tables.inc. mysql-test/suite/binlog/t/binlog_truncate_innodb.test: Adding test for testing that TRUNCATE TABLE is logged correctly for InnoDB in all isolation levels. mysql-test/suite/binlog/t/binlog_truncate_myisam.test: Adding test for testing that TRUNCATE TABLE is logged correctly for MyISAM. mysql-test/suite/binlog/t/disabled.def: Disabling binlog_truncate_innodb since it does not work (yet). sql/sql_base.cc: Correcting setting of capabilities flags to make the comparison with 0 later in the code work correctly. sql/sql_delete.cc: Re-organizing code to ensure that TRUNCATE TABLE is logged in statement format and that row format is not used unless there are rows to log (which there are not when delete_all_rows() is called, so this has to be logged as a statement).
63 lines
2.5 KiB
Text
63 lines
2.5 KiB
Text
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
|
|
CREATE TABLE t2 (a INT) ENGINE=InnoDB;
|
|
INSERT INTO t2 VALUES (1),(2),(3);
|
|
**** Truncate of empty table shall be logged
|
|
TRUNCATE TABLE t1;
|
|
TRUNCATE TABLE t2;
|
|
show binlog events from <binlog_start>;
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000001 # Query # # use `test`; TRUNCATE TABLE t1
|
|
master-bin.000001 # Query # # use `test`; TRUNCATE TABLE t2
|
|
DROP TABLE t1,t2;
|
|
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
|
|
CREATE TABLE t2 (a INT) ENGINE=InnoDB;
|
|
INSERT INTO t2 VALUES (1),(2),(3);
|
|
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
|
**** Truncate of empty table shall be logged
|
|
TRUNCATE TABLE t1;
|
|
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
|
TRUNCATE TABLE t2;
|
|
show binlog events from <binlog_start>;
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000001 # Query # # use `test`; TRUNCATE TABLE t1
|
|
master-bin.000001 # Query # # use `test`; TRUNCATE TABLE t2
|
|
DROP TABLE t1,t2;
|
|
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
|
|
CREATE TABLE t2 (a INT) ENGINE=InnoDB;
|
|
INSERT INTO t2 VALUES (1),(2),(3);
|
|
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
|
**** Truncate of empty table shall be logged
|
|
TRUNCATE TABLE t1;
|
|
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
|
TRUNCATE TABLE t2;
|
|
show binlog events from <binlog_start>;
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000001 # Query # # use `test`; TRUNCATE TABLE t1
|
|
master-bin.000001 # Query # # use `test`; TRUNCATE TABLE t2
|
|
DROP TABLE t1,t2;
|
|
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
|
|
CREATE TABLE t2 (a INT) ENGINE=InnoDB;
|
|
INSERT INTO t2 VALUES (1),(2),(3);
|
|
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
|
|
**** Truncate of empty table shall be logged
|
|
TRUNCATE TABLE t1;
|
|
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
|
|
TRUNCATE TABLE t2;
|
|
show binlog events from <binlog_start>;
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000001 # Query # # use `test`; TRUNCATE TABLE t1
|
|
master-bin.000001 # Query # # use `test`; TRUNCATE TABLE t2
|
|
DROP TABLE t1,t2;
|
|
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
|
|
CREATE TABLE t2 (a INT) ENGINE=InnoDB;
|
|
INSERT INTO t2 VALUES (1),(2),(3);
|
|
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
|
|
**** Truncate of empty table shall be logged
|
|
TRUNCATE TABLE t1;
|
|
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
|
|
TRUNCATE TABLE t2;
|
|
show binlog events from <binlog_start>;
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000001 # Query # # use `test`; TRUNCATE TABLE t1
|
|
master-bin.000001 # Query # # use `test`; TRUNCATE TABLE t2
|
|
DROP TABLE t1,t2;
|