Ubuntu 上升级 PostgreSQL 的完整流程
一 升级前准备
- 备份与回滚方案
- 全量备份:使用 pg_dumpall 导出所有数据库与全局对象,便于回滚与迁移。
- 文件系统级备份:对数据目录(如 /var/lib/postgresql/)与配置文件目录(如 /etc/postgresql/)做快照或离线拷贝。
- 检查现状
- 查看当前版本与实例:执行 SELECT version(); 与 sudo systemctl status postgresql,确认正在运行的主版本与数据目录。
- 准备新版本软件源
- 添加官方仓库以获取最新主版本包(Ubuntu 20.04/22.04/24.04 均适用):
- 添加源与密钥:
- echo “deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main” | sudo tee /etc/apt/sources.list.d/pgdg.list
- wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/postgresql.gpg >/dev/null
- 更新索引:sudo apt update
- 兼容性核查
- 大版本升级前阅读官方“版本间不兼容变更”与扩展(如 PostGIS)适配说明;必要时在测试环境演练。
二 小版本升级
- 适用场景:同一主版本内的补丁升级(如 14.5 → 14.7),存储格式不变,通常可直接替换二进制并重启。
- 操作步骤
- 停止服务:sudo systemctl stop postgresql
- 升级包:sudo apt update && sudo apt install postgresql-<当前主版本>(例如 postgresql-14)
- 启动服务:sudo systemctl start postgresql
- 验证:sudo -u postgres psql -c “SELECT version();”
- 说明
- 小版本升级一般无需迁移数据或改动配置;若有自定义编译参数或第三方扩展,建议先在测试环境验证。
三 大版本升级
- 方式一 使用 pg_upgrade(推荐,速度快)
- 安装新版本二进制:sudo apt install postgresql-<新主版本>(例如 postgresql-15)
- 停止旧实例:sudo systemctl stop postgresql
- 执行兼容性检查(示例从 14 → 15):
- sudo -u postgres /usr/lib/postgresql/15/bin/pg_upgrade
-b /usr/lib/postgresql/14/bin -B /usr/lib/postgresql/15/bin
-d /var/lib/postgresql/14/main -D /var/lib/postgresql/15/main --check
- 执行升级(检查通过后):
- sudo -u postgres /usr/lib/postgresql/15/bin/pg_upgrade
-b /usr/lib/postgresql/14/bin -B /usr/lib/postgresql/15/bin
-d /var/lib/postgresql/14/main -D /var/lib/postgresql/15/main
-o ‘-c config_file=/etc/postgresql/14/main/postgresql.conf’
-O ‘-c config_file=/etc/postgresql/15/main/postgresql.conf’
- 重建统计信息:sudo -u postgres /usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages
- 启动新实例并验证:sudo systemctl start postgresql@15-main;sudo -u postgres psql -c “SELECT version();”
- 方式二 逻辑导出导入(最稳妥,跨版本兼容性好)
- 导出旧库:sudo -u postgres pg_dumpall > /path/to/backup.sql
- 初始化新集群:
- Debian 系常见路径:sudo /usr/lib/postgresql/<新主版本>/bin/initdb -D /var/lib/postgresql/<新主版本>/main
- 或使用系统单元初始化:sudo systemctl start postgresql@<新主版本>-main 后 sudo systemctl stop postgresql@<新主版本>-main
- 导入数据:sudo -u postgres psql -f /path/to/backup.sql postgres
- 启动与验证:sudo systemctl start postgresql@<新主版本>-main;sudo -u postgres psql -c “SELECT version();”
- 方式三 逻辑复制(零停机思路)
- 以新版本作为逻辑复制从库订阅旧库,追平后切换主从,再下线旧库;适合对停机敏感的业务。
四 配置与验证
- 配置文件迁移与端口共存
- 参考旧版本配置迁移到新版本目录(如将 postgresql.conf、pg_hba.conf 从 /etc/postgresql/14/main 复制到 /etc/postgresql/15/main)。
- 如需并行验证,可将新实例端口改为 5433:在 postgresql.conf 中设置 port = 5433,并相应调整 pg_hba.conf;验证无误后再切回 5432。
- 远程访问与安全
- 在 pg_hba.conf 中按需配置认证方式(如 md5 或 scram-sha-256),在 postgresql.conf 中设置 listen_addresses = ‘*’ 以允许远程连接(变更需重启)。
- 扩展与统计信息
- 升级后按需重新创建或升级扩展(如 CREATE EXTENSION IF NOT EXISTS postgis;),并执行 vacuumdb --all --analyze-in-stages 以恢复执行计划质量。
- 日志与回滚
- 检查日志:/var/log/postgresql/postgresql-<新主版本>-main.log;若异常,使用备份或旧实例快速回滚。
五 常见问题与处理
- 客户端版本过低导致备份失败
- 现象:pg_dump 版本低于服务器版本 报错。
- 处理:安装并使用与新服务器匹配的 pg_dump(例如安装 postgresql-15 后使用其附带的客户端工具)。
- 新旧版本并存与端口冲突
- 处理:为新实例设置不同端口(如 5433),完成验证后再切换;或先停旧实例再启动新实例。
- 扩展与编译参数不兼容
- 处理:升级前确认扩展兼容性;pg_upgrade 前务必跑 –check,必要时在测试环境先行验证扩展与新版本库对象的可用性。