您现在的位置是:亿华云 > 热点
MySQL 中如何定位 Ddl 被阻塞的问题
亿华云2025-10-09 13:17:30【热点】4人已围观
简介经常碰到开发、测试童鞋会问,线下开发、测试环境,执行了一个DDL,发现很久都没有执行完,是不是被阻塞了?要怎么解决?包括在群里,也经常会碰到类似问题:DDL 被阻塞了,如何找到阻塞它的 SQL ?实际
经常碰到开发、何定测试童鞋会问,位D问题线下开发、被阻测试环境,何定执行了一个DDL,位D问题发现很久都没有执行完,被阻是何定不是被阻塞了?要怎么解决?
包括在群里,也经常会碰到类似问题:DDL 被阻塞了,位D问题如何找到阻塞它的被阻 SQL ?
实际上,如何解决 DDL 被阻塞的何定问题,是位D问题 MySQL 中一个共性且高频的问题。
下面,被阻就这个问题,何定给一个清晰明了、位D问题拿来即用的被阻解决方案:
怎么判断一个 DDL是不是被阻塞了
首先,看一个简单的免费信息发布网Demo
session1> create table sbtest.t1(id int primary key,name varchar(10));
Query OK, 0 rows affected (0.02 sec)
session1> insert into sbtest.t1 values(1,a);
Query OK, 1 row affected (0.01 sec)
session1> begin;
Query OK, 0 rows affected (0.00 sec)
session1> select * from sbtest.t1;
+----+------+
| id | name |
+----+------+
| 1 | a |
+----+------+
1 row in set (0.00 sec)
session2> alter table sbtest.t1 add c1 datetime;
阻塞中。。。
session3> show processlist;
+----+-----------------+-----------+------+---------+-------+---------------------------------+---------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------+------+---------+-------+---------------------------------+---------------------------------------+
| 5 | event_scheduler | localhost | NULL | Daemon | 47628 | Waiting on empty queue | NULL |
| 24 | root | localhost | NULL | Sleep | 11 | | NULL |
| 25 | root | localhost | NULL | Query | 5 | Waiting for table metadata lock | alter table sbtest.t1 add c1 datetime |
| 26 | root | localhost | NULL | Query | 0 | init | show processlist |
+----+-----------------+-----------+------+---------+-------+---------------------------------+---------------------------------------+
4 rows in set (0.00 sec)判断一个 DDL 是不是被阻塞了,很简单,就是执行 show processlist ,查看 DDL 操作对应的状态。
如果显示的是 Waiting for table metadata lock ,则意味着这个 DDL 被阻塞了。
DDL 一旦被阻塞了,后续针对该表的所有操作都会被阻塞,都会显示 Waiting for table metadata lock 。这也是 DDL 让人闻之色变的原因。
碰到了类似场景,要么 Kill DDL 操作,要么 Kill 阻塞 DDL 的会话。
Kill DDL 操作是一个治标不治本的云南idc服务商方法,毕竟 DDL 操作总要执行。
除此之外,对于 DDL 操作,需要获取元数据库锁的阶段有两个:DDL 开始之初和 DDL 结束之前。如果是后者,就意味着之前的操作都要回滚,成本相对较高。
所以,碰到类似场景,我们一般都会 Kill 阻塞 DDL 的会话。
那么,怎么知道是哪些会话阻塞了 DDL 呢?
下面我们看看具体的定位方法。
定位方法
方法一:sys.schema_table_lock_waitssys.schema_table_lock_waits
是MySQL 5.7引入的,用来定位 DDL 被阻塞的问题。
针对上面这个Demo。
我们看看sys.schema_table_lock_waits的输出。
mysql> select * from sys.schema_table_lock_waits\G
源码下载很赞哦!(8631)
相关文章
- 在更换域名后,并不是就万事大吉了,我们需要将旧域名做301重定向到新域名上,转移旧域名的权重到新域名上。
- NVIDIA发布云原生超级计算架构:优化算力结构,赋能业务上云,降低数据中心能耗
- 部署时间节省 99.7%,SUSE助力Hexagon实现 IT 现代化
- 2022戴尔产品更新大盘点 存储阵列全线开花
- Status、Creation Date、Expiration Date
- 2022 ODCC峰会即将开幕,宝存科技的企业级SSD创新之道
- 我们如何让数据中心为未来做好准备?
- 从零开始实现一个MyBatis加解密插件
- 在数以亿计的网站中,我们应该抓住每一个可能带来宣传的机会,域名可以带有企业的名字,一般可以使用汉语拼音或者英语单词或者是相关缩写的形式,只要用户记住了你企业的名字,就能很容易的打出你的网站域名,同样的,记住了网站域名也能很快的记住你公司的名字。
- 数据中心“超级客户”——互联网企业的算力布局