部署窗口里 setup:upgrade 十几分钟没输出,CPU 也不高,看起来像死了。直接 kill 再重跑,可能每次卡在同一位置,还会清掉最有价值的数据库现场。
先看进程正在做什么
ps -eo pid,etime,cmd | grep '[s]etup:upgrade'
SHOW FULL PROCESSLIST;
SELECT * FROM performance_schema.metadata_locks
WHERE LOCK_STATUS = 'PENDING';若 SQL 等 metadata lock,通常是长事务占用了即将 ALTER 的表。先找到阻塞链与业务来源,评估能否安全结束阻塞事务,不要先杀升级会话。
没有锁,也可能在处理大表
Declarative schema、数据补丁和第三方迁移都可能扫描大表。检查当前 SQL、磁盘 I/O、临时表空间与 binlog。测试库几秒的无索引 UPDATE,在生产几千万行会完全不同。
查看 patch_list 和模块状态,定位尚未完成的 patch 类并阅读实现。补丁应可重复或明确标记完成;超大数据迁移不宜全部塞进发布命令。
中止前先准备恢复路径
确认数据库有可恢复备份,记录 release、维护模式和已完成 patch。若必须终止,先理解事务边界。重跑前解决锁或 SQL 根因。
后续在生产规模副本演练,记录每个 patch 耗时,把大迁移拆成可观察、可续跑任务。命令结束后仍要核对 schema、patch_list、核心页面和消费者。

