mysql-test/extra/rpl_tests/rpl_slave_idempotent_recovery.inc (154 lines of code) (raw):

connection slave; source include/stop_slave.inc; change master to master_auto_position=1; source include/start_slave.inc; connection master; echo "Create schema and pre-insert some rows"; drop table if exists t1; drop table if exists t2; eval create table t1(a int primary key, b int unique, c int, d int, e mediumtext NOT NULL, key(c)) engine = $engine; eval create table t2(a int primary key, b int, c int, d mediumtext) engine = $engine; disable_query_log; let $j= 1000; while ($j <= 1020) { eval insert into t1 values($j, $j, $j, $j, $j); inc $j; } enable_query_log; source include/sync_slave_sql_with_master.inc; connection slave; flush logs; let $slave_binlog_file = query_get_value("SHOW MASTER STATUS", "File", 1); let $slave_binlog_size = query_get_value("SHOW MASTER STATUS", "Position", 1); connection master; echo "Execute transctions which will be recovered:"; let $i= 1; # cursor for new rows to be inserted let $j= 1000; # cursor for already exiting rows let $col= a; echo "PrimaryKey: insert then update"; eval insert into t1 values($i, $i, $i, $i, $i); eval update t1 set $col = $col + 100 where $col = $i; inc $i; echo "PrimaryKey: insert then delete"; eval insert into t1 values($i, $i, $i, $i, $i); eval delete from t1 where $col = $i; inc $i; echo "PrimaryKey: update then delete"; eval update t1 set $col = $col + 100 where $col = $j; eval delete from t1 where $col = $j + 100; inc $j; echo "PrimaryKey: delete then insert"; eval delete from t1 where $col = $j; eval insert into t1 values($j, $j, $j, $j, $j); inc $j; let $col= b; echo "UniqueKey: insert then update"; eval insert into t1 values($i, $i, $i, $i, $i); eval update t1 set $col = $col + 100 where $col = $i; inc $i; echo "UniqueKey: insert then delete"; eval insert into t1 values($i, $i, $i, $i, $i); eval delete from t1 where $col = $i; inc $i; echo "UniqueKey: update then delete"; eval update t1 set $col = $col + 100 where $col = $j; eval delete from t1 where $col = $j + 100; inc $j; echo "UniqueKey: delete then insert"; eval delete from t1 where $col = $j; eval insert into t1 values($j, $j, $j, $j, $j); inc $j; echo "UniqueKey: update blob"; eval insert into t1 values($i, $i, $i, $i, $i); eval update t1 set b = b + 100, e = CONCAT('aaa', $i) where a = $i; eval update t1 set b = b + 100 where a = $i; inc $i; let $col= c; echo "NonUniqueKey: insert then update"; eval insert into t1 values($i, $i, $i, $i, $i); eval update t1 set $col = $col + 100 where $col = $i; inc $i; echo "NonUniqueKey: insert then delete"; eval insert into t1 values($i, $i, $i, $i, $i); eval delete from t1 where $col = $i; inc $i; echo "NonUniqueKey: update then delete"; eval update t1 set $col = $col + 100 where $col = $j; eval delete from t1 where $col = $j + 100; inc $j; echo "NonUniqueKey: delete then insert"; eval delete from t1 where $col = $j; eval insert into t1 values($j, $j, $j, $j, $j); inc $j; let $col= d; echo "NonKey: insert then update"; eval insert into t1 values($i, $i, $i, $i, $j); eval update t1 set $col = $col + 100 where $col = $i; inc $i; echo "NonKey: insert then delete"; eval insert into t1 values($i, $i, $i, $i, $i); eval delete from t1 where $col = $i; inc $i; echo "NonKey: update then delete"; eval update t1 set $col = $col + 100 where $col = $j; eval delete from t1 where $col = $j + 100; inc $j; echo "NonKey: delete then insert"; eval delete from t1 where $col = $j; eval insert into t1 values($j, $j, $j, $j, $j); inc $j; echo "AllUniqueKeys: insert then update"; eval insert into t1 values($i, $i, $i, $i, $i); eval update t1 set a = a + 100, b = b + 100 where a = $i; inc $i; echo "AllUniqueKeys: update then delete"; eval update t1 set a = a + 100, b = b + 100 where a = $j; eval delete from t1 where a = $j + 100; inc $j; echo "AllKeys: insert then update"; eval insert into t1 values($i, $i, $i, $i, $i); eval update t1 set a = a + 100, b = b + 100, c = c + 100 where a = $i; inc $i; echo "AllKeys: update then delete"; eval update t1 set a = a + 100, b = b + 100, c = c + 100 where a = $j; eval delete from t1 where a = $j + 100; inc $j; echo "AllCols: insert then update"; eval insert into t1 values($i, $i, $i, $i, $i); eval update t1 set a = a + 100, b = b + 100, c = c + 100, d = d + 100 where a = $i; inc $i; echo "AllCols: update then delete"; eval update t1 set a = a + 100, b = b + 100, c = c + 100, d = d + 100 where a = $j; eval delete from t1 where a = $j + 100; inc $j; echo "PrimaryKey(t2): insert then update" eval insert into t2 values(1, 1, 1); eval update t2 set a = a + 100 where a = 1; source include/sync_slave_sql_with_master.inc; connection slave; # Truncate the binlog let $MYSQLD_DATADIR = `select @@datadir`; exec truncate -s $slave_binlog_size $MYSQLD_DATADIR/$slave_binlog_file; flush engine logs; let $rpl_server_number = 2; let $rpl_force_stop = 1; source include/rpl_restart_server.inc; connection slave; source include/start_slave.inc; connection master; source include/sync_slave_sql_with_master.inc; echo "Check if master and slave have the same data"; let $diff_tables= master:t1, slave:t1; source include/diff_tables.inc; echo "Check if slave binlogs are generated correctly"; connection slave; exec $MYSQL_BINLOG -v -v $MYSQLD_DATADIR/slave-bin.0* > $MYSQLTEST_VARDIR/tmp/fulldump.sql; reset master; exec $MYSQL --user=root --host=127.0.0.1 --port=$SLAVE_MYPORT < $MYSQLTEST_VARDIR/tmp/fulldump.sql; remove_file $MYSQLTEST_VARDIR/tmp/fulldump.sql; let $diff_tables= master:t1, slave:t1; source include/diff_tables.inc; connection master; drop table t1; drop table t2; source include/sync_slave_sql_with_master.inc;