
无为,多年 MySQL DBA 工作经验,现就职于某知名互联网公司,对 MySQL、 Redis、PostgrepSQL 等主流数据库有一定了解,拥有丰富的一线运维经验。
1、什么是元数据锁
2、加锁规则
语句逐个( one by one )获取元数据锁,不是同时获取,并在获取过程中执行死锁检测。 DML 语句获取锁按照语句中 table 出现的顺序来获取锁。 DDL 语句、LOCK TABLES 和其他类似语句按名称顺序获取锁,对于隐式使用的表(例如外键关系中也必须锁定的表)可能会以不同的顺序获取锁。 DDL 的写锁请求优先级高于 DML
3、模拟加锁规则
LOCK TABLE t WRITE, t_new WRITE;
复制
INSERT INTO t VALUES(1);
复制
RENAME TABLE t TO t_old, t_new TO t;
复制
UNLOCK TABLES;
复制
LOCK TABLE t WRITE, new_t WRITE;
复制
INSERT INTO t VALUES(1);
复制
RENAME TABLE t TO old_t, new_t TO t;
复制
4、 如何监控元数据锁
--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';
复制
[mysqld]
performance-schema-instrument='wait/lock/metadata/sql/mdl=ON'
复制
5、如何优化元数据锁
开启 metadata_locks 表记录 MDL 锁。 设置参数 lock_wait_timeout 为较小值,使被阻塞端主动停止。 规范使用事务,及时提交事务,避免使用大事务。 增强监控告警,及时发现 MDL 锁。 DDL 操作及备份操作放在业务低峰期执行。


文章转载自悦专栏,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。