Agent Skills
返回列表
💻

pgroll PostgreSQL 无停机迁移

开发编程 更新于 2026.08.29

将以下提示词粘贴到你的 AI 对话框中:

请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/pgroll-postgresql-zero-downtime-schema-migration。

技能介绍

要解决什么问题

PostgreSQL 在线服务场景下的 schema 变更是个老问题:ALTER TABLE 在大的表上可能长时间持有锁,阻塞写入;高风险操作一旦执行就无法回退;开发、测试、生产环境之间还经常出现 schema drift。传统的做法是先停写、再迁移、最后恢复,对可用性敏感的服务来说代价太大。pgroll 要解决的就是这一连串痛点:在不停机的前提下完成 schema 演进,并且每一步都可逆。

它的工作方式

pgroll 采用 expand-and-contract(扩展-收缩) 模式驱动迁移,而不是一次性替换 schema。整体分为两个阶段:

  • Expand:先添加新列、新约束或新索引,让新旧结构同时存在,旧代码继续读写旧字段,新代码逐步切换到新字段;
  • Contract:确认所有读写方都已迁移完成后,再删除旧列、旧约束,清理临时结构。

在这个框架下,pgroll 提供几项关键能力:

  • 双版本并存:新旧 schema 在迁移期间同时生效,应用可以按自己的节奏滚动发布;
  • 自动回填:expand 阶段新增列后,pgroll 负责把历史数据回填到新列,避免手工写 UPDATE 脚本;
  • 即时回滚:任何一步出现问题,可以撤销到上一个干净的版本,而不是靠备份和祈祷;
  • 操作分步声明:迁移以可评审的 roll 操作序列表达,每一步都有明确的起止状态,便于 code review 和审计。

对工程师来说,实际工作流程大致是:编写一次 migration,让 pgroll 执行 expand 与 backfill,观察应用侧逐步切换,最后在确认稳定后执行 contract。整个过程服务不中断,也没有危险的大锁操作。

适用边界与注意点

  • 该工具面向 PostgreSQL 在线 schema 演进,不适用于其他数据库方言;
  • 上游项目要求 Go 1.24 或更高版本,这是硬性环境约束;
  • expand-and-contract 虽然降低停机风险,但 contract 阶段仍需在所有客户端完成切换后才能安全执行,过早清理旧结构会破坏尚未升级的客户端;
  • 自动 backfill 在超大规模表上依然有成本,回填期间的写放大与锁行为需要结合实际数据量评估;
  • 工具本身来自 Xata 的开源实现,迁移策略的理解仍然依赖工程师对 expand-and-contract 模式本身的掌握。

使用场景

  • 给高并发生产库的大表新增列:用 pgroll 在 expand 阶段加新列并自动回填历史数据,避免锁表阻塞写入。
  • 应用滚动发布期间新旧代码并存:pgroll 让新旧 schema 并存,客户端按节奏切换字段,服务不中断。
  • 迁移上线后发现新结构写入异常:用 pgroll 的即时回滚撤销到上一个干净的 schema,不必从备份恢复。
  • 清理历史遗留列前需确认所有客户端已切换:在 contract 阶段删除旧结构,完成可逆的收缩步骤。

适合人员

  • 后端工程师:需要给在线 PostgreSQL 服务做加列、改约束等 schema 变更,又不想停服。
  • DBA:负责生产库变更评审,关心迁移是否可回滚、是否阻塞写入。
  • 平台工程师:管理多个环境间的 schema 一致性,用 expand-and-contract 降低 schema drift。
  • 小团队技术负责人:希望迁移流程可逆、可审计,减少停服窗口和线上事故。