A: metadata lock 元数据锁,这名词听说过吗
B: 嗯,不就是我做DDL 操作时候的数据库的锁吗?
A:诶,你这也太笼统?
B: 那你说是什么
A: 为了确保事务的可串行性,服务器必须不允许一个会话对另一个会话中未完成的显式或隐式启动的事务中使用的表执行数据定义语言(DDL)语句。服务器通过在事务中使用的表上获取元数据锁,并将这些锁的释放推迟到事务结束时,从而实现这一点。表上的元数据锁可以防止对表结构的更改。这种锁定方法意味着一个会话内的事务正在使用的表不能进行DDL 的操作,表上的元数据锁可以防止对表结构的更改。这种锁定方法意味着,一个会话内的事务正在使用的表不能在DDL语句中被其他会话使用,直到事务结束。”
B: 你罗里吧嗦那么多,不和我说的一个意思。
A: NO NO NO
B: 行了别废话了,不行你比划比划,你到底说的我哪里说的不对?
A: OK ,那我们就来做一个例子看看,我们在MYSQL 中打开两个操作窗口
其中一个进行事务操作,一个进行DDL 操作 ,然后我们看看metadata lock 的问题
窗口1
begin;
select * from error limit 1;
窗口2
alter table error add column info varchar(32);
然后我们就可以看到 metadata lock 锁了
select * from performance_schema.metadata_locks;
SELECT OBJECT_TYPE, OBJECT_SCHEMA, OBJECT_NAME, LOCK_TYPE,
LOCK_STATUS, THREAD_ID, PROCESSLIST_ID, PROCESSLIST_INFO FROM performance_schema.metadata_locks INNER JOIN performance_schema.threads ON THREAD_ID = OWNER_THREAD_ID WHERE PROCESSLIST_ID <> CONNECTION_ID();
从图中我们可以看到一个metadata lock 锁是由 5 个锁组成的
1 对于当前要操作表的 shard_read lock
2 GLOBAL intention_exclusive
3 对于当前操作表的 intention_exclusive
4 对于要操作表的 exclusive
5 对于 metadata_locks 表本身的 shard_read
B: 你讲了这么多,有个屁用,不还是我刚才说的,有两个意思吗?
A:那我问你在操作 PT 工具的时候,PT-OSC 会不会遇到 metadata lock, 你在 truncate table 的时候,会不会遇到 metadata lock
B:额.......... 我做实验去了
B: 诶,我做你的这个实验怎么什么都看不到
A :嗯我估计你有以下条件没有达到
1 MYSQL 5.7 版本
2 打开 performance_schema 收集信息的设置
UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME = 'global_instrumentation';
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME = 'wait/lock/metadata/sql/mdl';
本文分享自 AustinDatabases 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!