July 6, 2012

[MySQL Bug]DDL操作导致备库复制中断

转载请署名:印风 ————————————————- 在MySQL5.1及之前的版本中,如果有未提交的事务trx,当执行DROP/RENAME/ALTER TABLE RENAME操作时,不会被其他事务阻塞住。这会导致如下问题(MySQL bug#989) master: 未提交的事务,但SQL已经完成(binlog也准备好了),表schema发生更改,在commit的时候不会被察觉到。 slave: 在binlog里是以事务提交顺序记录的,DDL隐式提交,因此在备库先执行DDL,后执行事务trx,由于trx作用的表已经发生了改变,因此trx会执行失败。 在DDL时的主库DML压力越大,这个问题触发的可能性就越高 一个简单的例子: session1,set autocommit=0,对表b执行一条DML root@xxx 11:48:28>set autocommit = 0; Query OK, 0 rows affected (0.00 sec) root@xxx 11:48:35>insert into b values (NULL,4); Query OK, 1 row affected (0.00 sec) session2,执行rename table a to tmp_b root@xxx 11:48:23>rename table b to tmp_b; Query OK, 0 rows affected […]