📄 mix_innodb_myisam_binlog.test
字号:
# Check that binlog is ok when a transaction mixes updates to InnoDB and# MyISAM.# It would be nice to make this a replication test, but in 4.0 the# slave is always with --skip-innodb in the testsuite. I (Guilhem) however# did some tests manually on a slave; tables are replicated fine and# Exec_Master_Log_Pos advances as expected.-- source include/have_log_bin.inc-- source include/have_innodb.inc--disable_warningsdrop table if exists t1, t2;--enable_warningsconnect (con1,localhost,root,,);connect (con2,localhost,root,,);connection con1;create table t1 (a int) engine=innodb;create table t2 (a int) engine=myisam;reset master;begin;insert into t1 values(1);insert into t2 select * from t1;commit;source include/show_binlog_events.inc;delete from t1;delete from t2;reset master;begin;insert into t1 values(2);insert into t2 select * from t1;# should say some changes to non-transact1onal tables couldn't be rolled backrollback;source include/show_binlog_events.inc;delete from t1;delete from t2;reset master;begin;insert into t1 values(3);savepoint my_savepoint;insert into t1 values(4);insert into t2 select * from t1;rollback to savepoint my_savepoint;commit;source include/show_binlog_events.inc;delete from t1;delete from t2;reset master;begin;insert into t1 values(5);savepoint my_savepoint;insert into t1 values(6);insert into t2 select * from t1;rollback to savepoint my_savepoint;insert into t1 values(7);commit;select a from t1 order by a; # check that savepoints work :)source include/show_binlog_events.inc;# and when ROLLBACK is not explicit?delete from t1;delete from t2;reset master;select get_lock("a",10);begin;insert into t1 values(8);insert into t2 select * from t1;disconnect con1;connection con2;# We want to SHOW BINLOG EVENTS, to know what was logged. But there is no# guarantee that logging of the terminated con1 has been done yet (it may not# even be started, so con1 may have not even attempted to lock the binlog yet;# so SHOW BINLOG EVENTS may come before con1 does the loggin. To be sure that# logging has been done, we use a user lock.select get_lock("a",10);source include/show_binlog_events.inc;# and when not in a transact1on?delete from t1;delete from t2;reset master;insert into t1 values(9);insert into t2 select * from t1;source include/show_binlog_events.inc;# Check that when the query updat1ng the MyISAM table is the first in the# transaction, we log it immediately.delete from t1;delete from t2;reset master;insert into t1 values(10); # first make t1 non-emptybegin;insert into t2 select * from t1;source include/show_binlog_events.inc;insert into t1 values(11);commit;source include/show_binlog_events.inc;# Check that things work like before this BEGIN/ROLLBACK code was added,# when t2 is INNODB alter table t2 engine=INNODB;delete from t1;delete from t2;reset master;begin;insert into t1 values(12);insert into t2 select * from t1;commit;source include/show_binlog_events.inc;delete from t1;delete from t2;reset master;begin;insert into t1 values(13);insert into t2 select * from t1;rollback;source include/show_binlog_events.inc;delete from t1;delete from t2;reset master;begin;insert into t1 values(14);savepoint my_savepoint;insert into t1 values(15);insert into t2 select * from t1;rollback to savepoint my_savepoint;commit;source include/show_binlog_events.inc;delete from t1;delete from t2;reset master;begin;insert into t1 values(16);savepoint my_savepoint;insert into t1 values(17);insert into t2 select * from t1;rollback to savepoint my_savepoint;insert into t1 values(18);commit;select a from t1 order by a; # check that savepoints work :)source include/show_binlog_events.inc;# Test for BUG#5714, where a MyISAM update in the transaction used to# release row-level locks in InnoDBconnect (con3,localhost,root,,);connection con3;delete from t1;delete from t2;--disable_warningsalter table t2 type=MyISAM;--enable_warningsinsert into t1 values (1);begin;select * from t1 for update;connection con2;select (@before:=unix_timestamp())*0; # always give repeatable outputbegin;send select * from t1 for update;connection con3;insert into t2 values (20);connection con2;--error 1205reap;select (@after:=unix_timestamp())*0; # always give repeatable output# verify that innodb_lock_wait_timeout was exceeded. When there was# the bug, the reap would return immediately after the insert into t2.select (@after-@before) >= 2;drop table t1,t2;commit;# test for BUG#7947 - DO RELEASE_LOCK() not written to binlog on rollback in the middle# of a transactionconnection con2;begin;create temporary table ti (a int) engine=innodb;rollback;insert into ti values(1);set autocommit=0;create temporary table t1 (a int) engine=myisam; commit;insert t1 values (1); rollback;create table t0 (n int);insert t0 select * from t1;set autocommit=1;insert into t0 select GET_LOCK("lock1",null);set autocommit=0;create table t2 (n int) engine=innodb;insert into t2 values (3); disconnect con2;connection con3;select get_lock("lock1",60);source include/show_binlog_events.inc;do release_lock("lock1");drop table t0,t2;# Test for BUG#16559 (ROLLBACK should always have a zero error code in# binlog). Has to be here and not earlier, as the SELECTs influence# XIDs differently between normal and ps-protocol (and SHOW BINLOG# EVENTS above read XIDs).connect (con4,localhost,root,,);connection con3;reset master;create table t1 (a int) engine=innodb;create table t2 (a int) engine=myisam;select get_lock("a",10);begin;insert into t1 values(8);insert into t2 select * from t1;disconnect con3;connection con4;select get_lock("a",10); # wait for rollback to finish# we check that the error code of the "ROLLBACK" event is 0 and not# ER_SERVER_SHUTDOWN (i.e. disconnection just rolls back transaction# and does not make slave to stop)--exec $MYSQL_BINLOG --start-position=547 $MYSQLTEST_VARDIR/log/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mix_innodb_myisam_binlog.output--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIReval select(@a:=load_file("$MYSQLTEST_VARDIR/tmp/mix_innodb_myisam_binlog.output"))is not null;--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIReval select@a like "%#%error_code=0%ROLLBACK/*!*/;%ROLLBACK /* added by mysqlbinlog */;%",@a not like "%#%error_code=%error_code=%";drop table t1, t2;## Bug #27417 thd->no_trans_update.stmt lost value inside of SF-exec-stack# bug #28960 non-trans temp table changes with insert .. select# not binlogged after rollback## testing appearence of insert into temp_table in binlog.# There are two branches of execution that require different setup.## send_eof() branch# preparecreate temporary table tt (a int unique);create table ti (a int) engine=innodb;reset master;show master status;# actionbegin; insert into ti values (1); insert into ti values (2) ; insert into tt select * from ti;rollback;# checkselect count(*) from tt /* 2 */;show master status;--replace_column 2 # 5 #show binlog events from 98;select count(*) from ti /* zero */;insert into ti select * from tt;select * from ti /* that is what slave would miss - a bug */;## send_error() branchdelete from ti;delete from tt where a=1;reset master;show master status;# actionbegin; insert into ti values (1); insert into ti values (2) /* to make the dup error in the following */; --error ER_DUP_ENTRYinsert into tt select * from ti /* one affected and error */;rollback;# checkshow master status;--replace_column 2 # 5 #show binlog events from 98;select count(*) from ti /* zero */;insert into ti select * from tt;select * from tt /* that is what otherwise slave missed - the bug */;drop table ti;## Bug #27417 thd->no_trans_update.stmt lost value inside of SF-exec-stack## Testing asserts: if there is a side effect of modifying non-transactional# table thd->no_trans_update.stmt must be TRUE;# the assert is active with debug build#--disable_warningsdrop function if exists bug27417;drop table if exists t1,t2;--enable_warnings# side effect tableCREATE TABLE t1 (a int NOT NULL auto_increment primary key) ENGINE=MyISAM;# target tablesCREATE TABLE t2 (a int NOT NULL auto_increment, PRIMARY KEY (a));delimiter |;create function bug27417(n int) RETURNS int(11)begin insert into t1 values (null); return n;end|delimiter ;|reset master;# executeinsert into t2 values (bug27417(1));insert into t2 select bug27417(2);reset master;--error ER_DUP_ENTRYinsert into t2 values (bug27417(2)); show master status; /* only (!) with fixes for #23333 will show there is the query */;select count(*) from t1 /* must be 3 */;reset master;select count(*) from t2;delete from t2 where a=bug27417(3);select count(*) from t2 /* nothing got deleted */; show master status; /* the query must be in regardless of #23333 */;select count(*) from t1 /* must be 5 */;--enable_infodelete t2 from t2 where t2.a=bug27417(100) /* must not affect t2 */;--disable_infoselect count(*) from t1 /* must be 7 */;drop function bug27417;drop table t1,t2;--echo end of tests
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -