# # Test is run with max_binlog_size=2048 to force automatic rotation of the # binary log # Tests done: # - Check that slaves reports correct failures if master.info has strange # modes/information # - Automatic binary log rotation # - Ensure that temporary tables works over flush logs and binary log # changes # - Test creating a duplicate key error and recover from it connect (master,localhost,root,,test,$MASTER_MYPORT,master.sock); --disable_warnings drop table if exists t1, t2, t3, t4; --enable_warnings connect (slave,localhost,root,,test,$SLAVE_MYPORT,slave.sock); system cat /dev/null > var/slave-data/master.info; system chmod 000 var/slave-data/master.info; connection slave; --disable_warnings drop table if exists t1, t2, t3, t4; --enable_warnings # START SLAVE will fail because it can't read the file (mode 000) # (system error 13) --error 1201 start slave; system chmod 600 var/slave-data/master.info; # It will fail again because the file is empty so the slave cannot get valuable # info about how to connect to the master from it (failure in # init_strvar_from_file() in init_master_info()). --error 1201 start slave; --replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT # CHANGE MASTER will fail because it first parses master.info before changing # it (so when master.info is bad, people have to use RESET SLAVE first). --error 1201 eval change master to master_host='127.0.0.1',master_port=$MASTER_MYPORT, master_user='root'; reset slave; --replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT eval change master to master_host='127.0.0.1',master_port=$MASTER_MYPORT, master_user='root'; connection master; reset master; connection slave; start slave; connection master; # # Test FLUSH LOGS # create temporary table temp_table (a char(80) not null); insert into temp_table values ("testing temporary tables"); create table t1 (s text); insert into t1 values('Could not break slave'),('Tried hard'); sync_slave_with_master; --replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT --replace_column 1 # 33 # show slave status; select * from t1; connection master; flush logs; create table t2(m int not null auto_increment primary key); insert into t2 values (34),(67),(123); flush logs; show binary logs; create table t3 select * from temp_table; sync_slave_with_master; select * from t3; connection master; drop table temp_table, t3; # # Now lets make some duplicate key mess and see if we can recover from it # # First insert a value on the slave connection slave; insert into t2 values(1234); #same value on the master connection master; set insert_id=1234; insert into t2 values(NULL); connection slave; wait_for_slave_to_stop; #restart slave skipping one event set global sql_slave_skip_counter=1; start slave; connection master; #let slave catch up sync_slave_with_master; connection master; purge master logs to 'master-bin.000002'; show master logs; # we just tests if synonyms are accepted purge binary logs to 'master-bin.000002'; show binary logs; # sleeping 10 seconds or more would make the slave believe connection is down --real_sleep 1; purge master logs before now(); show binary logs; insert into t2 values (65); sync_slave_with_master; --replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT --replace_column 1 # 33 # show slave status; select * from t2; # # Test forcing the replication log to rotate # connection master; create temporary table temp_table (a char(80) not null); insert into temp_table values ("testing temporary tables part 2"); let $1=100; create table t3 (n int); disable_query_log; while ($1) { #eval means expand $ expressions eval insert into t3 values($1 + 4); dec $1; } enable_query_log; create table t4 select * from temp_table; show binary logs; show master status; save_master_pos; connection slave; sync_with_master; select * from t4; --replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT --replace_column 1 # 33 # show slave status; # because of concurrent insert, the table may not be up to date # if we do not lock lock tables t3 read; select count(*) from t3 where n >= 4; unlock tables; #clean up connection master; drop table if exists t1,t2,t3,t4; sync_slave_with_master;