mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 10:31:54 +01:00
19c380aaff
Non-transactional updates that take place inside a transaction present problems for logging because they are visible to other clients before the transaction is committed, and they are not rolled back even if the transaction is rolled back. It is not always possible to log correctly in statement format when both transactional and non-transactional tables are used in the same transaction. In the current patch, we ensure that such scenario is completely safe under the ROW and MIXED modes.
123 lines
3.2 KiB
Text
123 lines
3.2 KiB
Text
#
|
|
# Bug#11401: Load data infile 'REPLACE INTO' fails on slave.
|
|
#
|
|
connection master;
|
|
CREATE TABLE t4 (
|
|
id INT(5) unsigned NOT NULL auto_increment,
|
|
name varchar(15) NOT NULL default '',
|
|
number varchar(35) NOT NULL default 'default',
|
|
PRIMARY KEY (id),
|
|
UNIQUE KEY unique_rec (name,number)
|
|
) ENGINE=InnoDB;
|
|
|
|
--disable_warnings
|
|
LOAD DATA
|
|
INFILE '../../std_data/loaddata_pair.dat'
|
|
REPLACE INTO TABLE t4
|
|
(name,number);
|
|
--enable_warnings
|
|
SELECT * FROM t4;
|
|
|
|
sync_slave_with_master;
|
|
SELECT * FROM t4;
|
|
|
|
connection master;
|
|
--disable_warnings
|
|
LOAD DATA
|
|
INFILE '../../std_data/loaddata_pair.dat'
|
|
REPLACE INTO TABLE t4
|
|
(name,number);
|
|
--enable_warnings
|
|
SELECT * FROM t4;
|
|
|
|
sync_slave_with_master;
|
|
SELECT * FROM t4;
|
|
|
|
connection master;
|
|
--disable_query_log
|
|
DROP TABLE t4;
|
|
--enable_query_log
|
|
sync_slave_with_master;
|
|
connection master;
|
|
|
|
# End of 4.1 tests
|
|
|
|
#
|
|
# Bug #26418: Slave out of sync after CREATE/DROP TEMPORARY TABLE + ROLLBACK
|
|
# on master
|
|
#
|
|
#Note Matthias: to be merged to rpl_ddl.test
|
|
|
|
--source include/not_ndb_default.inc
|
|
|
|
FLUSH LOGS;
|
|
sync_slave_with_master;
|
|
FLUSH LOGS;
|
|
connection master;
|
|
let $engine_type= "InnoDB";
|
|
|
|
--disable_warnings
|
|
DROP DATABASE IF EXISTS mysqltest1;
|
|
--enable_warnings
|
|
|
|
CREATE DATABASE mysqltest1;
|
|
CREATE TEMPORARY TABLE mysqltest1.tmp (f1 BIGINT);
|
|
eval CREATE TABLE mysqltest1.t1 (f1 BIGINT) ENGINE=$engine_type;
|
|
SET AUTOCOMMIT = 0;
|
|
|
|
sync_slave_with_master;
|
|
--echo -------- switch to slave --------
|
|
connection slave;
|
|
|
|
# We want to verify that the following transactions are written to the
|
|
# binlog, despite the transaction is rolled back. (They should be
|
|
# written to the binlog since they contain non-transactional DROP
|
|
# TEMPORARY TABLE). To see that, we use the auxiliary table t1, which
|
|
# is transactional (InnoDB) on master and MyISAM on slave. t1 should
|
|
# be transactional on master so that the insert into t1 does not cause
|
|
# the transaction to be logged. Since t1 is non-transactional on
|
|
# slave, the change will not be rolled back, so the inserted rows will
|
|
# stay in t1 and we can verify that the transaction was replicated.
|
|
#
|
|
# Note, however, that the previous explanation is not true for ROW and
|
|
# MIXED modes as rollback on a transactional table is not written to
|
|
# the binary log.
|
|
ALTER TABLE mysqltest1.t1 ENGINE = MyISAM;
|
|
SHOW CREATE TABLE mysqltest1.t1;
|
|
|
|
--echo -------- switch to master --------
|
|
connection master;
|
|
INSERT INTO mysqltest1.t1 SET f1= 1;
|
|
DROP TEMPORARY TABLE mysqltest1.tmp;
|
|
ROLLBACK;
|
|
--error ER_NO_SUCH_TABLE
|
|
SHOW CREATE TABLE mysqltest1.tmp;
|
|
# Must return no rows here
|
|
SELECT COUNT(*) FROM mysqltest1.t1;
|
|
|
|
INSERT INTO mysqltest1.t1 SET f1= 2;
|
|
CREATE TEMPORARY TABLE mysqltest1.tmp2(a INT);
|
|
ROLLBACK;
|
|
SHOW CREATE TABLE mysqltest1.tmp2;
|
|
# Must return no rows here
|
|
SELECT COUNT(*) FROM mysqltest1.t1;
|
|
|
|
sync_slave_with_master;
|
|
--echo -------- switch to slave --------
|
|
connection slave;
|
|
--error ER_NO_SUCH_TABLE
|
|
SHOW CREATE TABLE mysqltest1.tmp;
|
|
--error ER_NO_SUCH_TABLE
|
|
SHOW CREATE TABLE mysqltest1.tmp2;
|
|
# t1 has two rows here: the transaction not rolled back since t1 uses MyISAM
|
|
SELECT COUNT(*) FROM mysqltest1.t1;
|
|
FLUSH LOGS;
|
|
|
|
--echo -------- switch to master --------
|
|
connection master;
|
|
FLUSH LOGS;
|
|
|
|
DROP DATABASE mysqltest1;
|
|
-- source include/master-slave-end.inc
|
|
|
|
--echo End of 5.1 tests
|