外观
PostgreSQL 升级步骤
升级步骤概述
PostgreSQL升级步骤根据选择的升级方式不同而有所差异。本文档将详细介绍三种主要升级方式的操作步骤:pg_upgrade、逻辑备份恢复和复制升级。每种方式都有其适用场景和注意事项,DBA需要根据实际情况选择合适的升级方式。
pg_upgrade升级步骤
pg_upgrade是PostgreSQL官方提供的快速升级工具,适用于支持直接升级路径的版本。以下是使用pg_upgrade进行升级的详细步骤:
1. 准备工作
1.1 安装目标版本
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-contrib1.2 初始化目标版本数据库
bash
# 初始化PostgreSQL 14数据库
sudo /usr/pgsql-14/bin/postgresql-14-setup initdb1.3 停止目标版本服务
bash
# 停止PostgreSQL 14服务
sudo systemctl stop postgresql-141.4 配置目标版本
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
# 修改数据目录、端口等参数(如果需要)1.5 运行预检查
bash
# 使用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/bin2. 执行升级
2.1 停止源版本服务
bash
# 停止PostgreSQL 13服务
sudo systemctl stop postgresql-132.2 执行pg_upgrade
bash
# 创建日志目录
mkdir -p /var/log/postgresql/upgrade
# 执行pg_upgrade升级(使用4个并行进程)
/usr/pgsql-14/bin/pg_upgrade \
--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 \
--jobs=4 \
--logfile=/var/log/postgresql/upgrade/pg_upgrade.log2.3 清理旧版本
bash
# 运行pg_upgrade提供的清理脚本
sudo -u postgres ./delete_old_cluster.sh3. 升级后配置
3.1 重建扩展
bash
# 启动目标版本服务
sudo systemctl start postgresql-14
# 连接到目标版本
sudo -u postgres psql
# 重建扩展(如果需要)
ALTER EXTENSION extension_name UPDATE;3.2 更新统计信息
bash
# 更新所有数据库的统计信息
sudo -u postgres vacuumdb --all --analyze-in-stages3.3 重建全文搜索词典(如果需要)
bash
# 重建全文搜索词典
sudo -u postgres psql -c "SELECT ts_restore_dict();"4. 验证升级
4.1 检查版本
bash
# 检查PostgreSQL版本
sudo -u postgres psql -c "SELECT version();"4.2 检查数据库对象
bash
# 检查数据库列表
sudo -u postgres psql -l
# 检查表列表
sudo -u postgres psql -c "\dt" database_name
# 检查扩展列表
sudo -u postgres psql -c "SELECT extname, extversion FROM pg_extension;"4.3 测试应用连接
- 测试应用程序与新版本的连接
- 测试应用程序的核心功能
- 测试第三方工具与新版本的兼容性
逻辑备份恢复升级步骤
逻辑备份恢复是使用pg_dump/pg_dumpall和pg_restore工具进行升级,适用于跨多个主版本、跨平台或跨硬件架构升级。以下是使用逻辑备份恢复进行升级的详细步骤:
1. 准备工作
1.1 安装目标版本
bash
# 安装目标版本(同pg_upgrade步骤)
sudo apt-get install postgresql-141.2 初始化目标版本数据库
bash
# 初始化目标版本数据库
sudo /usr/pgsql-14/bin/postgresql-14-setup initdb1.3 配置目标版本
bash
# 配置目标版本(同pg_upgrade步骤)
vi /var/lib/postgresql/14/main/postgresql.conf
vi /var/lib/postgresql/14/main/pg_hba.conf1.4 启动目标版本服务
bash
# 启动目标版本服务
sudo systemctl start postgresql-142. 备份源版本
2.1 选择备份方式
根据数据库规模和需求选择合适的备份方式:
- 对于小型数据库:使用pg_dumpall进行全库备份
- 对于大型数据库:使用pg_dump进行并行备份
- 对于特定数据库:使用pg_dump备份单个数据库
2.2 执行备份
使用pg_dumpall备份所有数据库
bash
# 备份所有数据库
sudo -u postgres pg_dumpall -f /path/to/dumpall.sql
# 压缩备份
sudo -u postgres pg_dumpall | gzip > /path/to/dumpall.sql.gz使用pg_dump并行备份单个数据库
bash
# 并行备份单个数据库(4个并行进程,自定义格式)
sudo -u postgres pg_dump -d database_name -Fd -j 4 -f /path/to/database_dump
# 压缩备份
sudo -u postgres pg_dump -d database_name | gzip > /path/to/database.sql.gz2.3 验证备份
bash
# 检查备份文件的完整性
pg_restore -l /path/to/database_dump > /dev/null3. 恢复到目标版本
3.1 恢复所有数据库
bash
# 恢复所有数据库
sudo -u postgres psql -f /path/to/dumpall.sql postgres
# 从压缩文件恢复
gunzip -c /path/to/dumpall.sql.gz | sudo -u postgres psql postgres3.2 并行恢复单个数据库
bash
# 并行恢复单个数据库(4个并行进程)
sudo -u postgres pg_restore -d database_name -j 4 /path/to/database_dump
# 从压缩文件恢复
gunzip -c /path/to/database.sql.gz | sudo -u postgres psql database_name3.3 创建数据库用户(如果需要)
bash
# 创建数据库用户
sudo -u postgres psql -c "CREATE USER username WITH PASSWORD 'password';"
# 授予权限
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE database_name TO username;"4. 恢复后配置
4.1 更新统计信息
bash
# 更新所有数据库的统计信息
sudo -u postgres vacuumdb --all --analyze-in-stages4.2 重建扩展
bash
# 重建扩展(如果需要)
sudo -u postgres psql -c "ALTER EXTENSION extension_name UPDATE;"4.3 调整配置参数
根据目标版本的最佳实践调整配置参数,如shared_buffers、work_mem、maintenance_work_mem等。
5. 验证恢复
5.1 检查版本和数据库
bash
# 检查PostgreSQL版本
sudo -u postgres psql -c "SELECT version();"
# 检查数据库列表
sudo -u postgres psql -l5.2 检查数据完整性
bash
# 检查表行数
sudo -u postgres psql -c "SELECT COUNT(*) FROM table_name;" database_name
# 执行简单查询测试
sudo -u postgres psql -c "SELECT * FROM table_name LIMIT 10;" database_name5.3 测试应用连接
- 测试应用程序与新版本的连接
- 测试应用程序的核心功能
- 验证业务数据的完整性
复制升级步骤
复制升级是利用PostgreSQL的复制功能进行升级,适用于对业务中断时间非常敏感的场景。以下是使用复制升级进行升级的详细步骤:
1. 准备工作
1.1 安装目标版本
bash
# 在从库服务器上安装PostgreSQL 14
sudo apt-get install postgresql-141.2 配置源版本的复制参数
bash
# 在源版本(旧版本)上配置复制参数
vi /var/lib/postgresql/13/main/postgresql.conf
# 设置以下参数
wal_level = replica
max_wal_senders = 10
wal_keep_size = 1GB
# 配置pg_hba.conf,允许从库连接
vi /var/lib/postgresql/13/main/pg_hba.conf
# 添加以下行
host replication replication_user slave_ip/32 md5
# 重启源版本服务
sudo systemctl restart postgresql-131.3 创建复制用户
bash
# 在源版本上创建复制用户
sudo -u postgres psql -c "CREATE USER replication_user WITH REPLICATION PASSWORD 'password';"2. 搭建从库
2.1 初始化从库数据库
bash
# 初始化从库数据库
sudo /usr/pgsql-14/bin/postgresql-14-setup initdb2.2 配置从库连接到源版本
bash
# 配置从库连接参数
vi /var/lib/postgresql/14/main/postgresql.conf
# 设置以下参数
primary_conninfo = 'host=master_ip port=5432 user=replication_user password=password'
# 创建standby.signal文件,表示这是一个从库
touch /var/lib/postgresql/14/main/standby.signal
# 配置从库的pg_hba.conf(同主库)
cp /var/lib/postgresql/13/main/pg_hba.conf /var/lib/postgresql/14/main/2.3 启动从库服务
bash
# 启动从库服务
sudo systemctl start postgresql-143. 验证复制
3.1 检查主库复制状态
bash
# 在主库上检查复制状态
sudo -u postgres psql -c "SELECT * FROM pg_stat_replication;"3.2 检查从库复制状态
bash
# 在从库上检查复制状态
sudo -u postgres psql -c "SELECT pg_is_in_recovery();"
sudo -u postgres psql -c "SELECT pg_last_wal_receive_lsn();"
sudo -u postgres psql -c "SELECT pg_last_wal_replay_lsn();"
sudo -u postgres psql -c "SELECT pg_last_xact_replay_timestamp();"3.3 等待复制完成
bash
# 等待从库复制到主库的最新位置
# 在主库上获取当前LSN
sudo -u postgres psql -c "SELECT pg_current_wal_lsn();"
# 在从库上检查是否已经复制到该LSN
sudo -u postgres psql -c "SELECT pg_last_wal_replay_lsn();"4. 切换主备
4.1 准备切换
- 通知相关团队和业务方
- 暂停写操作(如果可能)
- 确保从库已经复制到主库的最新位置
4.2 提升从库为主库
bash
# 在从库上执行提升操作
sudo -u postgres /usr/pgsql-14/bin/pg_ctl promote -D /var/lib/postgresql/14/main
# 验证从库是否已经提升为主库
sudo -u postgres psql -c "SELECT pg_is_in_recovery();"4.3 更新应用连接配置
- 更新应用程序的数据库连接配置,指向新的主库
- 测试应用程序与新主库的连接
4.4 调整新主库配置
bash
# 调整新主库的配置参数,如wal_level、max_wal_senders等
vi /var/lib/postgresql/14/main/postgresql.conf
# 重启新主库服务(如果需要)
sudo systemctl restart postgresql-145. 处理原主库
5.1 原主库作为从库
如果需要将原主库作为新主库的从库:
bash
# 清理原主库的数据目录
sudo systemctl stop postgresql-13
rm -rf /var/lib/postgresql/13/main/*
# 从新主库创建基础备份
pg_basebackup -D /var/lib/postgresql/13/main -c fast -Fp -Xs -v -P -U replication_user -h new_master_ip
# 配置原主库作为从库
vi /var/lib/postgresql/13/main/postgresql.conf
# 设置primary_conninfo指向新主库
# 创建standby.signal文件
touch /var/lib/postgresql/13/main/standby.signal
# 启动原主库服务
sudo systemctl start postgresql-135.2 原主库退役
如果原主库不再需要:
bash
# 停止原主库服务
sudo systemctl stop postgresql-13
sudo systemctl disable postgresql-13
# 卸载原主库软件
sudo apt-get remove postgresql-136. 验证切换
6.1 检查新主库状态
bash
# 检查新主库状态
sudo -u postgres psql -c "SELECT version();"
sudo -u postgres psql -c "SELECT pg_is_in_recovery();"6.2 测试应用功能
- 测试应用程序的核心功能
- 测试写入和读取操作
- 验证业务数据的完整性
6.3 监控系统性能
- 监控新主库的CPU、内存、磁盘使用情况
- 监控查询响应时间
- 监控连接数和锁等待
不同PostgreSQL版本的升级步骤差异
PostgreSQL 9.x
pg_upgrade步骤差异
- 使用pg_resetxlog而非pg_resetwal(如果需要重置WAL)
- 不支持并行升级功能
- 扩展兼容性较差,可能需要重新编译
逻辑备份恢复步骤差异
- 逻辑备份工具功能相对简单,不支持并行备份和恢复
- 某些数据类型可能需要特殊处理
复制升级步骤差异
- 复制功能相对简单,不支持逻辑复制
- 需要使用recovery.conf文件而非standby.signal
PostgreSQL 10+
pg_upgrade步骤差异
- 支持并行升级功能
- 支持pg_resetwal(pg_resetxlog作为别名)
- 增强了扩展兼容性
逻辑备份恢复步骤差异
- 支持并行备份和恢复
- 支持更多数据类型和功能
复制升级步骤差异
- 支持逻辑复制
- 使用standby.signal文件而非recovery.conf
PostgreSQL 12+
pg_upgrade步骤差异
- 增强了并行升级功能
- 支持更多扩展
- 改进了升级日志和错误信息
逻辑备份恢复步骤差异
- 支持并行备份和恢复的更多选项
- 支持分区表的更高效备份和恢复
复制升级步骤差异
- 增强了逻辑复制功能
- 支持更多复制选项
PostgreSQL 14+
pg_upgrade步骤差异
- 增强了兼容性检查
- 改进了升级性能
- 支持更多扩展和功能
逻辑备份恢复步骤差异
- 支持更多数据类型和功能
- 增强了备份和恢复的安全性
复制升级步骤差异
- 增强了复制监控和管理功能
- 支持更多复制选项
升级步骤最佳实践
1. 详细规划
- 制定详细的升级计划,包括每个步骤的时间、责任人、验证方法
- 考虑所有可能的风险和应对措施
- 准备回滚方案
2. 充分测试
- 在测试环境中完整测试升级步骤
- 测试升级、回滚和验证的整个流程
- 测试应用程序与新版本的兼容性
3. 备份优先
- 升级前进行完整的备份
- 确保备份的完整性和可用性
- 遵循3-2-1备份原则
4. 逐步执行
- 严格按照计划执行升级步骤
- 每个步骤完成后进行验证
- 遇到问题及时停止,分析原因后再继续
5. 密切监控
- 升级过程中密切监控系统状态
- 记录升级过程中的所有操作和输出
- 升级后进行全面的监控和验证
6. 沟通协调
- 与业务方和相关团队充分沟通
- 提前通知升级时间和影响范围
- 升级过程中及时通报进度和问题
7. 回滚准备
- 无论选择哪种升级方式,都要准备回滚方案
- 在测试环境中测试回滚方案
- 确保回滚过程快速、可靠
总结
PostgreSQL升级步骤根据选择的升级方式不同而有所差异。pg_upgrade适合大型数据库和需要快速升级的场景,逻辑备份恢复适合跨多个主版本、跨平台或跨硬件架构升级,复制升级适合对业务中断时间非常敏感的场景。
不同PostgreSQL版本的升级步骤也存在差异,DBA需要根据实际版本调整升级步骤。遵循升级步骤最佳实践,可以提高升级的成功率,减少业务影响,确保数据库的可靠性和可用性。
在执行升级操作时,DBA需要保持谨慎,严格按照计划执行,密切监控系统状态,确保升级过程顺利完成。
