mysql 的事件之 Waiting for table metadata lock

本文记录了一次在Debian GNU/Linux 8.2环境下,MySQL 5.5.49版本中遇到的元数据锁等待问题。当在主节点进行索引删除操作时,从节点出现了长时间的Waiting for table metadata lock状态。文章详细分析了该问题的原因,并提供了通过调整lock_wait_timeout参数和使用kill trx_mysql_thread_id来解决问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

os:debian 8.2
mysql:5.5.49

nodeb 为 nodea 的一个slave,在nodea上删除一个无效的索引,发现nodeb上出现长时间的 Waiting for table metadata lock。
分析的过程如下:

环境

# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 8.2 (jessie)
Release:    8.2
Codename:   jessie

# mysql

root@localhost> select version();
+---------------------+
| version()           |
+---------------------+
| 5.5.49-0+deb8u1-log |
+---------------------+
1 row in set (0.00 sec)

nodea 操作

root@localhost> drop index idx_abc_x1 on abc;

nodeb 操作

root@localhost> show processlist;
+---------+-------------+-------------------+--------+---------+----------+----------------------------------+------------------------------------------------------------------------------------------------------+
| Id      | User        | Host              | db     | Command | Time     | State                            | Info                                                                                                 |
+---------+-------------+-------------------+--------+---------+----------+----------------------------------+------------------------------------------------------------------------------------------------------+
|      48 | system user |                   | NULL   | Connect | 10446048 | Waiting for master to send event | NULL                                                                                                 |
|      49 | system user |                   | EMdata | Connect |     1543 | Waiting for table metadata lock  | DROP INDEX IDX_ABC_X1 on ABC 
~~~
~~~
~~~
| 2427727 | emsel       | 10.10.2.51:59835  | EMdata | Query   |      134 | Waiting for table metadata lock  | select * from abc

查询锁信息

root@localhost> SELECT * FROM information_schema.innodb_lock_waits;
root@localhost> SELECT * FROM information_schema.innodb_locks;
root@localhost> SELECT * FROM information_schema.innodb_trx;

因为slave都是select操作,和开发人员沟通后可以使用 kill trx_mysql_thread_id 杀掉进程。

所以尽量避免在高并发的时候做DDL操作。

lock_wait_timeout

还有一个参数 lock_wait_timeout 用来控制metadata lock的超时(单位为秒),允许的值范围为1到31536000(1年)。 默认值为31536000。

root@localhost> show global variables like 'lock_wait_timeout';
+-------------------+----------+
| Variable_name     | Value    |
+-------------------+----------+
| lock_wait_timeout | 31536000 |
+-------------------+----------+
1 row in set (0.00 sec)

参考:
https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_lock_wait_timeout

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据库人生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值