用SHOW PROCESSLIST识别DDL需关注State(如altering table)、Info(用FULL查看完整语句)、Time(持续增长表明执行中);State为Waiting for table metadata lock则被阻塞,需查INNODB_TRX;performance_schema默认不记录DDL阶段,需手动启用对应instruments。

如何用 SHOW PROCESSLIST 快速识别正在执行的 DDL 语句
MySQL 5.7+ 的 SHOW PROCESSLIST 能看到 DDL 是否卡住,但默认不显示详细阶段。关键看三列:State、Info、Time。如果 State 是 altering table 或 copy to tmp table,且 Time 持续增长,大概率 DDL 正在执行中(不是“已完成等待提交”)。
常见误判点:
-
State显示Waiting for table metadata lock:不是 DDL 慢,是被其他事务(比如长事务、未提交的SELECT)锁住了元数据,得先查information_schema.INNODB_TRX找阻塞源 -
Info字段可能被截断(默认 100 字符),用SHOW FULL PROCESSLIST才能看到完整 DDL 语句 - 普通用户看不到其他用户的线程,需有
PROCESS权限
为什么 performance_schema.events_stages_current 查不到 DDL 阶段
DDL 的执行阶段(如 “copying to tmp table”、“renaming table”)默认不会记录到 events_stages_current,因为 MySQL 对 DDL 的 stage 事件采集受配置限制。必须同时满足:
-
performance_schema已启用(启动时--performance-schema=ON) -
setup_consumers中启用了events_stages_current和events_stages_history_long -
setup_instruments中启用了对应 stage instrument,例如stage/innodb/alter table%(MySQL 8.0+ 默认关闭,需手动打开)
检查命令:
SELECT * FROM performance_schema.setup_instruments WHERE NAME LIKE 'stage/innodb/alter%';
若 ENABLED 为 NO,执行:UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'stage/innodb/alter%';
MySQL 8.0+ 真实可用的 DDL 进度查询方式
8.0.13+ 引入了 INFORMATION_SCHEMA.INNODB_METRICS 和更可靠的 performance_schema.table_lock_waits_summary_by_table 辅助判断,但最直接的是查 performance_schema.events_statements_current + events_stages_history_long 关联:
- 先定位 DDL 线程 ID:
SELECT THREAD_ID, SQL_TEXT FROM performance_schema.events_statements_current WHERE SQL_TEXT LIKE 'ALTER TABLE%'; - 再查该线程的 stage 历史:
SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM performance_schema.events_stages_history_long WHERE THREAD_ID = ? ORDER BY TIMER_START DESC LIMIT 5; -
WORK_COMPLETED和WORK_ESTIMATED仅对部分 DDL(如ALGORITHM=INPLACE的二级索引创建)有值;多数COPY类 DDL 仍为NULL
注意:WORK_ESTIMATED 不是行数,而是内部页或 chunk 单位,无法直接换算成百分比。
真正能估算进度的替代方案:sys.schema_table_statistics_with_buffer
官方 sys 库提供间接线索:sys.schema_table_statistics_with_buffer 可反映表的 I/O 压力变化。DDL 执行时,目标表的 io_read_requests、io_write_requests 会明显上升;配合 INFORMATION_SCHEMA.INNODB_SYS_TABLES 查当前表大小,可粗略比对已写数据量(需结合 SHOW ENGINE INNODB STATUS 中的 LOG 和 BUFFER POOL 部分)。
更实用的做法是监控磁盘写入速率(iostat -x 1)和 ibdata1 / 分区文件增长速度 —— 多数线上环境里,这才是最稳定、不依赖权限与配置的进度锚点。
DDL 进度本身没有标准 API,所有“阶段”字段都依赖具体版本、ALGORITHM、存储引擎和 instrumentation 配置;别信“100% 完成”这种输出,它可能只是阶段切换的中间态。











