23、PostgreSQL 13 主要版本升级方法详解

PostgreSQL 13 主要版本升级方法详解

1. 引言

在数据库管理中,将 PostgreSQL 升级到新版本是一项常见且重要的任务。升级可以带来新功能、性能提升和安全性增强等好处。本文将详细介绍三种将 PostgreSQL 升级到 13 版本的方法:使用 pg_dumpall 、使用 pg_dump pg_restore 以及使用 pg_upgrade 并会产生停机时间。

2. 升级前的准备

在进行任何升级操作之前,需要确保服务器有足够的空间。如果在同一服务器上进行升级,需要至少三倍于现有数据库集群的空间(不包括 WAL 段和日志文件所需的空间)。例如,若有一个 100GB 的 PostgreSQL 9.3 集群,需要:
- 100GB 用于新的 PostgreSQL 13 集群。
- 额外 100GB 用于存储使用 pg_dumpall 生成的备份转储文件。
- 考虑到 WAL 段的归档和复制,还需要为生成的 WAL 段预留足够的空间。

同时,务必在生产服务器上进行升级之前进行充分的测试,以确保磁盘使用和应用程序功能在升级后正常。

3. 使用 pg_dumpall 进行升级
3.1 操作步骤
  1. 获取现有 PostgreSQL 服务器上安装的所有 Postgres 包
$ rpm -qa | grep postgres
postgresql96-libs-9.6.18-1PGDG.rhel7.x86_64
postgresql96-server-9.6.18-1PGDG.rhel7.x86_64
postgresql96-9.6.18-1PGDG.rhel7.x86_64
postgresql96-contrib-9.6.18-1PGDG.rhel7.x86_64
  1. 安装目标 PostgreSQL 版本(这里是 PostgreSQL 13.1)
$ sudo yum install https://yum.postgresql.org/13/redhat/rhel-7.8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
$ sudo yum install postgresql13-server postgresql13-contrib -y
  1. 初始化 PostgreSQL 13 的数据目录
$ /usr/pgsql-13/bin/initdb -D /var/lib/pgsql/13/data
  1. 如果升级时源服务器和目标服务器相同,为新集群使用不同的端口号
$ cd /var/lib/pgsql/13/data
$ echo "port = 5433" >> postgresql.auto.conf
$ /usr/pgsql-13/bin/pg_ctl -D /var/lib/pgsql/13/data start
  1. 连接到旧集群中的每个数据库,查看已安装的扩展列表
$ /usr/pgsql-9.6/bin/psql -p 5432 -d percona -c "\dx"

输出示例:

 List of installed extensions
 Name | Version | Schema | Description
--------------------+---------+------------+-----------------------
---------------------------------------
 pageinspect | 1.5 | public | inspect the contents of database
pages at a low level
 pg_repack | 1.4.5 | public | Reorganize tables in PostgreSQL
databases with minimal locks
 pg_stat_statements | 1.4 | public | track execution statistics of
all SQL statements executed
 pgstattuple | 1.4 | public | show tuple-level statistics
 plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(5 rows)
  1. 安装 PostgreSQL 13 中不属于 contrib 的扩展
$ sudo yum install pg_repack13 -y
  1. 修复新版本所需的配置参数更改
$ cd /var/lib/pgsql/13/data
$ sudo bash -c 'cat <<EOF >>postgresql.auto.conf
shared_preload_libraries = 'pg_stat_statements, pg_repack'
shared_buffers = '2GB'
EOF'
  1. 使用最新版本的 pg_dumpall 二进制文件转储旧版本的集群
$ /usr/pgsql-13/bin/pg_dumpall > /backupdir/dumpall.sql
  1. 使用 psql 将文本格式的转储文件恢复到新集群
$ /usr/pgsql-13/bin/psql -p 5433 -f /backupdir/dumpall.sql
  1. 关闭旧集群,并以所需端口重启新集群
$ /usr/pgsql-9.6/bin/pg_ctl -D /var/lib/pgsql/9.6/data stop -mf
$ sed -i 's/5433/5432/' postgresql.auto.conf
$ /usr/pgsql-13/bin/pg_ctl -D /var/lib/pgsql/13/data restart -mf
  1. 在新集群上运行全集群范围的 ANALYZE
$ /usr/pgsql-13/bin/vacuumdb -a -z -j 4

输出示例:

$ vacuumdb -a -z -j 4
vacuumdb: vacuuming database "percona"
vacuumdb: vacuuming database "postgres"
vacuumdb: vacuuming database "template1"
  1. 删除旧版本的数据目录、PostgreSQL 包和扩展
$ rm -rf /var/lib/pgsql/9.6/data
$ sudo yum remove postgresql96* pg_repack96 -y
3.2 工作原理

在进行升级之前,需要查看现有 PostgreSQL 包,以便为目标版本安装类似的包。安装完成后,使用 PostgreSQL 13 初始化数据目录,并根据需要修改端口号。为避免依赖错误,需要查看旧版本中安装的所有扩展,并安装 PostgreSQL 13 中缺少的扩展。使用最新版本的二进制文件进行备份和恢复操作,最后进行清理工作。

4. 使用 pg_dump 和 pg_restore 进行升级
4.1 操作步骤

1 - 7 步与使用 pg_dumpall 升级的步骤相同。
8. 使用最新版本的 pg_dumpall 二进制文件转储旧集群的全局对象

$ /usr/pgsql-13/bin/pg_dumpall -g > /backupdir/globals.sql
  1. 使用 psql 将文本格式的转储文件恢复到新集群
$ /usr/pgsql-13/bin/psql -p 5433 -f /backupdir/globals.sql
  1. 对要迁移的数据库进行仅模式转储,并将其恢复到新集群
$ /usr/pgsql-13/bin/psql -h localhost -p 5433 -c "CREATE DATABASE percona"
$ /usr/pgsql-13/bin/pg_dump -s -d percona -p 5432 | psql -h localhost -p 5433 -U postgres -d percona
  1. 进行仅数据转储,可以使用单进程或多并行进程来加速恢复
    • 单进程转储和恢复:
$ /usr/pgsql-13/bin/pg_dump -a -d percona -p 5432 | psql -h localhost -p 5433 -U postgres -d percona
- 并行转储和恢复:
$ /usr/pgsql-13/bin/pg_dump -Fd -j 4 -a -d percona -p 5432 -f /backupdir/
$ /usr/pgsql-13/bin/pg_restore -h localhost -p 5433 -U postgres -Fd -j 4 -d percona /tmp/backupdir

对所有数据库重复此步骤。
12 - 14 步与使用 pg_dumpall 升级的步骤 10 - 12 相同。

4.2 工作原理

与使用 pg_dumpall 升级类似,不同之处在于只使用 pg_dumpall 转储全局对象,而使用 pg_dump pg_restore 迁移数据库。可以利用并行转储和恢复的优势,提高升级效率。

5. 使用 pg_upgrade 进行升级(会产生停机时间)
5.1 操作步骤

1 - 7 步与使用 pg_dumpall 升级的步骤相同。
8. 在旧集群和新集群之间执行一致性检查 :在检查期间,PostgreSQL 13 上的新集群必须关闭。

$ /usr/pgsql-13/bin/pg_ctl -D /var/lib/pgsql/13/data stop -mf
$ /usr/pgsql-13/bin/pg_upgrade -b /usr/pgsql-9.6/bin -B /usr/pgsql-13/bin -d /var/lib/pgsql/9.6/data -D /var/lib/pgsql/13/data -c

如果检查过程中出现错误,例如缺少所需的库,需要解决这些错误并重新运行检查。
9. 解决一致性检查中观察到的错误,并重新运行检查

$ sudo yum install pg_repack13 -y
$ /usr/pgsql-13/bin/pg_upgrade -b /usr/pgsql-9.6/bin -B /usr/pgsql-13/bin -d /var/lib/pgsql/9.6/data -D /var/lib/pgsql/13/data -c

当输出显示 *Clusters are compatible* 时,表示集群兼容。
10. 关闭旧集群和新集群,并执行升级

$ /usr/pgsql-9.6/bin/pg_ctl -D /var/lib/pgsql/9.6/data stop -mf
$ /usr/pgsql-13/bin/pg_ctl -D /var/lib/pgsql/13/data stop -mf
$ /usr/pgsql-13/bin/pg_upgrade -b /usr/pgsql-9.6/bin -B /usr/pgsql-13/bin -d /var/lib/pgsql/9.6/data -D /var/lib/pgsql/13/data
  1. 启动新集群,并在新集群上运行全集群范围的 ANALYZE
$ /usr/pgsql-13/bin/pg_ctl -D /var/lib/pgsql/13/data start
$ /usr/pgsql-13/bin/vacuumdb -a -z -j 4
  1. 删除旧版本的数据目录、PostgreSQL 包和扩展
$ rm -rf /var/lib/pgsql/9.6/data
$ sudo yum remove postgresql96* pg_repack96 -y
5.2 工作原理

pg_upgrade 是 PostgreSQL 社区软件中内置的一个实用工具,可以避免进行全局转储或数据库转储,直接使用单个命令运行升级。在升级之前,需要进行一致性检查,确保集群兼容。升级过程中会执行一系列操作,如分析新集群中的所有行、冻结行、复制旧的日志文件等。升级完成后,需要运行 ANALYZE 来更新数据库统计信息。

6. 总结

三种升级方法各有优缺点。使用 pg_dumpall 操作简单,但转储文件为纯文本格式,过程可能耗时较长且无法并行处理。使用 pg_dump pg_restore 可以利用并行转储和恢复的优势,提高效率。而使用 pg_upgrade 可以简化升级过程,但需要停机时间。在选择升级方法时,需要根据实际情况进行权衡。

以下是使用 mermaid 绘制的升级流程示意图:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A([开始]):::startend --> B(准备工作):::process
    B --> C{选择升级方法}:::decision
    C -->|pg_dumpall| D(使用pg_dumpall升级):::process
    C -->|pg_dump和pg_restore| E(使用pg_dump和pg_restore升级):::process
    C -->|pg_upgrade| F(使用pg_upgrade升级):::process
    D --> G(完成升级):::process
    E --> G
    F --> G
    G --> H([结束]):::startend

通过本文的介绍,你可以根据自己的需求和环境选择合适的升级方法,确保 PostgreSQL 数据库的顺利升级。

7. 三种升级方法对比

为了更直观地了解三种升级方法的特点,我们将它们的关键信息整理成了以下表格:
| 升级方法 | 优点 | 缺点 | 适用场景 |
| — | — | — | — |
| 使用 pg_dumpall | 操作简单,能对整个集群进行逻辑备份和恢复,包含全局对象和数据库 | 生成的转储文件为纯文本格式,升级过程可能耗时较长,且无法并行处理 | 数据库规模较小,对升级时间要求不高的场景 |
| 使用 pg_dump pg_restore | 可以利用并行转储和恢复的优势,提高升级效率,仅使用 pg_dumpall 转储全局对象,数据库迁移更灵活 | 步骤相对复杂,需要分别处理全局对象和数据库 | 数据库规模较大,希望缩短升级时间的场景 |
| 使用 pg_upgrade | 可以避免进行全局转储或数据库转储,直接使用单个命令运行升级,简化升级过程 | 需要停机时间,升级前需要进行一致性检查 | 对停机时间有一定容忍度,希望简化升级操作的场景 |

8. 升级过程中的注意事项

在进行 PostgreSQL 13 升级时,除了按照上述步骤操作外,还需要注意以下几点:
- 空间规划 :确保服务器有足够的空间,尤其是在同一服务器上进行升级时,要保证至少有三倍于现有数据库集群的空间(不包括 WAL 段和日志文件所需的空间)。同时,考虑到 WAL 段的归档和复制,要为生成的 WAL 段预留足够的空间。
- 测试环境 :在生产服务器上进行升级之前,务必在测试环境中进行充分的测试,以确保磁盘使用和应用程序功能在升级后正常。可以模拟生产环境的负载和数据,对升级过程进行全面测试。
- 扩展兼容性 :不同版本的 PostgreSQL 对扩展的支持可能有所不同,在升级前要仔细检查旧版本中使用的扩展,并确保在新版本中能够正常使用。对于不属于 contrib 的扩展,要提前安装相应的新版本扩展。
- 配置参数 :每个新的 PostgreSQL 版本可能会添加或删除一些配置参数,在升级过程中要注意修改配置参数,以适应新版本的要求。可以通过对比旧版本和新版本的配置文件,找出需要修改的参数。
- 备份恢复 :在进行升级操作之前,一定要对现有数据库进行备份,以防升级过程中出现意外情况。同时,要确保备份文件的完整性和可恢复性。

9. 实际案例分析

为了更好地说明三种升级方法的实际应用,下面我们通过一个实际案例来进行分析。

假设我们有一个 PostgreSQL 9.6 数据库集群,包含多个数据库,总数据量约为 200GB。应用程序对数据库的可用性要求较高,希望尽量缩短升级时间。

  • 选择升级方法 :考虑到数据量较大和对升级时间的要求,我们选择使用 pg_dump pg_restore 进行升级,以利用并行转储和恢复的优势,提高升级效率。
  • 升级过程
    1. 按照前面介绍的步骤,完成准备工作,包括获取现有 PostgreSQL 包、安装 PostgreSQL 13 版本、初始化数据目录等。
    2. 使用 pg_dumpall 转储旧集群的全局对象,并恢复到新集群。
    3. 对每个数据库进行仅模式转储和恢复,然后使用并行转储和恢复的方式进行仅数据转储和恢复。
    4. 关闭旧集群,重启新集群,并运行全集群范围的 ANALYZE
    5. 删除旧版本的数据目录、PostgreSQL 包和扩展。
  • 升级结果 :通过使用 pg_dump pg_restore 进行升级,整个升级过程在较短的时间内完成,且应用程序在升级后能够正常运行,满足了对数据库可用性的要求。
10. 未来发展趋势

随着 PostgreSQL 的不断发展,未来的升级方法可能会更加智能化和自动化。例如,可能会出现一些工具能够自动检测数据库的版本和配置,根据实际情况选择最合适的升级方法,并自动完成升级过程。同时,升级过程中的停机时间可能会进一步缩短,以满足用户对数据库高可用性的需求。

此外,随着云计算和容器技术的普及,PostgreSQL 的升级可能会与云平台和容器编排工具更加紧密地结合,实现更加便捷的升级操作。例如,在云环境中可以通过自动化脚本或云服务提供商的管理界面来完成升级,提高升级的效率和可靠性。

11. 总结与建议

通过本文的介绍,我们详细了解了三种将 PostgreSQL 升级到 13 版本的方法:使用 pg_dumpall 、使用 pg_dump pg_restore 以及使用 pg_upgrade 。每种方法都有其优缺点和适用场景,在选择升级方法时,需要根据实际情况进行权衡。

为了确保升级过程的顺利进行,我们建议在升级前做好充分的准备工作,包括空间规划、测试环境搭建、扩展兼容性检查等。同时,要严格按照操作步骤进行升级,并在升级过程中密切关注系统的运行状态,及时处理出现的问题。

最后,希望本文能够为你在 PostgreSQL 升级过程中提供有价值的参考,帮助你选择合适的升级方法,实现数据库的顺利升级。

以下是使用 mermaid 绘制的升级注意事项流程示意图:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A([开始升级]):::startend --> B(空间规划):::process
    B --> C(测试环境搭建):::process
    C --> D(扩展兼容性检查):::process
    D --> E(配置参数修改):::process
    E --> F(备份现有数据库):::process
    F --> G(选择升级方法并执行升级):::process
    G --> H(密切关注系统状态):::process
    H --> I{是否出现问题}:::decision
    I -->|是| J(及时处理问题):::process
    J --> G
    I -->|否| K([升级完成]):::startend
基于TROPOMI高光谱遥感仪器获取的大气成分观测资料,本研究聚焦于大气污染物一氧化氮(NO₂)的空间分布与浓度定量反演问题。NO₂作为影响空气质量的关键指标,其精确监测对环境保护与大气科学研究具有显著价值。当前,利用卫星遥感数据结合先进算法实现NO₂浓度的高精度反演已成为该领域的重要研究方向。 本研究构建了一套以深度学习为核心的技术框架,整合了来自TROPOMI仪器的光谱辐射信息、观测几何参数以及辅助气象数据,形成多维度特征数据集。该数据集充分融合了不同来源的观测信息,为深入解析大气中NO₂的时空变化规律提供了数据基础,有助于提升反演模型的准确性与环境预测的可靠性。 在模型架构方面,项目设计了一种多分支神经网络,用于分别处理光谱特征与气象特征等多模态数据。各分支通过独立学习提取代表性特征,并在深层网络中进行特征融合,从而综合利用不同数据的互补信息,显著提高了NO₂浓度反演的整体精度。这种多源信息融合策略有效增强了模型对复杂大气环境的表征能力。 研究过程涵盖了系统的数据处理流程。前期预处理包括辐射定标、噪声抑制及数据标准化等步骤,以保障输入特征的质量与一致性;后期处理则涉及模型输出的物理量转换与结果验证,确保反演结果符合实际大气浓度范围,提升数据的实用价值。 此外,本研究进一步对不同功能区域(如城市建成区、工业带、郊区及自然背景区)的NO₂浓度分布进行了对比分析,揭示了人类活动与污染物空间格局的关联性。相关结论可为区域环境规划、污染管控政策的制定提供科学依据,助力大气环境治理与公共健康保护。 综上所述,本研究通过融合TROPOMI高光谱数据与多模态特征深度学习技术,发展了一套高效、准确的大气NO₂浓度遥感反演方法,不仅提升了卫星大气监测的技术水平,也为环境管理与决策支持提供了重要的技术工具。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值