mirror of
https://github.com/MariaDB/server.git
synced 2025-01-20 05:52:27 +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.
147 lines
5.5 KiB
Text
147 lines
5.5 KiB
Text
# Requires statement logging
|
|
|
|
# Clean up old slave's binlogs.
|
|
# The slave is started with --log-slave-updates
|
|
# and this test does SHOW BINLOG EVENTS on the slave's
|
|
# binlog. But previous tests can influence the current test's
|
|
# binlog (e.g. a temporary table in the previous test has not
|
|
# been explicitly deleted, and at the beginning of the current
|
|
# test the slave immediately writes DROP TEMPORARY TABLE this_old_table).
|
|
# We wait for the slave to have written all he wants to the binlog
|
|
# (otherwise RESET MASTER may come too early).
|
|
sync_slave_with_master;
|
|
source include/stop_slave.inc;
|
|
--source include/wait_for_slave_to_stop.inc
|
|
reset master;
|
|
reset slave;
|
|
start slave;
|
|
--source include/wait_for_slave_to_start.inc
|
|
|
|
let $VERSION=`select version()`;
|
|
|
|
connection master;
|
|
eval create table t1(n int not null auto_increment primary key)ENGINE=$engine_type;
|
|
insert into t1 values (NULL);
|
|
drop table t1;
|
|
let $LOAD_FILE= ../../std_data/words.dat;
|
|
if (!`SELECT length(load_file('$LOAD_FILE'))`){
|
|
let $LOAD_FILE= ../$LOAD_FILE;
|
|
}
|
|
eval create table t1 (word char(20) not null)ENGINE=$engine_type;
|
|
--replace_result $LOAD_FILE LOAD_FILE
|
|
eval load data infile '$LOAD_FILE' into table t1 ignore 1 lines;
|
|
select count(*) from t1;
|
|
--replace_result $VERSION VERSION
|
|
--replace_column 2 # 5 #
|
|
--replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/
|
|
show binlog events;
|
|
--replace_column 2 # 5 #
|
|
--replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/
|
|
show binlog events from 107 limit 1;
|
|
--replace_column 2 # 5 #
|
|
--replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/
|
|
show binlog events from 107 limit 2;
|
|
--replace_column 2 # 5 #
|
|
--replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/
|
|
show binlog events from 107 limit 1,4;
|
|
flush logs;
|
|
|
|
# We need an extra update before doing save_master_pos.
|
|
# Otherwise, an unlikely scenario may occur:
|
|
# * When the master's binlog_dump thread reads the end of master-bin.001,
|
|
# it send the rotate event which is at this end, plus a fake rotate event
|
|
# because it's starting to read a new binlog.
|
|
# save_master_pos will record the position of the first of the two rotate
|
|
# (because the fake one is not in the master's binlog anyway).
|
|
# * Later the slave waits for the position of the first rotate event,
|
|
# and it may quickly stop (in 'slave stop') without having received the fake
|
|
# one.
|
|
# So, depending on a few milliseconds, we end up with 2 rotate events in the
|
|
# relay log or one, which influences the output of SHOW SLAVE STATUS, making
|
|
# it not predictable and causing random test failures.
|
|
# To make it predictable, we do a useless update now, but which has the
|
|
# interest of making the slave catch both rotate events.
|
|
|
|
eval create table t3 (a int)ENGINE=$engine_type;
|
|
|
|
# Sync slave and force it to start on another binary log
|
|
|
|
#show rows of t1 on master
|
|
connection master;
|
|
select * from t1 order by 1 asc;
|
|
|
|
sync_slave_with_master;
|
|
|
|
#check t1 on slave to ensure whether it's identical with on master
|
|
select * from t1 order by 1 asc;
|
|
flush logs;
|
|
source include/stop_slave.inc;
|
|
source include/start_slave.inc;
|
|
connection master;
|
|
|
|
# Create some entries for second log
|
|
|
|
eval create table t2 (n int)ENGINE=$engine_type;
|
|
insert into t2 values (1);
|
|
source include/show_binlog_events.inc;
|
|
--replace_result $VERSION VERSION
|
|
--replace_regex /file_id=[0-9]+/file_id=#/ /block_len=[0-9]+/block_len=#/ /infile '.+'/infile 'words.dat'/
|
|
--replace_column 2 # 5 #
|
|
--replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/
|
|
show binlog events in 'master-bin.000002';
|
|
--replace_column 2 #
|
|
show binary logs;
|
|
sync_slave_with_master;
|
|
--source include/wait_for_slave_to_start.inc
|
|
--replace_column 2 #
|
|
show binary logs;
|
|
--replace_result $MASTER_MYPORT MASTER_PORT $VERSION VERSION
|
|
--replace_column 2 # 5 #
|
|
--replace_regex /file_id=[0-9]+/file_id=#/ /block_len=[0-9]+/block_len=#/ /INFILE '.+'/INFILE 'words.dat'/
|
|
--replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/
|
|
show binlog events in 'slave-bin.000001' from 4;
|
|
--replace_result $MASTER_MYPORT MASTER_PORT $VERSION VERSION
|
|
--replace_column 2 # 5 #
|
|
--replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/
|
|
show binlog events in 'slave-bin.000002' from 4;
|
|
source include/show_slave_status2.inc;
|
|
|
|
# Need to recode the following
|
|
|
|
#show new master for slave with master_log_file='master-bin.000001' and master_log_pos=4 and master_server_id=1;
|
|
#show new master for slave with master_log_file='master-bin.000001' and master_log_pos=79 and master_server_id=1;
|
|
#show new master for slave with master_log_file='master-bin.000001' and master_log_pos=311 and master_server_id=1;
|
|
#show new master for slave with master_log_file='master-bin.000002' and master_log_pos=4 and master_server_id=1;
|
|
#show new master for slave with master_log_file='master-bin.000002' and master_log_pos=122 and master_server_id=1;
|
|
|
|
--error 1220
|
|
show binlog events in 'slave-bin.000005' from 4;
|
|
|
|
connection master;
|
|
|
|
# The table drops caused Cluster Replication wrapper to fail as event ID would never be the same.# Moving drops here.
|
|
|
|
DROP TABLE t1;
|
|
DROP TABLE t2;
|
|
DROP TABLE t3;
|
|
|
|
#
|
|
# Bug #6880: LAST_INSERT_ID() within a statement
|
|
#
|
|
|
|
# Reset binlog so that show binlog events will not show the tests
|
|
# above.
|
|
source include/master-slave-reset.inc;
|
|
connection master;
|
|
|
|
create table t1(a int auto_increment primary key, b int);
|
|
insert into t1 values (NULL, 1);
|
|
set insert_id=5;
|
|
insert into t1 values (NULL, last_insert_id()), (NULL, last_insert_id());
|
|
source include/show_binlog_events.inc;
|
|
select * from t1;
|
|
drop table t1;
|
|
|
|
# End of 4.1 tests
|
|
|
|
sync_slave_with_master;
|