用途:在正在服务生产流量的 PostgreSQL 库上执行 ALTER TABLE、CREATE INDEX、ADD CONSTRAINT 等变更,避免长时间强锁和锁队列把整张表冻结,也用于向大表新增列并回填、修复“迁移锁表”问题。
主要能力:给出在线安全判断与决策树,区分哪些 ALTER 只改元数据、哪些会全表重写;约束、索引、回填、改列类型/改名的具体做法;并发建索引失败后的检测与恢复。
核心用法:任何迁移 DDL 前先 SET lock_timeout = '3s',被阻塞则以 SQLSTATE 55P03 快速失败并重试,同时用 statement_timeout 兜底;对大表用 CREATE INDEX CONCURRENTLY,且不能放进事务块;加 NOT NULL、外键、CHECK 分两步:先 ... NOT VALID,再 VALIDATE CONSTRAINT;大表回填按 1000-10000 行分块提交,不要一条巨型 UPDATE;改列类型或改名用 expand-contract:加新列、双写、分块回填、切读、再删旧列。新增列默认值需为常量或非易失值,now()、random() 会触发全表重写。SET NOT NULL 前先用已校验的 CHECK 证明非空,以跳过扫描。并发建索引失败会留下 INVALID 索引,可用 DROP INDEX CONCURRENTLY 后重试或 REINDEX INDEX CONCURRENTLY(v12+);每张表同一时间只能有一个并发构建。
适用场景:在线库加列、改列、改名、加约束、并发建索引、百万行级列回填,以及迁移导致锁表、查询停滞的排查恢复。
限制:不用于索引类型/列的选择、VACUUM 与膨胀调优、向新空表批量导入、锁冲突理论与死锁分析,这些由同包其他技能处理。具体操作前请按官方文档核对:https://www.postgresql.org/docs/17/sql-altertable.html 与 https://www.postgresql.org/docs/17/sql-createindex.html。