1. 首页 > PostgreSQL教程 > 正文

PostgreSQL教程FG276-PG版本升级实战:从17到18全流程(原地/平滑)

本文档风哥主要介绍PostgreSQL从17版本升级到18版本的全流程,包括原地升级和平滑升级两种方法。风哥教程参考PostgreSQL官方文档Server Administration部分的升级相关内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 PostgreSQL版本升级的概念

PostgreSQL版本升级是指将数据库系统从一个版本更新到另一个版本的过程。版本升级通常包括:

  • 主版本升级:如从17.x升级到18.x,通常需要特殊的升级工具
  • 次版本升级:如从18.0升级到18.1,通常只需替换二进制文件
PostgreSQL版本号规则:

  • 主版本号:如18,表示重大功能变更
  • 次版本号:如1,表示修复bug和安全补丁

1.2 PostgreSQL版本升级的方法

PostgreSQL支持以下升级方法:

  • 原地升级(pg_upgrade):使用pg_upgrade工具直接升级,停机时间较短
  • 平滑升级(逻辑复制):使用逻辑复制实现几乎零停机升级
  • 转储/恢复:使用pg_dump/pg_restore,适用于小型数据库

1.3 PostgreSQL版本升级的注意事项

版本升级前需要考虑以下因素:

  • 兼容性:检查应用程序与新版本的兼容性
  • 停机时间:评估升级所需的停机时间
  • 备份:确保有完整的数据库备份
  • 测试:在测试环境中进行升级测试
  • 回滚计划:准备回滚方案以防升级失败
风哥提示:版本升级前一定要进行充分的测试,特别是对于生产环境。建议先在测试环境中模拟升级过程,确保没有问题后再在生产环境实施。学习交流加群风哥微信: itpux-com

Part02-生产环境规划与建议

2.1 PostgreSQL版本升级规划

版本升级规划包括以下步骤:

# 1. 升级前准备
– 制定详细的升级计划
– 确定升级方法(原地升级或平滑升级)
– 安排升级时间窗口
– 准备回滚方案

# 2. 升级工具准备
– 下载PostgreSQL 18安装包
– 安装新版本软件
– 准备pg_upgrade工具

# 3. 升级流程规划
– 备份数据库
– 停止旧版本服务
– 执行升级操作
– 启动新版本服务
– 验证升级结果
– 执行后续优化

2.2 PostgreSQL版本升级前检查清单

# 升级前检查清单
– [ ] 备份数据库(完整备份)
– [ ] 检查数据库大小和复杂度
– [ ] 检查应用程序兼容性
– [ ] 检查扩展插件兼容性
– [ ] 检查系统资源(磁盘空间、内存)
– [ ] 测试升级过程
– [ ] 准备回滚方案
– [ ] 通知相关人员
– [ ] 确认升级时间窗口

2.3 PostgreSQL版本升级回滚计划

回滚计划包括:

  • 备份恢复:使用升级前的备份恢复数据库
  • 二进制回滚:保留旧版本二进制文件,必要时回滚
  • 测试回滚:确保回滚过程可行
风哥教程针对风哥教程针对生产环境建议:升级前一定要进行完整的数据库备份,并确保备份可以正常恢复。学习交流加群风哥QQ113257174

Part03-生产环境项目实施方案

3.1 PostgreSQL原地升级(pg_upgrade)

3.1.1 原地升级准备工作

# 1. 安装PostgreSQL 18
# 下载并安装PostgreSQL 18
$ sudo yum install postgresql18-server postgresql18-contrib

# 2. 停止PostgreSQL 17服务
$ sudo systemctl stop postgresql-17

# 3. 备份数据库
$ pg_dumpall -h fgedu.localhost -U postgres -p 5432 > /backup/full_backup.sql

# 4. 检查pg_upgrade工具
$ /postgresql/fgapp/bin/pg_upgrade –help

3.1.2 执行原地升级

# 执行pg_upgrade
$ sudo -u postgres /postgresql/fgapp/bin/pg_upgrade \
–old-datadir=/postgresql/data17 \
–new-datadir=/postgresql/data18 \
–old-bindir=/usr/pgsql-17/bin \
–new-bindir=/postgresql/fgapp/bin

# 输出示例
Performing Consistency Checks
—————————–]
Checking cluster versions ok
Checking database user is the install user ok
Checking database connection settings ok
Checking for prepared transactions ok
Checking for reg* system OID user data types ok
Checking for contrib/isn with bigint-passing mismatch ok
Checking for tables with OIDs ok
Checking for invalid “sql_identifier” user columns ok
Checking for presence of required libraries ok
Checking database user is the install user ok
Checking for prepared transactions ok

If pg_upgrade fails after this point, you must re-initdb the
new cluster before continuing.

Performing Upgrade
——————
Analyzing all rows in the new cluster ok
Freezing all rows on the new cluster ok
Deleting files from new pg_xact ok
Copying old pg_xact to new server ok
Setting oldest XID for new cluster ok
Setting next transaction ID and epoch for new cluster ok
Deleting files from new pg_multixact/offsets ok
Copying old pg_multixact/offsets to new server ok
Deleting files from new pg_multixact/members ok
Copying old pg_multixact/members to new server ok
Setting next multixact ID and offset for new cluster ok
Resetting WAL archives ok
Setting frozenxid and minmxid counters in new cluster ok
Restoring global objects in the new cluster ok
Restoring database schemas in the new cluster ok
Copying user relation files ok
Setting next OID for new cluster ok
Sync data directory to disk ok
Creating script to analyze new cluster ok
Creating script to delete old cluster ok

Upgrade Complete
—————-
Optimizer statistics are not transferred by pg_upgrade.
Once you start the new server, run:
/postgresql/fgapp/bin/vacuumdb –all –analyze-in-stages

Running this script will delete the old cluster’s data files:
./delete_old_cluster.sh

3.1.3 启动新版本服务

# 启动PostgreSQL 18服务
$ sudo systemctl start postgresql-18

# 启用自启动
$ sudo systemctl enable postgresql-18

# 检查服务状态
$ sudo systemctl status postgresql-18

# 输出示例
● postgresql-18.service – PostgreSQL 18 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-18.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2026-04-07 10:00:00 CST; 1min ago
Process: 12345 ExecStart=/postgresql/fgapp/bin/postmaster -D /postgresql/data18 (code=exited, status=0/SUCCESS)
Main PID: 12345 (postmaster)
CGroup: /system.slice/postgresql-18.service
├─12345 /postgresql/fgapp/bin/postmaster -D /postgresql/data18
├─12346 postgres: logger process
├─12348 postgres: checkpointer process
├─12349 postgres: writer process
├─12350 postgres: wal writer process
├─12351 postgres: autovacuum launcher process
└─12352 postgres: stats collector process

Apr 07 10:00:00 fgedu.net.cn systemd[1]: Started PostgreSQL 18 database server.

3.2 PostgreSQL平滑升级(逻辑复制)

3.2.1 平滑升级准备工作

# 1. 安装PostgreSQL 18
$ sudo yum install postgresql18-server postgresql18-contrib

# 2. 初始化PostgreSQL 18数据库
$ sudo -u postgres /postgresql/fgapp/bin/initdb -D /postgresql/data18

# 3. 配置PostgreSQL 18
$ sudo vi /postgresql/data18/postgresql.conf
# 修改以下参数
# listen_addresses = ‘fgedu.localhost’ 改为 listen_addresses = ‘*’
# port = 5432 改为 port = 5433

# 4. 配置pg_hba.conf
$ sudo vi /postgresql/data18/pg_hba.conf
# 添加以下行
host replication postgres 127.0.0.1/32 trust

# 5. 启动PostgreSQL 18服务
$ sudo systemctl start postgresql-18

3.2.2 配置逻辑复制

# 在PostgreSQL 17上创建发布
$ psql -h fgedu.localhost -U postgres -p 5432

postgres=# CREATE PUBLICATION pg_upgrade_pub FOR ALL TABLES;
CREATE PUBLICATION

# 在PostgreSQL 18上创建订阅
$ psql -h fgedu.localhost -U postgres -p 5433

postgres=# CREATE SUBSCRIPTION pg_upgrade_sub
postgres-# CONNECTION ‘host=fgedu.localhost port=5432 dbname=postgres user=postgres’
postgres-# PUBLICATION pg_upgrade_pub;
CREATE SUBSCRIPTION

# 检查复制状态
postgres=# SELECT * FROM pg_stat_subscription;

3.2.3 切换服务

# 1. 停止应用程序

# 2. 等待复制完成
$ psql -h fgedu.localhost -U postgres -p 5433
postgres=# SELECT * FROM pg_stat_subscription WHERE status = ‘streaming’;

# 3. 停止PostgreSQL 17服务
$ sudo systemctl stop postgresql-17

# 4. 修改PostgreSQL 18端口为5432
$ sudo vi /postgresql/data18/postgresql.conf
# port = 5433 改为 port = 5432

# 5. 重启PostgreSQL 18服务
$ sudo systemctl restart postgresql-18

# 6. 启动应用程序

3.3 PostgreSQL升级后任务

# 1. 分析数据库
$ sudo -u postgres /postgresql/fgapp/bin/vacuumdb –all –analyze-in-stages

# 2. 检查数据库状态
$ psql -h fgedu.localhost -U postgres
postgres=# SELECT version();

# 3. 检查扩展插件
postgres=# SELECT * FROM pg_extension;

# 4. 测试应用程序

# 5. 清理旧版本
$ sudo -u postgres ./delete_old_cluster.sh
$ sudo yum remove postgresql17-server postgresql17-contrib

风哥提示:升级后一定要进行数据库分析,确保优化器统计信息是最新的,这样可以保证查询性能。更多学习教程公众号风哥教程itpux_com

Part04-生产案例与实战讲解

4.1 PostgreSQL原地升级实战案例

4.1.1 环境信息

# 操作系统:Oracle Linux 9.3
# PostgreSQL 17安装路径:/usr/pgsql-17
# PostgreSQL 18安装路径:/postgresql/fgapp
# 数据目录:/postgresql/data17
# 升级时间窗口:2小时

4.1.2 升级步骤

# 1. 备份数据库
$ sudo -u postgres pg_dumpall -h fgedu.localhost -U postgres -p 5432 > /backup/full_backup_20260407.sql

# 2. 停止PostgreSQL 17服务
$ sudo systemctl stop postgresql-17

# 3. 执行pg_upgrade
$ sudo -u postgres /postgresql/fgapp/bin/pg_upgrade \
–old-datadir=/postgresql/data17 \
–new-datadir=/postgresql/data18 \
–old-bindir=/usr/pgsql-17/bin \
–new-bindir=/postgresql/fgapp/bin

# 4. 启动PostgreSQL 18服务
$ sudo systemctl start postgresql-18

# 5. 分析数据库
$ sudo -u postgres /postgresql/fgapp/bin/vacuumdb –all –analyze-in-stages

# 6. 验证升级
$ psql -h fgedu.localhost -U postgres
postgres=# SELECT version();
version
———————————————————————————————————-
PostgreSQL 18.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 11.4.0, 64-bit
(1 row)

# 7. 测试应用程序
# 启动应用程序并验证功能正常

4.2 PostgreSQL平滑升级实战案例

4.2.1 环境信息

# 操作系统:Oracle Linux 9.3
# PostgreSQL 17:端口5432
# PostgreSQL 18:端口5433
# 应用程序:Web应用
# 升级时间窗口:30分钟

4.2.2 升级步骤

# 1. 安装并配置PostgreSQL 18

# 2. 在PostgreSQL 17上创建发布
$ psql -h fgedu.localhost -U postgres -p 5432
postgres=# CREATE PUBLICATION pg_upgrade_pub FOR ALL TABLES;

# 3. 在PostgreSQL 18上创建订阅
$ psql -h fgedu.localhost -U postgres -p 5433
postgres=# CREATE SUBSCRIPTION pg_upgrade_sub
postgres-# CONNECTION ‘host=fgedu.localhost port=5432 dbname=postgres user=postgres’
postgres-# PUBLICATION pg_upgrade_pub;

# 4. 监控复制状态
$ psql -h fgedu.localhost -U postgres -p 5433
postgres=# SELECT * FROM pg_stat_subscription;

# 5. 切换服务
# 停止应用程序
# 等待复制完成
# 停止PostgreSQL 17服务
# 修改PostgreSQL 18端口为5432
# 重启PostgreSQL 18服务
# 启动应用程序

# 6. 验证升级
$ psql -h fgedu.localhost -U postgres
postgres=# SELECT version();
version
———————————————————————————————————-
PostgreSQL 18.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 11.4.0, 64-bit
(1 row)

4.3 PostgreSQL升级常见问题与解决方案

4.3.1 常见问题及解决方法

# 问题1:pg_upgrade失败,提示缺少库文件
# 解决方法:安装缺失的依赖包
$ sudo yum install libicu-devel

# 问题2:升级后应用程序连接失败
# 解决方法:检查pg_hba.conf配置,确保权限正确

# 问题3:升级后性能下降
# 解决方法:执行VACUUM ANALYZE,更新统计信息
$ sudo -u postgres /postgresql/fgapp/bin/vacuumdb –all –analyze-in-stages

# 问题4:扩展插件不兼容
# 解决方法:更新或重新安装扩展插件
$ psql -h fgedu.localhost -U postgres
postgres=# ALTER EXTENSION pg_stat_statements UPDATE;

# 问题5:空间不足
# 解决方法:确保新数据目录有足够的空间,至少是旧数据目录的1.5倍

风哥教程针对风哥教程针对生产环境建议:升级过程中遇到问题不要慌张,按照回滚计划执行回滚操作,确保服务可以正常恢复。from PostgreSQL视频:www.itpux.com

Part05-风哥经验总结与分享

5.1 PostgreSQL版本升级最佳实践

PostgreSQL版本升级最佳实践:

  • 充分测试:在测试环境中模拟升级过程
  • 完整备份:升级前进行完整的数据库备份
  • 选择合适的方法:根据数据库大小和停机时间要求选择升级方法
  • 准备回滚计划:确保升级失败时可以快速回滚
  • 监控升级过程:密切关注升级进度和可能的错误
  • 升级后验证:确保所有功能正常,性能稳定

5.2 PostgreSQL 18性能优化要点

PostgreSQL 18的性能优化要点:

# 1. 内存配置
shared_buffers = 25% of RAM
work_mem = 16MB
maintenance_work_mem = 1GB

# 2. 并发配置
max_connections = 100
max_parallel_workers = 4
max_parallel_workers_per_gather = 2

# 3. WAL配置
wal_buffers = 16MB
checkpoint_timeout = 15min
max_wal_size = 4GB
min_wal_size = 80MB

# 4. 统计信息
autovacuum = on
autovacuum_max_workers = 4
autovacuum_naptime = 10min

# 5. 其他配置
effective_io_concurrency = 200
effective_cache_size = 75% of RAM

5.3 PostgreSQL版本升级检查清单

# 升级前检查清单
– [ ] 备份数据库
– [ ] 检查应用程序兼容性
– [ ] 检查扩展插件兼容性
– [ ] 检查系统资源
– [ ] 测试升级过程
– [ ] 准备回滚方案
– [ ] 通知相关人员

# 升级中检查清单
– [ ] 停止旧版本服务
– [ ] 执行升级操作
– [ ] 监控升级进度
– [ ] 处理可能的错误

# 升级后检查清单
– [ ] 启动新版本服务
– [ ] 分析数据库
– [ ] 验证功能正常
– [ ] 测试应用程序
– [ ] 清理旧版本
– [ ] 记录升级过程

持续改进:版本升级是一个持续的过程,每次升级后都应该总结经验教训,不断优化升级流程,提高升级的效率和可靠性。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息