MySQL metadata lock

from:http://blog.csdn.net/wzy0623/article/details/8679457

昨天在做MySQL复制实验时遇到了一个问题只这样的:

数据库版本: 5.5.21-log
操作系统: windows xp

做master/slave复制,autocommit=0 binlog-format=mixed  tx-isolation=read-committed

实验过程:
1. 
master上建表:
create table t1 (a int) engine=innodb;
2.
slave上查询:
select * from t1;
empty set...
正常执行
3.
master上删表:
drop table t1;
4. 
slave上查询:
select * from t1;
empty set...
此时的结果令人费解,怎么还能查询呢?
5.
slave上查看线程:
show processlist\G
...
state: waiting for table metadata lock
info: DROP TABLE `t1` /*generated by server*/
这里显示等待metadata lock,在slave上就执行了一个select,难道会开启一个事务?
6.
slave上执行commit;
commit;
select * from t1;
Table 't1' doesn't exist
此时表已经没了。

为什么在slave上没有立即复制drop语句,是什么产生了metadata lock,怎样能做drop立即复制,而不需要先commit呢?

 

其实就是mysql 5.5.3以后增加metadata lock的缘故。这个锁限制了在一个没提交事务前执行DDL语句。让人迷惑的是就算只有select,只要没提交也会阻止DDL(这点和Oracle认为的“事务”显然不同),就像试验中出现的那样:autocommit=0,slave上一个select就开启了一个事务,而复制线程与发出select的线程是两个线程,所以直到发出select语句的线程执行commit后才能执行drop语句。

 

参考:http://www.chriscalender.com/?tag=metadata-lock


你可能感兴趣的:(windows,server,master,generated,Waiting)