mysql 8.0.16+ 可通过 performance_schema 查看 ddl 进度,但需先启用 stage 相关 instruments 和 consumers;work_completed/work_estimated 仅对 algorithm=inplace 操作有效,且需结合 events_statements_current 获取完整语句、data_lock_waits 排查锁阻塞。

MySQL 原生不提供“进度条”式界面,但 8.0.16+ 真实可用的进度线索全藏在 performance_schema 里——前提是相关 instruments 和 consumers 必须提前启用,否则查到的全是 NULL。
确认 performance_schema 阶段监控已启用
很多用户查不到 WORK_COMPLETED,第一反应是“功能坏了”,其实是没开采集开关。必须同时打开两层:
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'stage/innodb/alter%';UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';
执行后立即生效,无需重启。验证是否生效:查 performance_schema.setup_instruments 中对应行的 ENABLED 值是否为 YES;再查 events_stages_current 是否有非空结果。
查当前 DDL 所处阶段及估算进度
只对 ALGORITHM=INPLACE 的部分操作(如加索引、加列)有效,ALGORITHM=COPY 或含外键重建时字段常为空。
- 先定位正在执行的 DDL 线程:
SELECT THREAD_ID, SQL_TEXT FROM performance_schema.events_statements_current WHERE STATE = 'EXECUTING' AND SQL_TEXT REGEXP '^(ALTER|CREATE)'; - 再查该线程当前 stage:
SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM performance_schema.events_stages_current WHERE THREAD_ID = ? AND WORK_ESTIMATED > 0; - 进度百分比可手动算:
ROUND(100 * WORK_COMPLETED / WORK_ESTIMATED, 2),但注意分母为 0 或NULL时会报错或返回空
常见有效 EVENT_NAME 包括 stage/innodb/alter table (read PK and internal sort)、stage/innodb/alter table (write clustered index);若看到 stage/sql/Waiting for table metadata lock,说明根本没开始干活,卡在锁上。
判断是不是真卡住,而不是“慢”
State = 'altering table' 在 SHOW PROCESSLIST 里只是状态占位符,不能反映真实进展。真正要排查的是阻塞点:
- 查锁等待:
SELECT * FROM performance_schema.data_lock_waits;—— 有记录就说明被其他事务锁住 - 查活跃事务:
SELECT THREAD_ID, PROCESSLIST_INFO FROM performance_schema.threads WHERE TYPE = 'FOREGROUND' AND PROCESSLIST_INFO LIKE 'ALTER%'; - 看 I/O 是否瓶颈:结合
sys.metrics或information_schema.INNODB_METRICS查log_writes、buffer_pool_reads等指标突增
如果 events_stages_current 里 WORK_COMPLETED 长时间不动,且 data_lock_waits 为空,大概率是 I/O 或 CPU 瓶颈,不是逻辑卡死。
别依赖 information_schema.PROCESSLIST 的 INFO 字段
information_schema.PROCESSLIST 的 INFO 列默认截断到 1024 字节,长 ALTER TABLE 语句会被砍掉,你看到的可能是 ALTER TABLE t ADD COLUMN... 这种不完整片段,无法确认实际操作对象和参数。
唯一能拿到完整语句的地方是 performance_schema.events_statements_current.SQL_TEXT,它不截断,且带执行上下文。查进度前务必先用它确认你盯的是哪条语句。
WORK_ESTIMATED 是动态估算值,不是固定总量;同一 DDL 多次查询可能数值跳变。它反映的是当前阶段的局部工作量,不是整条语句的全局剩余时间——这点最容易被忽略。











