全部文档
当前文档

暂无内容

如果没有找到您期望的内容,请尝试其他搜索词

文档中心

MySQL Metadata lock的产生

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

简介

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 秒。
    避免长时间等待元数据锁影响表上其他业务查询。
    文档导读
    纯净模式常规模式

    纯净模式

    点击可全屏预览文档内容
    文档反馈