应查询 performance_schema.events_statements_current 表获取完整 ddl 语句及 executing 状态,辅以 metadata_locks、threads 和 innodb_trx 表排查锁与阻塞。

怎么查出正在跑的 ALTER、CREATE TABLE 这类 DDL 语句
MySQL 的 SHOW PROCESSLIST 默认不显示完整 SQL,尤其对长 DDL 操作,Info 字段经常是 NULL 或被截断。真正可靠的方式是查 performance_schema.events_statements_current,它能拿到完整语句和执行状态。
实操建议:
- 先确认 performance_schema 已启用:
SELECT @@performance_schema;返回 1 才有效 - 运行:
SELECT THREAD_ID, SQL_TEXT, STATE, TIMER_WAIT FROM performance_schema.events_statements_current WHERE SQL_TEXT LIKE 'ALTER%' OR SQL_TEXT LIKE 'CREATE%' OR SQL_TEXT LIKE 'DROP%' AND STATE = 'EXECUTING';
- 注意:DDL 在执行中通常处于
EXECUTING状态,不是QUEUED或CALCULATING - 如果查不到,可能是语句已进入元数据锁等待(比如被其他事务堵住),这时得结合
metadata_locks表看锁持有情况
为什么 SHOW PROCESSLIST 看不到 DDL 的完整语句
因为 MySQL 5.7+ 默认把 show_compatibility_56 设为 OFF,且 INFORMATION_SCHEMA.PROCESSLIST 的 INFO 列只保留语句前 1024 字节,而 DDL(尤其是带大字段或分区定义的)很容易超长;更关键的是,某些 DDL(如 ALGORITHM=INPLACE 的 ALTER)在内部会拆成多个阶段,PROCESSLIST 只反映最外层线程状态,不体现子任务。
常见错误现象:
-
SHOW PROCESSLIST显示State: Waiting for table metadata lock,但Info是NULL—— 实际可能是个没显式写出的 DDL 卡住了 - 用
mysqladmin processlist查到的语句比客户端里执行的短一截,误以为执行完了,其实是被截断了 - 连接设置了
max_allowed_packet小,导致长 DDL 在协议层就被截断,服务端记录的也是残缺 SQL
查 DDL 进程时,必须连带检查的三个表
单看语句不够,DDL 卡住往往卡在锁、资源或阶段阻塞上。这三个表要一起扫一眼:
-
performance_schema.metadata_locks:看谁持有SCH_M(schema modify)锁,或谁在等SCH_S(schema share)—— DDL 必须拿到SCH_M才能开始 -
performance_schema.threads:确认对应THREAD_ID是否还活着,PROCESSLIST_STATE是否为Executing或Waiting on condition -
information_schema.INNODB_TRX:虽然 DDL 本身不进事务表,但如果它被一个长事务阻塞(比如事务里锁了某行,而 DDL 要重建二级索引),这里能看到那个“拦路虎”事务的TRX_STARTED时间和TRX_QUERY
MySQL 8.0+ 的简化方式:直接用 sys schema 视图
如果你用的是 MySQL 8.0.16+,sys 库自带 schema_table_statistics_with_buffer 不适用,但 sys.session 和 sys.statement_analysis 都没法直接过滤 DDL。真正好用的是 sys.processlist —— 它底层就拼了 performance_schema 多张表,而且默认显示完整 stmt 字段。
实操建议:
- 运行:
SELECT * FROM sys.processlist WHERE command = 'Query' AND (info LIKE 'ALTER%' OR info LIKE 'CREATE%' OR info LIKE 'DROP%') AND state = 'executing'; - 注意:
sys.processlist默认隐藏后台线程(command = 'Daemon'),不会干扰判断 - 缺点:依赖
sys库是否初始化(新实例可能没装),可用SELECT COUNT(*) FROM sys.schema_table_statistics;验证
DDL 的真实执行路径比看起来复杂得多,尤其在有复制、并行重做或 Online DDL 算法切换时,processlist 只是入口,别只盯着那一行看。











