mirror of
https://github.com/MariaDB/server.git
synced 2025-01-21 22:34:18 +01:00
ddc8765a9e
Conflicts: - mysql-test/suite/rpl/r/rpl_binlog_grant.result - mysql-test/suite/rpl/r/rpl_sp.result - mysql-test/suite/rpl/t/rpl_binlog_grant.test - sql/sql_parse.cc - sql/sql_table.cc - sql/sql_test.cc
202 lines
6.3 KiB
Text
202 lines
6.3 KiB
Text
# ==== 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
|
|
|
|
# Test is dependent on binlog positions
|
|
|
|
# prepare version for substitutions
|
|
let $VERSION=`select version()`;
|
|
|
|
# Stop slave before it starts replication. Also sync with master
|
|
# to avoid nondeterministic behaviour.
|
|
--echo [on slave]
|
|
sync_slave_with_master;
|
|
--source include/stop_slave.inc
|
|
|
|
--echo ==== Create some events on master ====
|
|
|
|
--echo [on master]
|
|
connection master;
|
|
create table t1(n int not null auto_increment primary key);
|
|
insert into t1 values (1),(2),(3),(4);
|
|
drop table t1;
|
|
create table t2(n int not null auto_increment primary key);
|
|
insert into t2 values (1),(2);
|
|
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
|
|
--echo [on slave]
|
|
connection slave;
|
|
start slave until master_log_file='master-bin.000001', master_log_pos=323;
|
|
--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;
|
|
source include/show_slave_status2.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;
|
|
source include/show_slave_status2.inc;
|
|
|
|
# try replicate all up to and not including the second insert to t2;
|
|
start slave until relay_log_file='slave-relay-bin.000004', relay_log_pos=891;
|
|
--source include/wait_for_slave_io_to_start.inc
|
|
--source include/wait_for_slave_sql_to_stop.inc
|
|
select * from t2;
|
|
source include/show_slave_status2.inc;
|
|
|
|
# clean up
|
|
start slave;
|
|
--echo [on master]
|
|
connection master;
|
|
--echo [on slave]
|
|
sync_slave_with_master;
|
|
--source include/stop_slave.inc
|
|
|
|
# this should stop immediately as we are already there
|
|
start slave until master_log_file='master-bin.000001', master_log_pos=776;
|
|
--source include/wait_for_slave_io_to_start.inc
|
|
--source include/wait_for_slave_sql_to_stop.inc
|
|
--replace_result bin.000005 bin.000004 bin.000006 bin.000004 bin.000007 bin.000004
|
|
source include/show_slave_status2.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
|
|
reset slave;
|
|
--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 $until_pos UNTIL_POS;
|
|
eval start slave until master_log_file='master-bin.000001', 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;
|
|
|
|
# Bug #47142 "slave start until" stops 1 event too late in 4.1 to 5.0 replication
|
|
#
|
|
# testing fixes that refine the start position of prior-5.0 master's event
|
|
# and by that provide correct execution of
|
|
# START SLAVE UNTIL ... master_log_pos= x;
|
|
# Keep the test at the end of the file because it manipulates with binlog files
|
|
# to substitute the genuine one with a prepared on 4.1 server.
|
|
#
|
|
|
|
--source include/master-slave-reset.inc
|
|
|
|
connection master;
|
|
drop table if exists t1; # there is create table t1 in bug47142_master-bin.000001
|
|
flush logs;
|
|
let $MYSQLD_DATADIR= `select @@datadir`;
|
|
--remove_file $MYSQLD_DATADIR/master-bin.000001
|
|
--copy_file $MYSQL_TEST_DIR/std_data/bug47142_master-bin.000001 $MYSQLD_DATADIR/master-bin.000001
|
|
|
|
connection slave;
|
|
stop slave;
|
|
reset slave;
|
|
start slave until master_log_file='master-bin.000001', master_log_pos=294 /* to stop right before DROP */;
|
|
--source include/wait_for_slave_sql_to_stop.inc
|
|
|
|
show tables /* t1 must exist */;
|
|
|
|
# clean-up of Bug #47142 testing
|
|
|
|
drop table t1; # drop on slave only, master does not have t1.
|
|
stop slave;
|
|
reset slave;
|
|
|
|
connection master;
|
|
reset master;
|
|
|
|
# End of tests
|