【MySQL】DDL因Waiting for table metadata lock卡住
在数据库空闲时间,对表做碎片整理:
alter table my_abc engine=innodb;
发现会话被阻塞,显示状态是:
Waiting for table metadata lock
手动断开alter操作后,通过show processlist查看:
> show processlist;
+--------+--------+---------------------+-----------+---------+-------+----------+------------------+----------+
| Id | User | Host | db | Command | Time | State | Info | Progress |
+--------+--------+---------------------+-----------+---------+-------+----------+------------------+----------+
| 489669 | pig | 119.119.3.221:60226 | pig | Sleep | 4 | | NULL | 0.000 |
| 489673 | xxx | 119.119.3.172:41394 | abced_xxx | Sleep | 120 | | NULL | 0.000 |
| 498227 | xxx | 119.119.3.172:48916 | abced_xxx | Sleep | 28303 | | NULL | 0.000 |
| 502773 | pig | 119.119.3.172:47752 | pig | Sleep | 26139 | | NULL | 0.000 |
| 519545 | root | localhost | NULL | Sleep | 15994 | | NULL | 0.000 |
+--------+--------+---------------------+-----------+---------+-------+----------+------------------+----------+
可以看到会话都处于sleep状态。但是一旦执行alter操作,就会卡在那里,等待元数据锁。
出现Waiting for table metadata lock这种情况多半是和事务有关,要么是一个长事务在运行,要么是事务没有提交造成的
先查看下是否开启了自动提交:
> show global variables like '%autocommit%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| autocommit | ON |
| wsrep_retry_autocommit | 1 |
+------------------------+-------+
2 rows in set (0.001 sec)
接下来,在查看一下是否有事务正在运行:
> select * from information_schema.innodb_trx \G;
*************************** 1. row ***************************
trx_id: 0
trx_state: RUNNING
trx_started: 2022-08-29 10:10:37
trx_requested_lock_id: NULL
trx_wait_started: NULL
trx_weight: 0
trx_mysql_thread_id: 498227
trx_query: NULL
trx_operation_state:
trx_tables_in_use: 0
trx_tables_locked: 0
trx_lock_structs: 0
trx_lock_memory_bytes: 1128
trx_rows_locked: 0
trx_rows_modified: 0
trx_concurrency_tickets: 0
trx_isolation_level: REPEATABLE READ
trx_unique_checks: 1
trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
trx_is_read_only: 0
trx_autocommit_non_locking: 0
1 row in set (0.001 sec) ERROR: No query specified
从这里看到,的确有一个事务在运行。从上班到下班还没结束。
这里就要找开发同学问问应用到底是在干什么了,解决了这个问题,顺便还解决了最近业务反应有些功能慢的问题。
此外,information_schema.innodb_trx中不会记录执行失败的事务,但是在这个执行失败的事务回滚前,它依然持有metadata lock,所以DDL操作依然会被阻塞。这个时候可以通过查找performance_schema.events_statements_current表来找到相关的语句和会话信息,将其杀死。为了减少metadata lock带来的危害,设置一个合理的lock_wait_timeout比较重要,这个值默认是365天,可以根据自身业务来设置,避免长时间的metadata lock等待。
总结一下:
·长时间运行的事务很危险,需要多关注。
·要关注autocommit是否开启
·使用事务需要小心,记得 commit,捕获异常 rollback
·做DDL操作前先检查一遍innodb_trx
·设置合理的lock_wait_timeout
【MySQL】DDL因Waiting for table metadata lock卡住的更多相关文章
- mysql错误: waiting for table metadata lock
今天突然发现truncate一个表都慢到不行,于是 SHOW PROCESSLIST 发现错误:waiting for table metadata lock解决方法:查看information_sc ...
- MySQL - 问题集 - "Waiting for table metadata lock"(待完善)
待完善.show processlist; 可参考1:http://blog.csdn.net/huochuangchuang/article/details/49423893 可参考2:http:/ ...
- MySQL出现Waiting for table metadata lock的原因以及解决方法
转自:http://ctripmysqldba.iteye.com/blog/1938150 (有修改) MySQL在进行alter table等DDL操作时,有时会出现Waiting for tab ...
- 【转】【MySql】Waiting for table metadata lock原因分析
MySQL在进行alter table等DDL操作时,有时会出现Waiting for table metadata lock的等待场景.而且,一旦alter table TableA的操作停滞在Wa ...
- mysql出现Waiting for table metadata lock的原因及解决方案
最近经常遇到mysql数据库死锁,郁闷死, show processlist; 时 Waiting for table metadata lock 能一直锁很久 下面有官网的一段话,可以理解下 htt ...
- 【MySQL经典案例分析】 Waiting for table metadata lock
本文由云+社区发表 一. 问题是这样来的 2018年某个周末,接到连续数据库的告警,告警信息如下: 二. 苦逼的探索过程 1.总体的思路 看到too many connection的报错信息,基本 ...
- MySQL出现Waiting for table metadata lock的场景浅析
MySQL版本为5.6.12. 在进行alter table操作时,有时会出现Waiting for table metadata lock的等待场景.而且,一旦alter table TableA的 ...
- 记一次MySQL中Waiting for table metadata lock问题的处理
起因:由于需要,要把一张表的一个字段从不是 null 改成 可null,我用的Navicat Premium ,但是在保存的时候,工具无响应了,几个同事操作都是这样的,很奇怪,怀疑是不是由于表被锁了还 ...
- MySQL Waiting for table metadata lock的解决方法
最近需要在某一个表中新增字段,使用Sequel Pro 或者Navicat工具都会出现程序没有反应,使用 show processlist 查看,满屏都是 Waiting for table meta ...
随机推荐
- sqlserver用windows方式验证登录踩过的坑
坑位一: 之前没用过windows验证方式登录sqlserver,连接串怎么写 坑位二: 链接上了,但是启动报错 八月 19, 2020 9:33:43 上午 com.microsoft.sqlser ...
- 安装ImageMagick7.1库以及php的Imagick扩展
由于ImageMagick7以下不支持heic等图片格式,所以重新安装了ImageMagick7.1版本支持heic格式,并写此文章记录一下. 如果安装过程中遇到一些未知的错误,https://ima ...
- c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比
c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比对比 在6.22 号发布了 c# sqlsugar,his ...
- docker compose 部署 minio
1.docker-compose.yaml 文件如下: version: '3' services: minio: image: minio/minio:latest # 原镜像`minio/mini ...
- 简单使用 MySQL 索引
MySQL 索引 1 什么是索引 在数据库表中,对字段建立索引可以大大提高查询速度.通过善用这些索引,可以令 MySQL 的查询和 运行更加高效. 如果合理的设计且使用索引的 MySQL 是一辆兰博基 ...
- 《HelloGitHub》第 76 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...
- Canal实时解析mysql binlog数据实战
一.说明 通过canal实时监听mysql binlog日志文件的变化,并将数据解析出来 二.环境准备 1.创建maven项目并修改pom.xml配置文件 <dependencies> & ...
- OPC UA分布式IO模块
OPC UA IO模块对工业物联网的影响 OPC UA IO模块是指IO模块支持OPC UA协议,可以直接与OPC Client进行通信,这样就可以从OPC Client上直接远程通过以太网对IO口进 ...
- Nginx 限制上传文件的大小。responded with a status of 413 (Request Entity Too Large)
# 限制请求体的大小,若超过所设定的大小,返回413错误. client_max_body_size 50m; # 读取请求头的超时时间,若超过所设定的大小,返回408错误. client_heade ...
- React报错之无法在未挂载的组件上执行React状态更新
正文从这开始~ 总览 为了解决"Warning: Can't perform a React state update on an unmounted component" ,可以 ...