You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用pg_upgrade排除数据库进行PostgreSQL版本升级?

PostgreSQL 15升级至16时跳过指定数据库的可行方案

pg_upgrade本身没有直接排除单个数据库的参数——它是针对整个集群设计的升级工具,要么处理全部数据库(文件拷贝/硬链接或pg_dump/pg_restore),要么不处理。你提到的--old-options仅用于传递旧PostgreSQL服务的启动参数,无法实现数据库排除。

结合你在Kubernetes initContainer中旧集群未运行的场景,提供两种实用方案:

方案一:临时启动旧集群删除问题库(推荐)

通过临时启动旧实例删除目标库,再执行pg_upgrade,既能保留pg_upgrade的快速升级优势,也能规避问题库的影响:

  1. 用临时配置启动旧PostgreSQL(仅本地访问,无对外暴露风险):
    pg_ctl -D /path/to/old/data -o "-c listen_addresses='localhost' -c port=54321" start
    
  2. 连接并删除问题数据库:
    psql -h localhost -p 54321 -U postgres -c "DROP DATABASE problematic_db;"
    
  3. 停止临时实例:
    pg_ctl -D /path/to/old/data stop
    
  4. 正常执行pg_upgrade:
    pg_upgrade -b /path/to/old/bin -B /path/to/new/bin -d /path/to/old/data -D /path/to/new/data
    

方案二:用pg_dumpall选择性迁移(备选)

若无法临时启动旧集群,可绕过pg_upgrade,直接导出并恢复需要保留的数据库:

  1. 导出排除问题库的集群数据(若旧集群未启动,可单独导出每个需要保留的数据库,再手动导出角色等全局对象):
    pg_dumpall -d postgresql://postgres@localhost:5432 -f cluster_dump.sql --exclude-database=problematic_db
    
  2. 在新集群中导入数据:
    psql -d postgresql://postgres@localhost:5433 -U postgres -f cluster_dump.sql
    

此方案为全量迁移,没有pg_upgrade的速度优势,更适合小规模数据库场景。

内容的提问来源于stack exchange,提问作者Jeff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:47:17