MySQL Metadata lock的产生

最近更新时间:2019-02-22 10:47:26

MySQL metadata lock的产生

简介

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

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

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

·创建、删除索引

·修改表结构、删除表

·获取表上表级写锁 (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 秒;避免长时间等待元数据锁影响表上其他业务查询。

金山云,开启您的云计算之旅

立即注册