MySQL Metadata lock的产生

最近更新时间:2021-01-06 18:05:13

查看PDF

简介

MySQL为了在并发环境下维护表元数据的数据一致性,在表上有活动事务(显式或隐式)的时候,不可以对元数据进行写入操作。因此 MySQL 引入了 metadata lock ,来保护表的元数据信息。

支持事务的 InnoDB 引擎表和 不支持事务的 MyISAM 引擎表,都会出现 metadata lock wait 等待现象。一旦出现 metadata lock wait 等待现象,后续所有对该表的访问都会阻塞在该等待上,导致连接堆积,业务受影响。

因此在对表进行上述操作时,如果表上有活动事务(未提交或回滚),请求写入的会话会等待在 metadata lock wait,会导致metadata lock wait出现的场景有:

1.创建、删除索引。

2.修改表结构、删除表。

3.获取表上表级写锁 (lock table tab_name write)。

如何处理

show processlist 查看会话有长时间未完成的查询,使用kill 命令终止该查询。

如何避免

出现长时间 metadata lock wait 会导致表上相关查询阻塞,影响业务。我们需要尽量避免类此情况。

在业务低峰期执行创建表、修改表,或者创建索引等操作。

  • 在到RDS的数据库连接建立后,设置会话变量autocommit为1或者on,比如set autocommit=1;或set autocommit=on;。
  • 考虑使用事件来终止长时间运行的事务,比如下面的例子中会终止执行时间超过60分钟的事务。
  • 执行上述1中操作前,设置会话变量
  • lock\_wait\_timeout为较小值,比如set lock\_wait\_timeout=30。
    命令可以设置 metadata lock wait 的最长时间为 30 秒。
    避免长时间等待元数据锁影响表上其他业务查询。

    文档内容是否对您有帮助?

    根本没帮助
    文档较差
    文档一般
    文档不错
    文档很好

    在文档使用中是否遇到以下问题

    • 内容不全,不深入
    • 内容更新不及时
    • 描述不清晰,比较混乱
    • 系统或功能太复杂,缺乏足够的引导
    • 内容冗长

    更多建议

    0/200

    评价建议不能为空

    提交成功!

    非常感谢您的反馈,我们会继续努力做到更好!