Skip to content

PostgreSQL 升级前准备

升级准备概述

PostgreSQL升级是数据库运维的重要操作,需要进行充分的准备工作,以确保升级过程顺利、数据安全和业务影响最小化。升级前准备包括升级规划、环境检查、备份策略制定、测试准备等多个方面。

升级规划

1. 确定升级目标版本

版本选择考虑因素

  • 支持生命周期:选择仍在支持期内的版本,避免使用已停止支持的版本
  • 新特性需求:根据业务需求选择支持所需特性的版本
  • 兼容性:确保应用程序和第三方工具与目标版本兼容
  • 升级路径:选择支持直接升级的版本,避免跨多个主版本升级

支持生命周期查询

bash
# 查看当前版本的支持状态
# 可以通过PostgreSQL官方网站或以下命令查看
psql -c "SELECT version();"

2. 评估升级风险

风险评估维度

  • 数据风险:升级过程中可能出现的数据丢失或损坏
  • 业务风险:升级导致的业务中断时间和影响范围
  • 兼容性风险:应用程序、驱动程序和第三方工具与新版本的兼容性
  • 性能风险:升级后可能出现的性能下降

风险评估方法

  • 测试环境验证:在测试环境中进行升级测试
  • 兼容性检查:使用pg_upgrade --check等工具检查兼容性
  • 性能测试:测试升级后的性能表现
  • 回滚计划:制定详细的回滚计划,应对升级失败情况

3. 制定升级计划

计划内容

  • 升级时间:选择业务低峰期进行升级
  • 升级方式:选择合适的升级方式(pg_upgrade、逻辑备份恢复、复制升级等)
  • 升级步骤:详细的升级操作步骤
  • 人员安排:明确参与升级的人员及其职责
  • 资源准备:确保所需的硬件、软件和网络资源
  • 回滚方案:详细的回滚操作步骤
  • 验证步骤:升级后的验证步骤

升级时间窗口估算

  • pg_upgrade:通常需要几分钟到几小时
  • 逻辑备份恢复:根据数据量大小,可能需要几小时到几天
  • 复制升级:主备切换时间通常较短,几分钟以内

4. 升级团队组建

团队角色与职责

角色职责
升级负责人负责整体协调和决策,批准升级计划
DBA负责升级操作的实施和验证
系统管理员负责服务器和基础设施的支持
应用开发人员负责应用程序的兼容性测试和验证
业务代表评估升级对业务的影响,提供业务优先级
沟通协调员负责内部和外部沟通,发布升级信息

环境检查

1. 当前环境检查

数据库版本和配置

bash
# 查看当前PostgreSQL版本
psql -c "SELECT version();"

# 查看当前配置参数
psql -c "SELECT name, setting, boot_val, reset_val FROM pg_settings WHERE setting != boot_val;"

# 查看数据库大小
psql -c "SELECT datname, pg_size_pretty(pg_database_size(datname)) AS size FROM pg_database;"

# 查看表空间大小
psql -c "SELECT spcname, pg_size_pretty(pg_tablespace_size(spcname)) AS size FROM pg_tablespace;"

数据库对象检查

bash
# 查看用户自定义对象
psql -c "SELECT schemaname, tablename FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema');"
psql -c "SELECT schemaname, viewname FROM pg_views WHERE schemaname NOT IN ('pg_catalog', 'information_schema');"
psql -c "SELECT schemaname, proname FROM pg_proc WHERE schemaname NOT IN ('pg_catalog', 'information_schema');"
psql -c "SELECT extname FROM pg_extension WHERE extname != 'plpgsql';"

# 查看外部表和外部数据包装器
psql -c "SELECT * FROM pg_foreign_table;"
psql -c "SELECT * FROM pg_foreign_server;"

# 查看分区表
psql -c "SELECT schemaname, tablename FROM pg_partitions;"  # PostgreSQL 13+

数据库健康检查

bash
# 运行数据库完整性检查
psql -c "VACUUM ANALYZE VERBOSE;"

# 检查数据库集群状态
pg_controldata /var/lib/postgresql/14/main

# 检查WAL文件
pg_waldump pg_wal/000000010000000000000001 | head -20

2. 目标环境准备

安装目标版本

bash
# 在Ubuntu/Debian上安装PostgreSQL 14
sudo apt-get update
sudo apt-get install postgresql-14

# 在CentOS/RHEL上安装PostgreSQL 14
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo yum install -y postgresql14 postgresql14-server postgresql14-contrib

# 初始化目标版本数据库
sudo /usr/pgsql-14/bin/postgresql-14-setup initdb

配置目标版本

bash
# 复制当前版本的配置文件到目标版本
cp /var/lib/postgresql/13/main/postgresql.conf /var/lib/postgresql/14/main/
cp /var/lib/postgresql/13/main/pg_hba.conf /var/lib/postgresql/14/main/
cp /var/lib/postgresql/13/main/pg_ident.conf /var/lib/postgresql/14/main/

# 调整目标版本的配置参数
vi /var/lib/postgresql/14/main/postgresql.conf
# 修改数据目录、端口等参数

配置目标版本服务

bash
# 启动目标版本服务
sudo systemctl start postgresql-14
sudo systemctl enable postgresql-14

# 检查目标版本服务状态
sudo systemctl status postgresql-14

3. 兼容性检查

使用pg_upgrade --check检查

bash
# 停止目标版本服务
sudo systemctl stop postgresql-14

# 使用pg_upgrade --check检查兼容性
/usr/pgsql-14/bin/pg_upgrade --check \
  --old-datadir=/var/lib/postgresql/13/main \
  --new-datadir=/var/lib/postgresql/14/main \
  --old-bindir=/usr/lib/postgresql/13/bin \
  --new-bindir=/usr/pgsql-14/bin

检查扩展兼容性

bash
# 查看当前安装的扩展
psql -c "SELECT extname, extversion FROM pg_extension WHERE extname != 'plpgsql';"

# 检查扩展在目标版本中的可用性
# 可以通过PostgreSQL官方文档或以下命令查看
/usr/pgsql-14/bin/psql -c "SELECT name FROM pg_available_extensions;"

检查应用程序兼容性

  • 测试应用程序与目标版本的连接
  • 测试应用程序的核心功能
  • 测试第三方工具与目标版本的兼容性

备份策略

1. 备份类型选择

备份类型特点适用场景
基础备份完整的数据目录备份,恢复速度快适用于大型数据库,需要快速恢复
逻辑备份基于SQL语句的备份,兼容性好适用于小型数据库,需要跨版本恢复
WAL归档连续的WAL日志备份,支持PITR适用于需要时间点恢复的场景
表空间备份表空间级别的备份适用于表空间分布在不同存储设备的场景

2. 备份策略制定

完整备份

bash
# 使用pg_basebackup创建基础备份
pg_basebackup -D /path/to/backup -c fast -Fp -Xs -v -P -U replication

# 压缩备份
pg_basebackup -D - -c fast -Fp -Xs -v -P -U replication | gzip > /path/to/backup.tar.gz

逻辑备份

bash
# 备份所有数据库
pg_dumpall -f /path/to/dumpall.sql

# 备份单个数据库
pg_dump -d dbname -f /path/to/dbname.sql

# 压缩备份
pg_dump -d dbname | gzip > /path/to/dbname.sql.gz

# 自定义格式备份(支持并行恢复)
pg_dump -d dbname -Fd -j 4 -f /path/to/dbname_dump

WAL归档配置

bash
# 配置WAL归档
vi /var/lib/postgresql/13/main/postgresql.conf
# 设置以下参数
# wal_level = replica
# archive_mode = on
# archive_command = 'cp %p /path/to/wal/archive/%f'

# 重启数据库服务
sudo systemctl restart postgresql-13

3. 备份验证

基础备份验证

bash
# 使用pg_verifybackup验证基础备份
pg_verifybackup /path/to/backup

逻辑备份验证

bash
# 检查备份文件的完整性
pg_restore -l /path/to/dbname_dump > /dev/null

# 恢复备份到测试环境进行验证
pg_restore -d testdb /path/to/dbname_dump

4. 备份存储

存储位置

  • 本地存储:快速访问,但存在单点故障风险
  • 远程存储:避免单点故障,建议使用异地存储
  • 云存储:高可用性和可扩展性,如AWS S3、阿里云OSS等

存储策略

  • 遵循3-2-1备份原则:3份备份,2种不同介质,1份异地存储
  • 定期轮换备份:设置备份保留期,避免存储空间耗尽
  • 加密存储:对敏感数据进行加密存储

测试准备

1. 测试环境搭建

测试环境要求

  • 与生产环境相同的硬件配置
  • 与生产环境相同的PostgreSQL版本(源版本和目标版本)
  • 与生产环境相同的应用程序和第三方工具
  • 足够的存储空间用于备份和测试

测试数据准备

  • 使用生产环境的备份数据恢复到测试环境
  • 确保测试数据与生产数据保持一致
  • 可以使用部分数据进行测试,但建议使用完整数据

2. 升级测试

升级方式测试

  • 在测试环境中测试选择的升级方式
  • 记录升级过程中的问题和解决方法
  • 验证升级后的数据库功能和性能

应用程序兼容性测试

  • 测试应用程序与升级后数据库的连接
  • 测试应用程序的核心功能
  • 测试应用程序的性能表现
  • 测试第三方工具与升级后数据库的兼容性

性能测试

  • 测试升级后的查询性能
  • 测试升级后的写入性能
  • 测试升级后的并发性能
  • 与升级前的性能进行对比

3. 回滚测试

回滚方案测试

  • 在测试环境中测试回滚方案
  • 记录回滚过程中的问题和解决方法
  • 验证回滚后的数据库功能和数据完整性

回滚时间测试

  • 测试回滚过程所需的时间
  • 验证回滚后的业务连续性

不同PostgreSQL版本的升级准备差异

PostgreSQL 9.x 升级准备

特点

  • 版本较旧,支持的升级路径有限
  • 可能需要跨多个主版本升级
  • 扩展生态相对不完善
  • 配置参数和功能与新版本差异较大

升级准备要点

  • 检查应用程序和第三方工具的兼容性
  • 可能需要先升级到中间版本,再升级到目标版本
  • 注意配置参数的变化,特别是废弃的参数
  • 测试扩展在新版本中的可用性

PostgreSQL 10+ 升级准备

特点

  • 支持直接升级到最新版本
  • 扩展生态相对完善
  • 配置参数和功能与新版本差异较小
  • 支持pg_upgrade的并行升级功能

升级准备要点

  • 使用pg_upgrade --check检查兼容性
  • 测试扩展在新版本中的可用性
  • 注意新功能的配置和使用
  • 测试并行查询等新功能的性能

PostgreSQL 12+ 升级准备

特点

  • 支持并行备份和恢复
  • 增强的逻辑复制功能
  • 改进的分区表功能
  • 支持更多的数据类型和功能

升级准备要点

  • 测试分区表在新版本中的表现
  • 测试逻辑复制在新版本中的功能
  • 利用并行备份和恢复提高效率
  • 测试新数据类型的兼容性

PostgreSQL 14+ 升级准备

特点

  • 增强的系统资源管理
  • 改进的复制功能
  • 支持更多的扩展和工具
  • 增强的安全功能

升级准备要点

  • 测试系统资源管理功能
  • 测试复制功能的改进
  • 利用新的扩展和工具提高效率
  • 测试安全功能的增强

升级准备最佳实践

1. 提前规划

  • 至少提前1-2个月开始规划升级
  • 充分评估升级风险和影响
  • 制定详细的升级计划和回滚方案

2. 充分测试

  • 在测试环境中进行充分的升级测试
  • 测试升级、回滚和验证的完整流程
  • 测试应用程序的兼容性和性能

3. 备份优先

  • 升级前进行完整的备份
  • 确保备份的完整性和可用性
  • 遵循3-2-1备份原则

4. 逐步升级

  • 对于跨多个主版本的升级,建议逐步升级
  • 先升级到中间版本,测试稳定后再升级到目标版本
  • 避免一次性跨多个主版本升级

5. 准备回滚方案

  • 制定详细的回滚方案
  • 在测试环境中测试回滚方案
  • 确保回滚过程快速、可靠

6. 监控和验证

  • 升级过程中密切监控系统状态
  • 升级后进行全面的验证
  • 监控升级后的性能和稳定性

7. 沟通和协调

  • 与业务方和相关团队充分沟通
  • 提前通知升级时间和影响范围
  • 升级过程中及时通报进度和问题

总结

PostgreSQL升级前准备是确保升级成功的关键环节,需要进行充分的规划、环境检查、备份策略制定和测试准备。通过合理的升级规划、全面的环境检查、可靠的备份策略和充分的测试准备,可以降低升级风险,确保升级过程顺利,减少业务影响。不同版本的PostgreSQL在升级准备方面存在差异,需要根据实际情况进行调整。遵循升级准备最佳实践,可以提高升级的成功率,确保数据库的可靠性和可用性。