Skip to content

PostgreSQL 升级前评估与准备

升级前评估内容

版本兼容性检查

主要版本兼容性

源版本目标版本支持的升级方法注意事项
12.x13.xpg_upgrade, 逻辑备份恢复推荐使用pg_upgrade,升级速度快
12.x14.x逻辑备份恢复跨两个主要版本,推荐使用pg_dump/pg_restore
13.x14.xpg_upgrade, 逻辑备份恢复支持直接升级
14.x15.xpg_upgrade, 逻辑备份恢复支持直接升级
15.x16.xpg_upgrade, 逻辑备份恢复支持直接升级

扩展兼容性

sql
-- 检查已安装的扩展
SELECT * FROM pg_extension;

-- 检查扩展版本兼容性
SELECT extname, extversion FROM pg_extension;

依赖评估

应用程序依赖检查

  1. 驱动兼容性:检查应用使用的PostgreSQL驱动是否支持目标版本
  2. SQL语法兼容性:验证应用使用的SQL语法在目标版本中是否仍然支持
  3. 函数和特性依赖:检查应用是否依赖于已弃用或已移除的函数和特性

第三方工具依赖

  • 备份工具:验证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%';

测试环境验证

  1. 创建测试环境:在测试环境中复制生产数据
  2. 执行测试升级:在测试环境中执行完整的升级流程
  3. 验证功能完整性:测试应用程序的核心功能
  4. 性能对比:对比升级前后的性能差异

升级前准备清单

必做事项

  • [ ] 完成全量数据备份
  • [ ] 验证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:是的,升级过程中需要停止所有应用连接,以确保数据一致性。建议:

  1. 在升级前通知所有应用团队
  2. 停止应用服务
  3. 验证所有连接已断开:
sql
SELECT * FROM pg_stat_activity WHERE usename NOT IN ('postgres', 'replication');

Q4:如何评估升级所需的时间?

A4:升级时间取决于多种因素:

  • 数据库大小
  • 升级方法(pg_upgrade比逻辑备份恢复快得多)
  • 硬件性能
  • 网络带宽(如果涉及跨服务器迁移)

建议在测试环境中进行多次升级演练,以获得更准确的时间估计。

Q5:升级前需要更新统计信息吗?

A5:是的,建议在升级前更新统计信息,这有助于提高升级后查询优化器的性能:

sql
-- 更新所有表的统计信息
ANALYZE VERBOSE;

Q6:如何处理已弃用的配置参数?

A6:对于已弃用的配置参数:

  1. 查阅官方文档,了解替代方案
  2. 在升级前修改配置文件,替换为推荐的参数
  3. 如果没有直接替代方案,根据官方建议进行调整

例如,对于已弃用的wal_compression参数,可以替换为wal_init_zerowal_skip_threshold参数。