外观
PostgreSQL 升级前评估与准备
升级前评估内容
版本兼容性检查
主要版本兼容性
| 源版本 | 目标版本 | 支持的升级方法 | 注意事项 |
|---|---|---|---|
| 12.x | 13.x | pg_upgrade, 逻辑备份恢复 | 推荐使用pg_upgrade,升级速度快 |
| 12.x | 14.x | 逻辑备份恢复 | 跨两个主要版本,推荐使用pg_dump/pg_restore |
| 13.x | 14.x | pg_upgrade, 逻辑备份恢复 | 支持直接升级 |
| 14.x | 15.x | pg_upgrade, 逻辑备份恢复 | 支持直接升级 |
| 15.x | 16.x | pg_upgrade, 逻辑备份恢复 | 支持直接升级 |
扩展兼容性
sql
-- 检查已安装的扩展
SELECT * FROM pg_extension;
-- 检查扩展版本兼容性
SELECT extname, extversion FROM pg_extension;依赖评估
应用程序依赖检查
- 驱动兼容性:检查应用使用的PostgreSQL驱动是否支持目标版本
- SQL语法兼容性:验证应用使用的SQL语法在目标版本中是否仍然支持
- 函数和特性依赖:检查应用是否依赖于已弃用或已移除的函数和特性
第三方工具依赖
- 备份工具:验证pg_dump、pg_basebackup等工具的版本兼容性
- 监控工具:检查Prometheus Exporter、pgBadger等监控工具是否支持目标版本
- 管理工具:验证pgAdmin、DBeaver等管理工具是否支持目标版本
性能评估
现有系统性能基线
bash
# 使用pgbench建立性能基线
pgbench -i -h localhost -U postgres -d mydb
pgbench -h localhost -U postgres -d mydb -c 20 -j 4 -T 120 -r > pre_upgrade_baseline.txt资源使用情况评估
sql
-- 检查数据库大小
SELECT pg_size_pretty(pg_database_size(current_database()));
-- 检查表大小分布
SELECT relname, pg_size_pretty(pg_total_relation_size(relid)) as total_size
FROM pg_stat_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 10;升级前准备工作
环境准备
硬件和操作系统准备
- 确保目标服务器硬件配置满足目标PostgreSQL版本的要求
- 检查操作系统版本是否支持目标PostgreSQL版本
- 确保有足够的磁盘空间用于升级过程
目标环境安装
bash
# 以PostgreSQL 15为例
# 添加PostgreSQL仓库
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /usr/share/keyrings/postgresql-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/postgresql-keyring.gpg] http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main 15" | sudo tee /etc/apt/sources.list.d/pgdg.list
# 安装PostgreSQL 15
sudo apt update
sudo apt install postgresql-15 postgresql-contrib-15数据备份
全量备份
bash
# 使用pg_basebackup进行基础备份
pg_basebackup -h localhost -U replication -D /backup/base -F p -Xs -P
# 使用pg_dump进行逻辑备份
pg_dump -h localhost -U postgres -d mydb -F c -b -v -f /backup/mydb_full.backup增量备份验证
bash
# 验证WAL归档是否正常
psql -h localhost -U postgres -c "SELECT pg_current_wal_lsn();"
# 检查归档目录中是否存在对应的WAL文件配置文件准备
配置文件迁移
bash
# 复制配置文件(根据需要调整)
sudo cp /etc/postgresql/14/main/postgresql.conf /etc/postgresql/15/main/
sudo cp /etc/postgresql/14/main/pg_hba.conf /etc/postgresql/15/main/
sudo cp /etc/postgresql/14/main/pg_ident.conf /etc/postgresql/15/main/配置文件调整
bash
# 调整配置文件中的路径和参数
# 1. 修改data_directory路径
# 2. 调整listen_addresses和port(如果需要)
# 3. 检查并更新已弃用的参数
# 4. 调整适合目标版本的新参数升级前验证
预升级检查
使用pg_upgrade --check进行检查
bash
# 停止目标版本PostgreSQL服务
sudo systemctl stop postgresql@15-main
# 运行预升级检查
/usr/lib/postgresql/15/bin/pg_upgrade \
--old-datadir=/var/lib/postgresql/14/main \
--new-datadir=/var/lib/postgresql/15/main \
--old-bindir=/usr/lib/postgresql/14/bin \
--new-bindir=/usr/lib/postgresql/15/bin \
--check检查已弃用和已移除的特性
sql
-- 检查已弃用的配置参数
SELECT name, setting, short_desc FROM pg_settings
WHERE name IN ('old_snapshot_threshold', 'wal_compression');
-- 检查已弃用的函数
SELECT proname, proargtypes, prosrc FROM pg_proc
WHERE proname LIKE '%reg%' OR proname LIKE '%oid%';测试环境验证
- 创建测试环境:在测试环境中复制生产数据
- 执行测试升级:在测试环境中执行完整的升级流程
- 验证功能完整性:测试应用程序的核心功能
- 性能对比:对比升级前后的性能差异
升级前准备清单
必做事项
- [ ] 完成全量数据备份
- [ ] 验证WAL归档是否正常
- [ ] 运行pg_upgrade --check检查
- [ ] 检查扩展兼容性
- [ ] 检查应用程序驱动兼容性
- [ ] 准备回滚计划
- [ ] 通知相关团队升级时间窗口
推荐事项
- [ ] 在测试环境中完成一次完整的升级演练
- [ ] 准备升级操作脚本,减少人工操作错误
- [ ] 准备监控脚本,实时监控升级过程
- [ ] 安排足够的升级时间窗口,预留回滚时间
常见问题(FAQ)
Q1:升级前如何检查扩展兼容性?
A1:可以通过以下步骤检查扩展兼容性:
sql
-- 1. 查看已安装的扩展
SELECT extname, extversion FROM pg_extension;
-- 2. 查阅PostgreSQL官方文档,确认每个扩展在目标版本中的兼容性
-- 3. 在测试环境中验证扩展是否能正常工作Q2:pg_upgrade --check通过后,升级过程中还可能出现问题吗?
A2:虽然pg_upgrade --check可以发现大部分问题,但仍可能出现以下情况:
- 升级过程中磁盘空间不足
- 系统资源不足导致升级中断
- 某些边缘情况未被检查到
因此,即使预检查通过,仍需做好回滚准备。
Q3:升级前需要停止所有应用连接吗?
A3:是的,升级过程中需要停止所有应用连接,以确保数据一致性。建议:
- 在升级前通知所有应用团队
- 停止应用服务
- 验证所有连接已断开:
sql
SELECT * FROM pg_stat_activity WHERE usename NOT IN ('postgres', 'replication');Q4:如何评估升级所需的时间?
A4:升级时间取决于多种因素:
- 数据库大小
- 升级方法(pg_upgrade比逻辑备份恢复快得多)
- 硬件性能
- 网络带宽(如果涉及跨服务器迁移)
建议在测试环境中进行多次升级演练,以获得更准确的时间估计。
Q5:升级前需要更新统计信息吗?
A5:是的,建议在升级前更新统计信息,这有助于提高升级后查询优化器的性能:
sql
-- 更新所有表的统计信息
ANALYZE VERBOSE;Q6:如何处理已弃用的配置参数?
A6:对于已弃用的配置参数:
- 查阅官方文档,了解替代方案
- 在升级前修改配置文件,替换为推荐的参数
- 如果没有直接替代方案,根据官方建议进行调整
例如,对于已弃用的wal_compression参数,可以替换为wal_init_zero和wal_skip_threshold参数。
