经常碰到开发、何定测试童鞋会问,位D问题线下开发、被阻测试环境,何定执行了一个DDL,位D问题发现很久都没有执行完,被阻是何定不是被阻塞了?要怎么解决?
包括在群里,也经常会碰到类似问题:DDL 被阻塞了,位D问题如何找到阻塞它的被阻 SQL ?

实际上,如何解决 DDL 被阻塞的何定问题,是位D问题 MySQL 中一个共性且高频的问题。
下面,被阻就这个问题,何定给一个清晰明了、位D问题拿来即用的被阻解决方案:
怎么判断一个DDL是不是被阻塞了 ?当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)1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.判断一个 DDL 是不是被阻塞了,很简单,就是执行 show processlist ,查看 DDL 操作对应的状态。
如果显示的是 Waiting for table metadata lock ,则意味着这个 DDL 被阻塞了。
DDL 一旦被阻塞了,后续针对该表的所有操作都会被阻塞,都会显示 Waiting for table metadata lock 。这也是 DDL 让人闻之色变的原因。
碰到了类似场景,要么 Kill DDL 操作,要么 Kill 阻塞 DDL 的会话。
Kill DDL 操作是一个治标不治本的b2b信息网方法,毕竟 DDL 操作总要执行。
除此之外,对于 DDL 操作,需要获取元数据库锁的阶段有两个:DDL 开始之初和 DDL 结束之前。如果是后者,就意味着之前的操作都要回滚,成本相对较高。
所以,碰到类似场景,我们一般都会 Kill 阻塞 DDL 的会话。
那么,怎么知道是哪些会话阻塞了 DDL 呢?
下面我们看看具体的定位方法。
是MySQL 5.7引入的,用来定位 DDL 被阻塞的问题。
针对上面这个Demo。
我们看看sys.schema_table_lock_waits的输出。
复制mysql> select * from sys.schema_table_lock_waits\G
免费信息发布网相关文章:
服务器租用源码下载亿华云企商汇益华科技源码库IT技术网IT资讯网香港云服务器全栈开发益华科技码上建站汇智坊思维库亿华云计算科技前瞻编程之道运维纵横益强数据堂极客码头亿华智慧云云智核益华科技益强智未来益强智囊团益强科技码力社亿华智造益强科技极客编程亿华科技亿华互联IT资讯网益强资讯优选智能时代云站无忧益强编程舍益强编程堂益华IT技术论坛亿华云创站工坊多维IT资讯亿华灵动益强IT技术网
0.1796s , 11713.328125 kb
Copyright © 2025 Powered by MySQL 中如何定位 Ddl 被阻塞的问题,亿华互联 滇ICP备2023000592号-16