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,通常只需替换二进制文件
- 主版本号:如18,表示重大功能变更
- 次版本号:如1,表示修复bug和安全补丁
1.2 PostgreSQL版本升级的方法
PostgreSQL支持以下升级方法:
- 原地升级(pg_upgrade):使用pg_upgrade工具直接升级,停机时间较短
- 平滑升级(逻辑复制):使用逻辑复制实现几乎零停机升级
- 转储/恢复:使用pg_dump/pg_restore,适用于小型数据库
1.3 PostgreSQL版本升级的注意事项
版本升级前需要考虑以下因素:
- 兼容性:检查应用程序与新版本的兼容性
- 停机时间:评估升级所需的停机时间
- 备份:确保有完整的数据库备份
- 测试:在测试环境中进行升级测试
- 回滚计划:准备回滚方案以防升级失败
Part02-生产环境规划与建议
2.1 PostgreSQL版本升级规划
版本升级规划包括以下步骤:
– 制定详细的升级计划
– 确定升级方法(原地升级或平滑升级)
– 安排升级时间窗口
– 准备回滚方案
# 2. 升级工具准备
– 下载PostgreSQL 18安装包
– 安装新版本软件
– 准备pg_upgrade工具
# 3. 升级流程规划
– 备份数据库
– 停止旧版本服务
– 执行升级操作
– 启动新版本服务
– 验证升级结果
– 执行后续优化
2.2 PostgreSQL版本升级前检查清单
– [ ] 备份数据库(完整备份)
– [ ] 检查数据库大小和复杂度
– [ ] 检查应用程序兼容性
– [ ] 检查扩展插件兼容性
– [ ] 检查系统资源(磁盘空间、内存)
– [ ] 测试升级过程
– [ ] 准备回滚方案
– [ ] 通知相关人员
– [ ] 确认升级时间窗口
2.3 PostgreSQL版本升级回滚计划
回滚计划包括:
- 备份恢复:使用升级前的备份恢复数据库
- 二进制回滚:保留旧版本二进制文件,必要时回滚
- 测试回滚:确保回滚过程可行
Part03-生产环境项目实施方案
3.1 PostgreSQL原地升级(pg_upgrade)
3.1.1 原地升级准备工作
# 下载并安装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 执行原地升级
$ 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 启动新版本服务
$ 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 平滑升级准备工作
$ 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 配置逻辑复制
$ 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 切换服务
# 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升级后任务
$ 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
Part04-生产案例与实战讲解
4.1 PostgreSQL原地升级实战案例
4.1.1 环境信息
# PostgreSQL 17安装路径:/usr/pgsql-17
# PostgreSQL 18安装路径:/postgresql/fgapp
# 数据目录:/postgresql/data17
# 升级时间窗口:2小时
4.1.2 升级步骤
$ 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 环境信息
# PostgreSQL 17:端口5432
# PostgreSQL 18:端口5433
# 应用程序:Web应用
# 升级时间窗口:30分钟
4.2.2 升级步骤
# 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 常见问题及解决方法
# 解决方法:安装缺失的依赖包
$ 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倍
Part05-风哥经验总结与分享
5.1 PostgreSQL版本升级最佳实践
PostgreSQL版本升级最佳实践:
- 充分测试:在测试环境中模拟升级过程
- 完整备份:升级前进行完整的数据库备份
- 选择合适的方法:根据数据库大小和停机时间要求选择升级方法
- 准备回滚计划:确保升级失败时可以快速回滚
- 监控升级过程:密切关注升级进度和可能的错误
- 升级后验证:确保所有功能正常,性能稳定
5.2 PostgreSQL 18性能优化要点
PostgreSQL 18的性能优化要点:
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
