diff options
Diffstat (limited to 'mysql-test/suite/rpl/t/rpl_stm_until.test')
-rw-r--r-- | mysql-test/suite/rpl/t/rpl_stm_until.test | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/mysql-test/suite/rpl/t/rpl_stm_until.test b/mysql-test/suite/rpl/t/rpl_stm_until.test new file mode 100644 index 00000000..ebfd355b --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_stm_until.test @@ -0,0 +1,184 @@ +# ==== Purpose ==== +# +# Verify that START SLAVE UNTIL replicates until the given binlog +# position but not longer. Verify that START SLAVE UNTIL with various +# incorrect arguments gives an error. +# +# ==== Method ==== +# +# On master, create a table and insert some rows. On slave, START +# SLAVE UNTIL so that it reads one event at a time, and check the +# table and the slave status each time. +# +# Then, on slave, run START SLAVE UNTIL with incorrect arguments and +# verify that it gives an error. +# +# ==== Related bugs ==== +# +# Bug in this test: BUG#37717: rpl.rpl_stm_until 'stmt' fails sporadically on pushbuild + +-- source include/have_binlog_format_mixed_or_statement.inc +-- source include/master-slave.inc +--let $master_use_gtid_option= No +-- source include/rpl_reset.inc + +# Test is dependent on binlog positions +call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); + +# prepare version for substitutions +let $VERSION=`select version()`; + +# Stop slave before it starts replication. Also sync with master +# to avoid nondeterministic behaviour. +sync_slave_with_master; +--source include/stop_slave.inc + +--echo ==== Create some events on master ==== + +connection master; +create table t1(n int not null auto_increment primary key); +insert into t1 values (1),(2),(3),(4); +let $master_log_pos_1= query_get_value(SHOW MASTER STATUS, Position, 1); +let $master_log_file= query_get_value(SHOW MASTER STATUS, File, 1); +drop table t1; +create table t2(n int not null auto_increment primary key); +insert into t2 values (1),(2); +let $master_log_pos_2= query_get_value(SHOW MASTER STATUS, Position, 1); +insert into t2 values (3),(4); +drop table t2; + +--echo ==== Replicate one event at a time on slave ==== + +# try to replicate all queries until drop of t1 +connection slave; +--replace_result $master_log_file MASTER_LOG_FILE $master_log_pos_1 MASTER_LOG_POS +eval start slave until master_log_file='$master_log_file', master_log_pos=$master_log_pos_1; +--source include/wait_for_slave_io_to_start.inc +--source include/wait_for_slave_sql_to_stop.inc +# here table should be still not deleted +select * from t1; +--let $slave_param= Exec_Master_Log_Pos +--let $slave_param_value= $master_log_pos_1 +--source include/check_slave_param.inc + +# this should fail right after start +start slave until master_log_file='master-no-such-bin.000001', master_log_pos=291; +--source include/wait_for_slave_io_to_start.inc +--source include/wait_for_slave_sql_to_stop.inc +# again this table should be still not deleted +select * from t1; +--let $slave_param= Exec_Master_Log_Pos +--let $slave_param_value= $master_log_pos_1 +--source include/check_slave_param.inc + +let $relay_log_file= slave-relay-bin.000003; +let $master_log_pos= $master_log_pos_2; +source include/get_relay_log_pos.inc; +# try replicate all up to and not including the second insert to t2; +--replace_result $relay_log_pos RELAY_LOG_POS +eval start slave until relay_log_file='$relay_log_file', relay_log_pos=$relay_log_pos; +--source include/wait_for_slave_io_to_start.inc +--source include/wait_for_slave_sql_to_stop.inc +select * from t2; +--let $slave_param= Exec_Master_Log_Pos +--let $slave_param_value= $master_log_pos +--source include/check_slave_param.inc + +# clean up +start slave; +connection master; +sync_slave_with_master; +--source include/stop_slave.inc + +--let $exec_log_pos_1= query_get_value(SHOW SLAVE STATUS, Exec_Master_Log_Pos, 1) +# this should stop immediately as we are already there +--replace_result $master_log_file MASTER_LOG_FILE $master_log_pos_2 MASTER_LOG_POS +eval start slave until master_log_file='$master_log_file', master_log_pos=$master_log_pos_2; +--source include/wait_for_slave_io_to_start.inc +--source include/wait_for_slave_sql_to_stop.inc +--let $slave_param= Exec_Master_Log_Pos +--let $slave_param_value= $exec_log_pos_1 +--source include/check_slave_param.inc + +--echo ==== Test various error conditions ==== + +--error 1277 +start slave until master_log_file='master-bin', master_log_pos=561; +--error 1277 +start slave until master_log_file='master-bin.000001', master_log_pos=561, relay_log_pos=12; +--error 1277 +start slave until master_log_file='master-bin.000001'; +--error 1277 +start slave until relay_log_file='slave-relay-bin.000002'; +--error 1277 +start slave until relay_log_file='slave-relay-bin.000002', master_log_pos=561; +# Warning should be given for second command +start slave sql_thread; +start slave until master_log_file='master-bin.000001', master_log_pos=776; + +# +# bug#47210 first execution of "start slave until" stops too early +# +# testing that a slave rotate event that is caused by stopping the slave +# does not intervene anymore in UNTIL condition. +# + +connection slave; +source include/stop_slave.inc; +--disable_warnings +drop table if exists t1; +--enable_warnings +--source include/reset_slave.inc +--replace_result $MASTER_MYPORT MASTER_PORT +eval change master to master_host='127.0.0.1',master_port=$MASTER_MYPORT, master_user='root'; + +connection master; +--disable_warnings +drop table if exists t1; +--enable_warnings +reset master; +create table t1 (a int primary key auto_increment); +save_master_pos; +let $master_pos= query_get_value(SHOW MASTER STATUS, Position, 1); + +connection slave; +start slave; +sync_with_master; + +# at this point slave will close the relay log stamping it with its own +# Rotate log event. This event won't be examined on matter of the master +# UNTIL pos anymore. +source include/stop_slave.inc; +let $slave_exec_pos= query_get_value(SHOW SLAVE STATUS, Exec_Master_Log_Pos, 1); + +--echo master and slave are in sync now +let $diff_pos= `select $master_pos - $slave_exec_pos`; +eval select $diff_pos as zero; + +connection master; +insert into t1 set a=null; +let $until_pos= query_get_value(SHOW MASTER STATUS, Position, 1); +insert into t1 set a=null; +select count(*) as two from t1; + +connection slave; +--replace_result $master_log_file MASTER_LOG_FILE $until_pos UNTIL_POS; +eval start slave until master_log_file='$master_log_file', master_log_pos= $until_pos; +source include/wait_for_slave_sql_to_stop.inc; +let $slave_exec_pos= query_get_value(SHOW SLAVE STATUS, Exec_Master_Log_Pos, 1); +--echo slave stopped at the prescribed position +let $diff_pos= `select $until_pos - $slave_exec_pos`; +eval select $diff_pos as zero; +select count(*) as one from t1; + + +connection master; +drop table t1; + +connection slave; +start slave; +sync_with_master; + +# End of tests +--let $rpl_only_running_threads= 1 +--source include/rpl_end.inc |