首页 > 数据库 >【MySQL】DDL因Waiting for table metadata lock卡住

【MySQL】DDL因Waiting for table metadata lock卡住

时间:2022-08-30 08:34:44浏览次数:143  
标签:事务 lock trx Waiting MySQL table NULL metadata

在数据库空闲时间,对表做碎片整理:

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

  

 

标签:事务,lock,trx,Waiting,MySQL,table,NULL,metadata
From: https://www.cnblogs.com/abclife/p/16636955.html

相关文章

  • MySQL无法重启报错Warning: World-writable config file ‘/etc/my.cnf’ is ignored
    MySQL无法重启报错Warning:World-writableconfigfile‘/etc/my.cnf’isignored的解决方法_Mysql_脚本之家 https://www.jb51.net/article/99027.htm问题分析在关......
  • 1.Docker下搭建MySQL主从复制(一主一从)
    Docker下搭建MySQL主从复制(一主一从)实现Mycat读写分离1、通过dockerexec-it627a2368c865/bin/bash命令进入到Master容器内部2、cd/etc/mysql切换到/etc/mysql目录......
  • MySQL的sql_mode设置导致报错1292
    在MySQL8.0的一个PXC集群中,默认的sql_mode设置如下:select@@sql_mode;+-------------------------------------------------------------------------------------------......
  • MySQL低配数据库被大量数据导入时KO
    在一个低配MySQL数据库(笔记本电脑虚机环境,虚机配置2CPU/3G内存),在3000万级别的大量数据LOADDATA方式导入时,坚持一小时后,终于被KO了,甚至没写下任何有用的日志,只是在操作界面......
  • MySQL快速导入千万条数据(3)
    接上文,本次在较高性能的X86物理机上,做真实生产环境的大数据量导入测试。一、测试环境■CPU是24核,每核2线程,即48CPU$lscpuArchitecture:x86_64CPUop-mode......
  • MySQL快速导入千万条数据(2)
    接上文,继续测试3000万条记录快速导入数据库。一、导入前1000万条数据清库、建库、新建表结构、导入前1000万条数据,结果:■1000万行,有2索引导入耗时:16分钟QueryOK,999......
  • MySQL快速导入千万条数据(1)
    对于传统的关系数据库如oracle,在大量数据导入方面的效率,我们一般有一个大概的认知,即1分钟以内可以导入千万条数据,而对于MySQL数据库,普遍观点以为性能相对较差,尤其时对于千......
  • MySQL PXC集群大事务提交超限
    研发人员在测试大事务提交时遇见了错误:Goterror5-'Transactionsizeexceedsetthreshold'duringCOMMIT测试了几次都是1200S的时候停止的,不过在注释掉特定步骤后,......
  • 基本的mysql语句
    基本的mysql语句  本节课先对mysql的基本语法初体验。操作文件夹(库)增createdatabasedb1charsetutf8;查#查看当前创建的数据库showcreatedatabase......
  • MySQL(三)+测试题
    MySQL索引在MySQL中,创建MySQL的索引主要是为了提⾼MySQL查询的效率。但是添加太多的索引也是会降低更新表的速度的,因为对表进⾏DML操作的时候,MySQL的内部不仅仅要保存数......