【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 ...
随机推荐
- 技术分享 | Appium 用例录制
原文链接 下载及安装 下载地址: https://github.com/appium/appium-desktop/releases 下载对应系统的 Appium 版本,安装完成之后,点击 " ...
- C#/VB 数据库连接字符串大全
C#/VB 数据库连接字符串大全 https://www.connectionstrings.com/ SQL Server常用 Standard Security Server=myServerAd ...
- 关于个人项目(臻美MV【仿抖音App】)滑动切换视频的分析(前端角度)
我们知道你天天刷抖音的时候可以上滑切换视频,互不影响.那么我们站在前端的角度能否可以实现这种效果呢?这是我的个人项目:臻美MV 下面我是用Vue写的,现在我把它开源. Vue: 初始界面 <te ...
- SAP Tree editor(树形结构)
SAP List Tree 效果 源代码 *&---------------------------------------------------------------------* *& ...
- 工具箱之 IKVM.NET 项目新进展
在各种群里经常讨论的一个事情是.NET 如何调用 Java 的实现,最常见的场景之一就是在加解密方面Java提供的密钥,C#无法解密, C#中byte范围是[0,255],而Java中的byte范围是 ...
- Excel表函数自动生成SQL
前言 在平常的工作中,多多掌握一点这样的小技巧,能够帮助我们省去很多时间: 1.数据库对应的表如下: 2.excel中需要导入的数据如下: 3.excel中sql的写法: ="insert ...
- nginx 出现An error occurred错误
原因是我nginx中conf文件的配置里面 location中的 这一块内容是 #注释的那两行 所以报错出现这个错误. 后来将这两行注释掉,改成这两个就好了. root html; index ind ...
- JDBC:批处理
1.批处理: 当要执行某条SQL语句很多次时.例如,批量添加数据:使用批处理的效率要高的多. 2.如何实现批处理 实践: package com.dgd.test; import java.io.Fi ...
- 千位分隔符在web开发中的作用
有千位分隔符会被认为是数字,否则在移动端会被直接识别成手机号 在开发实战中主流实现方式是添加meta标签 <meta name="format-detection" cont ...
- Note -「模拟退火」
随机化算法属于省选芝士体系 0x01 前置芝士 你只需要会 rand 就可以啦! 当然如果你想理解的更透彻也可以先看看 爬山算法 0x02 关于退火 退火是一种金属热处理工艺,指的是将金属缓慢加热到一 ...