rpl_stm_until.test 5.21 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
# ==== 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

20
-- source include/have_binlog_format_mixed_or_statement.inc
21 22 23
-- source include/master-slave.inc

# Test is dependent on binlog positions
24

Serge Kozlov's avatar
Serge Kozlov committed
25 26 27
# prepare version for substitutions
let $VERSION=`select version()`;

28 29 30
# Stop slave before it starts replication.  Also sync with master
# to avoid nondeterministic behaviour.
--echo [on slave]
31 32
sync_slave_with_master;
--source include/stop_slave.inc
33

34 35 36
--echo ==== Create some events on master ====

--echo [on master]
37 38 39 40 41 42 43 44 45
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;

46 47
--echo ==== Replicate one event at a time on slave ====

48
# try to replicate all queries until drop of t1
49
--echo [on slave]
50
connection slave;
51
start slave until master_log_file='master-bin.000001', master_log_pos=323;
52
--source include/wait_for_slave_io_to_start.inc
53
--source include/wait_for_slave_sql_to_stop.inc
54 55
# here table should be still not deleted
select * from t1;
hezx@mail.hezx.com's avatar
hezx@mail.hezx.com committed
56
source include/show_slave_status2.inc;
57 58 59

# this should fail right after start
start slave until master_log_file='master-no-such-bin.000001', master_log_pos=291;
60
--source include/wait_for_slave_io_to_start.inc
61
--source include/wait_for_slave_sql_to_stop.inc
62 63
# again this table should be still not deleted
select * from t1;
hezx@mail.hezx.com's avatar
hezx@mail.hezx.com committed
64
source include/show_slave_status2.inc;
65

66
# try replicate all up to and not including the second insert to t2;
67
start slave until relay_log_file='slave-relay-bin.000004', relay_log_pos=891;
68
--source include/wait_for_slave_io_to_start.inc
69
--source include/wait_for_slave_sql_to_stop.inc
70
select * from t2;
hezx@mail.hezx.com's avatar
hezx@mail.hezx.com committed
71
source include/show_slave_status2.inc;
72 73 74

# clean up
start slave;
75
--echo [on master]
76
connection master;
77
--echo [on slave]
78 79
sync_slave_with_master;
--source include/stop_slave.inc
80

81
# this should stop immediately as we are already there
82
start slave until master_log_file='master-bin.000001', master_log_pos=776;
83
--source include/wait_for_slave_io_to_start.inc
84
--source include/wait_for_slave_sql_to_stop.inc
85
--replace_result bin.000005 bin.000004 bin.000006 bin.000004 bin.000007 bin.000004
hezx@mail.hezx.com's avatar
hezx@mail.hezx.com committed
86
source include/show_slave_status2.inc;
87

88 89
--echo ==== Test various error conditions ====

monty@mysql.com's avatar
monty@mysql.com committed
90
--error 1277
91
start slave until master_log_file='master-bin', master_log_pos=561;
monty@mysql.com's avatar
monty@mysql.com committed
92
--error 1277
93
start slave until master_log_file='master-bin.000001', master_log_pos=561, relay_log_pos=12;
monty@mysql.com's avatar
monty@mysql.com committed
94
--error 1277
95
start slave until master_log_file='master-bin.000001';
monty@mysql.com's avatar
monty@mysql.com committed
96
--error 1277
97
start slave until relay_log_file='slave-relay-bin.000002';
monty@mysql.com's avatar
monty@mysql.com committed
98
--error 1277
99
start slave until relay_log_file='slave-relay-bin.000002', master_log_pos=561;
100
# Warning should be given for second command
101
start slave sql_thread;
102
start slave until master_log_file='master-bin.000001', master_log_pos=776;
103

104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
#
# 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;

# End of tests