数据库在容器中成功启动,并不代表后续维护只需更换镜像。升级前要先知道正在运行哪个版本、数据在哪里,以及出现异常时能恢复到什么状态。
对于已经运行 PostgreSQL 16 的系统,可以先判断同一主版本内的补丁维护需求,再制定备份、停机和业务验收方案,无需为了安装修复直接跨到另一个主版本。
先分清小版本和大版本#
从 PostgreSQL 10 起,第一个数字表示主版本,后一个数字表示小版本。比如 16.13 到 16.14 属于同一主版本内更新,16 到 17 则是大版本升级。这两个小版本号仅用于说明编号关系,实际安装应选择现有主版本对应的当前修复版本。
小版本主要提供修复,大版本可能涉及数据格式与用户可见行为变化,两者不应共用一份简化操作单。小版本更新具有累积性,通常不需要导出重建数据库或运行 pg_upgrade;跳过多次更新时,仍应阅读中间版本的发布说明,确认额外处理步骤。
确认真实版本,别只看配置文件#
部署文件里写着某个镜像标签,只能说明声明的目标,不能证明现在运行的进程已经使用该版本。可能有旧 Pod、旧容器或连接地址指向别处。
确认连接的是目标数据库后,可用下列只读查询检查服务端版本、实例角色与已安装扩展:
SHOW server_version;
SELECT current_database(), pg_is_in_recovery();
SELECT extname, extversion
FROM pg_extension
ORDER BY extname;同时记录实际镜像标识、数据卷位置、配置来源和扩展清单。记录扩展是为了在准备新镜像时核对所需组件,避免数据库本体能启动,但某个依赖库没有装齐。
博客已有在 Kubernetes 部署 PostgreSQL 16 的笔记。其中的 hostPath 是数据存放位置,不自动提供备份;Pod 被重建与数据库可恢复,也不能当作同一件事。
备份的关键是能否恢复#
SQL 导出、文件系统备份和连续归档等方式各有前提,不能把运行中的数据目录随手复制一份,就视为已具备一致、完整的恢复材料。
升级单中应写明四项内容:备份对应的数据库与时间点、使用的工具和版本、备份文件位置,以及最近一次恢复验证结果。如果要求恢复到接近故障前的时刻,还要检查 WAL 归档与恢复链路,不能只依靠昨天的一次导出。
恢复演练要使用独立环境,避免备份刚生成,就拿生产库尝试导入。除了能启动,还要验证角色、权限、必要扩展和关键表数据。恢复成功的证据应该是实际结果,不只是备份命令返回零。
把一次升级分成三个阶段#
| 阶段 | 应取得的结果 | 常见遗漏 |
|---|---|---|
| 准备 | 目标版本、修复范围、镜像与恢复材料明确 | 只看镜像标签,没核对运行版本 |
| 切换 | 写入受控、数据库按方案停止并更换程序 | 把普通滚动发布当成单机数据库升级 |
| 验收 | 实际版本、连接和关键业务符合预期 | 只看 Pod 运行状态 |
同一主版本的小版本保持内部存储格式兼容,常规方式是在服务停止时替换可执行程序再启动。容器场景下,应将这个要求落实为完整的停机与镜像切换方案,而不是让两个实例同时使用同一数据目录。
Kubernetes、Compose、系统服务以及高可用部署的操作顺序不同,执行单必须对应实际架构;使用托管数据库时,还要遵循平台维护机制。
停止写入不只涉及前台请求#
即使页面已进入维护状态,后台定时任务、消息消费者、数据同步和重试队列仍可能写库。升级方案需要列清这些入口,确定何时暂停、何时恢复,以及恢复后是否需要核对积压任务。
对于有资金、库存或外部支付协作的系统,更应区分“暂停处理”与“任务失败”。停机期间出现的超时,不一定意味着上游动作未发生。恢复后应按原任务标识核对状态,避免把维护窗口变成一次批量重放。
数据库进程的维护窗口,与完整业务链路的暂停和恢复并不完全重合。把这些入口列进方案,才能判断恢复顺序与积压处理方式。
回退也要写明边界#
升级前准备旧镜像和配置很有价值,但不能直接写成“出问题就换回去,数据一定没事”。还要核对所用扩展、包管理脚本、额外修复步骤,以及升级后是否已经接受业务写入。
如果使用备份恢复作为回退方式,应明确恢复点之后的变更如何处理。不能在业务已经恢复写入后直接覆盖旧备份,却没有说明会丢弃哪些新数据。涉及外部系统时,数据库恢复也不会自动撤销已经发送的消息或完成的支付。
建议把回退触发条件提前写成可以判断的事项,例如启动失败、关键查询出现已确认错误、扩展加载失败。不要把“看起来不放心”留成现场唯一标准,也不要为了追求零停机而省掉核对。
选择修复版本,并验证业务恢复#
实际维护前,应查阅官方支持与当前小版本列表,确认现有主版本仍受支持,再选择对应分支的当前修复版本。历史公告中的补丁号只说明当时的修复批次。
验收至少应覆盖:从真实应用入口连接数据库;检查关键读写和事务;检查扩展、复制或备份任务;恢复后台任务后观察错误与积压。验证写入应使用约定的隔离数据或测试环境,不能任意往生产添加“测试订单”。
最后保存版本、镜像标识、备份位置、验收结果和未完成项。这样下一次维护时,接手的人可以从确定的运行状态开始,而不是重新猜测上一次到底做了什么。
参考来源#
- PostgreSQL 全球开发组:PostgreSQL 18.4, 17.10, 16.14, 15.18, and 14.23 Released!,2026-05-14。
- PostgreSQL 官方文档:版本与支持政策。
- PostgreSQL 官方文档:备份与恢复。
- PostgreSQL 官方文档:数据库升级。
