mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
BUG#26395: if crash during autocommit update to transactional table on master, slave fails
Now, every transaction (including autocommit transactions) start with a BEGIN and end with a COMMIT/ROLLBACK in the binlog. Added a test case, and updated lots of test case result files. mysql-test/t/rpl_transaction-master.opt: BitKeeper file /home/sven/bk/b26395-autocommit-xa/5.0-rpl/mysql-test/t/rpl_transaction-master.opt mysql-test/t/rpl_transaction-slave.opt: BitKeeper file /home/sven/bk/b26395-autocommit-xa/5.0-rpl/mysql-test/t/rpl_transaction-slave.opt mysql-test/r/mix_innodb_myisam_binlog.result: Updated result file mysql-test/r/multi_update.result: Updated result file mysql-test/r/rpl_transaction.result: New result file for new test case. mysql-test/r/sp_trans_log.result: Updated result file mysql-test/r/variables-big.result: Updated result file mysql-test/t/rpl_transaction.test: New test case. sql/log.cc: - Always write BEGIN and COMMIT around statements, even in autocommit mode. - Added comments for binlog_commit and binlog_rollback. sql/log_event.cc: Added debug trigger to avoid writing xid events to the binlog.
This commit is contained in:
@ -100,9 +100,10 @@ insert into t1 values(9);
|
||||
insert into t2 select * from t1;
|
||||
show binlog events from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 98 Query 1 # use `test`; insert into t1 values(9)
|
||||
master-bin.000001 185 Xid 1 # COMMIT /* XID */
|
||||
master-bin.000001 212 Query 1 # use `test`; insert into t2 select * from t1
|
||||
master-bin.000001 98 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 166 Query 1 # use `test`; insert into t1 values(9)
|
||||
master-bin.000001 253 Xid 1 # COMMIT /* XID */
|
||||
master-bin.000001 280 Query 1 # use `test`; insert into t2 select * from t1
|
||||
delete from t1;
|
||||
delete from t2;
|
||||
reset master;
|
||||
@ -111,19 +112,21 @@ begin;
|
||||
insert into t2 select * from t1;
|
||||
show binlog events from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 98 Query 1 # use `test`; insert into t1 values(10)
|
||||
master-bin.000001 186 Xid 1 # COMMIT /* XID */
|
||||
master-bin.000001 213 Query 1 # use `test`; insert into t2 select * from t1
|
||||
master-bin.000001 98 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 166 Query 1 # use `test`; insert into t1 values(10)
|
||||
master-bin.000001 254 Xid 1 # COMMIT /* XID */
|
||||
master-bin.000001 281 Query 1 # use `test`; insert into t2 select * from t1
|
||||
insert into t1 values(11);
|
||||
commit;
|
||||
show binlog events from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 98 Query 1 # use `test`; insert into t1 values(10)
|
||||
master-bin.000001 186 Xid 1 # COMMIT /* XID */
|
||||
master-bin.000001 213 Query 1 # use `test`; insert into t2 select * from t1
|
||||
master-bin.000001 307 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 375 Query 1 # use `test`; insert into t1 values(11)
|
||||
master-bin.000001 463 Xid 1 # COMMIT /* XID */
|
||||
master-bin.000001 98 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 166 Query 1 # use `test`; insert into t1 values(10)
|
||||
master-bin.000001 254 Xid 1 # COMMIT /* XID */
|
||||
master-bin.000001 281 Query 1 # use `test`; insert into t2 select * from t1
|
||||
master-bin.000001 375 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 443 Query 1 # use `test`; insert into t1 values(11)
|
||||
master-bin.000001 531 Xid 1 # COMMIT /* XID */
|
||||
alter table t2 engine=INNODB;
|
||||
delete from t1;
|
||||
delete from t2;
|
||||
@ -235,25 +238,29 @@ master-bin.000001 98 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 166 Query 1 # use `test`; insert into t1 values(16)
|
||||
master-bin.000001 254 Query 1 # use `test`; insert into t1 values(18)
|
||||
master-bin.000001 342 Xid 1 # COMMIT /* XID */
|
||||
master-bin.000001 369 Query 1 # use `test`; delete from t1
|
||||
master-bin.000001 446 Xid 1 # COMMIT /* XID */
|
||||
master-bin.000001 473 Query 1 # use `test`; delete from t2
|
||||
master-bin.000001 550 Xid 1 # COMMIT /* XID */
|
||||
master-bin.000001 577 Query 1 # use `test`; alter table t2 type=MyISAM
|
||||
master-bin.000001 666 Query 1 # use `test`; insert into t1 values (1)
|
||||
master-bin.000001 754 Xid 1 # COMMIT /* XID */
|
||||
master-bin.000001 781 Query 1 # use `test`; insert into t2 values (20)
|
||||
master-bin.000001 870 Query 1 # use `test`; drop table t1,t2
|
||||
master-bin.000001 949 Query 1 # use `test`; create temporary table ti (a int) engine=innodb
|
||||
master-bin.000001 1059 Query 1 # use `test`; insert into ti values(1)
|
||||
master-bin.000001 1146 Xid 1 # COMMIT /* XID */
|
||||
master-bin.000001 1173 Query 1 # use `test`; create temporary table t1 (a int) engine=myisam
|
||||
master-bin.000001 1283 Query 1 # use `test`; insert t1 values (1)
|
||||
master-bin.000001 1366 Query 1 # use `test`; create table t0 (n int)
|
||||
master-bin.000001 1452 Query 1 # use `test`; insert t0 select * from t1
|
||||
master-bin.000001 1541 Query 1 # use `test`; insert into t0 select GET_LOCK("lock1",null)
|
||||
master-bin.000001 1648 Query 1 # use `test`; create table t2 (n int) engine=innodb
|
||||
master-bin.000001 1748 Query 1 # use `test`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `test`.`t1`,`test`.`ti`
|
||||
master-bin.000001 369 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 437 Query 1 # use `test`; delete from t1
|
||||
master-bin.000001 514 Xid 1 # COMMIT /* XID */
|
||||
master-bin.000001 541 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 609 Query 1 # use `test`; delete from t2
|
||||
master-bin.000001 686 Xid 1 # COMMIT /* XID */
|
||||
master-bin.000001 713 Query 1 # use `test`; alter table t2 type=MyISAM
|
||||
master-bin.000001 802 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 870 Query 1 # use `test`; insert into t1 values (1)
|
||||
master-bin.000001 958 Xid 1 # COMMIT /* XID */
|
||||
master-bin.000001 985 Query 1 # use `test`; insert into t2 values (20)
|
||||
master-bin.000001 1074 Query 1 # use `test`; drop table t1,t2
|
||||
master-bin.000001 1153 Query 1 # use `test`; create temporary table ti (a int) engine=innodb
|
||||
master-bin.000001 1263 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 1331 Query 1 # use `test`; insert into ti values(1)
|
||||
master-bin.000001 1418 Xid 1 # COMMIT /* XID */
|
||||
master-bin.000001 1445 Query 1 # use `test`; create temporary table t1 (a int) engine=myisam
|
||||
master-bin.000001 1555 Query 1 # use `test`; insert t1 values (1)
|
||||
master-bin.000001 1638 Query 1 # use `test`; create table t0 (n int)
|
||||
master-bin.000001 1724 Query 1 # use `test`; insert t0 select * from t1
|
||||
master-bin.000001 1813 Query 1 # use `test`; insert into t0 select GET_LOCK("lock1",null)
|
||||
master-bin.000001 1920 Query 1 # use `test`; create table t2 (n int) engine=innodb
|
||||
master-bin.000001 2020 Query 1 # use `test`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `test`.`t1`,`test`.`ti`
|
||||
do release_lock("lock1");
|
||||
drop table t0,t2;
|
||||
reset master;
|
||||
@ -402,7 +409,7 @@ insert into t2 values (bug27417(1));
|
||||
ERROR 23000: Duplicate entry '1' for key 1
|
||||
show master status /* the offset must denote there is the query */;
|
||||
File Position Binlog_Do_DB Binlog_Ignore_DB
|
||||
master-bin.000001 267
|
||||
master-bin.000001 335
|
||||
select count(*) from t1 /* must be 1 */;
|
||||
count(*)
|
||||
1
|
||||
@ -414,7 +421,7 @@ insert into t2 select bug27417(1) union select bug27417(2);
|
||||
ERROR 23000: Duplicate entry '2' for key 1
|
||||
show master status /* the offset must denote there is the query */;
|
||||
File Position Binlog_Do_DB Binlog_Ignore_DB
|
||||
master-bin.000001 290
|
||||
master-bin.000001 358
|
||||
select count(*) from t1 /* must be 2 */;
|
||||
count(*)
|
||||
2
|
||||
@ -438,7 +445,7 @@ UPDATE t4,t3 SET t4.a=t3.a + bug27417(1) /* top level non-ta table */;
|
||||
ERROR 23000: Duplicate entry '2' for key 1
|
||||
show master status /* the offset must denote there is the query */;
|
||||
File Position Binlog_Do_DB Binlog_Ignore_DB
|
||||
master-bin.000001 301
|
||||
master-bin.000001 369
|
||||
select count(*) from t1 /* must be 4 */;
|
||||
count(*)
|
||||
4
|
||||
@ -466,7 +473,7 @@ delete from t2;
|
||||
ERROR 23000: Duplicate entry '1' for key 1
|
||||
show master status /* the offset must denote there is the query */;
|
||||
File Position Binlog_Do_DB Binlog_Ignore_DB
|
||||
master-bin.000001 246
|
||||
master-bin.000001 314
|
||||
select count(*) from t1 /* must be 1 */;
|
||||
count(*)
|
||||
1
|
||||
@ -483,7 +490,7 @@ delete t2.* from t2,t5 where t2.a=t5.a + 1;
|
||||
ERROR 23000: Duplicate entry '1' for key 1
|
||||
show master status /* the offset must denote there is the query */;
|
||||
File Position Binlog_Do_DB Binlog_Ignore_DB
|
||||
master-bin.000001 274
|
||||
master-bin.000001 342
|
||||
select count(*) from t1 /* must be 1 */;
|
||||
count(*)
|
||||
1
|
||||
@ -501,7 +508,7 @@ count(*)
|
||||
2
|
||||
show master status /* the offset must denote there is the query */;
|
||||
File Position Binlog_Do_DB Binlog_Ignore_DB
|
||||
master-bin.000001 376
|
||||
master-bin.000001 444
|
||||
drop trigger trg_del_t2;
|
||||
drop table t1,t2,t3,t4,t5;
|
||||
drop function bug27417;
|
||||
|
Reference in New Issue
Block a user