absent
delete only
write only
write reorganization
public
官方口径的状态流:absent → delete only → write only → write reorg → public
蓝色 = 当前所在状态 · 绿色 = 已走过的状态 · 本页回放驱动
t —
state —
schema_state —
row_count —
▶ 回放(1:1 真实速度)
⏭ 下一关键帧
⟲ 重置
正在取回采样数据……
这张表上跑的是 80 万行数据的 ADD INDEX 。官方口径说「中间状态转换很快,一般操作中看不到」 ——
我们用一条独立连接每 10ms 轮询一次 information_schema.ddl_jobs,在 4,085.7 ms 里采到 179 个采样点 。
看进度轨上的 7 个刻度:前 3 个状态转换点全部挤在起点 5% 内,收尾的 row_count 到位挤在终点 ——
中间 3.7 秒(91% 时长)整个属于 write reorganization 回填 。这就是「转换很快」在时间轴上的真实样子。
E1 · 关键帧表 —— 采样序列压缩后(状态/相位变化点 + row_count 每 10% 一个点)
# t (ms) state schema_state row_count
1 159.8 queueing none 0
2 191.4 running delete only 0
3 217.9 running write reorganization 0
4 3950.8 running write reorganization 800,039
5 4033.8 running write reorganization 800,278
6 4056.3 done public 800,278
7 4079.1 done public 800,278
ROW_COUNT 的全量序列在 3.7 秒回填期几乎不动(0 → 0 → 0 → 800,039 → 800,278),
收尾一次性到位 —— 这是轮询在真机上观察到的行为,原样回放,不做平滑修饰。完整 179 个采样点 存于
dev/probe/ddl_timeline.json,可下载逐条复核。
E2 在线性 —— 回填期间业务写入零失败
253 / 253
并发写入成功 / 尝试 · 0 失败
一条独立连接与回填同时跑满全程:每约 10ms 一条 INSERT,不阻塞其他会话中的 DML —— 官方口径在这里变成了 253 个真实返回。
E3 并发规则 —— 同表互斥 vs 不同表并行
同表 lab.ddl_same :A 完成 3,608 ms | B 总耗时 6,780 ms(其中等待 ≈ 3,172 ms —— B 被 A 挡住)
不同表 lab.ddl_a / lab.ddl_b :2,449 ms | 2,454 ms(发出后 400ms 快照:两条同时 running · write reorganization)
官方从 v6.2.0 起的判定规则是「涉及同一张表的 DDL 相互阻塞」「涉及不同表的加索引和列类型变更可以并发执行」 —— 上面两组数字就是这两句话各自的一次实测。
E4 失败路径 —— 回填到一半强行取消
267 ms running · write only
332 ms running · write reorganization
626 ms cancelling · write reorganization ← ADMIN CANCEL 生效
3718 ms rollback done · schema_state 回到 none
ALTER 侧收到:ERROR 8214 (HY000): Cancelled DDL job 取消返回:('180', 'successful')
取消时该 job 的 COMMENTS = ingest, DXF —— 说明它确实死在真实的加速回填过程中,而不是排队阶段。这条路径与官方错误原文逐字一致 。
E1+ 完成后的 job 行长什么样
JOB_ID 163 (add index · lab.ddl_demo)
STATE synced | SCHEMA_STATE public
ROW_COUNT 800,278
COMMENTS ingest, DXF, max_node_count=3
执行窗口 09:31:26.604 → 09:31:30.554(v8.5.7)
这一行是 ADMIN SHOW DDL JOBS 的原始输出(未改字段)。COMMENTS 里的 ingest / DXF 即「走了 fast-reorg 加速回填 + 分布式执行框架调度」的直接证据。