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 操作步骤
- 获取现有 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
- 安装目标 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
- 初始化 PostgreSQL 13 的数据目录 :
$ /usr/pgsql-13/bin/initdb -D /var/lib/pgsql/13/data
- 如果升级时源服务器和目标服务器相同,为新集群使用不同的端口号 :
$ 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
- 连接到旧集群中的每个数据库,查看已安装的扩展列表 :
$ /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)
-
安装 PostgreSQL 13 中不属于
contrib的扩展 :
$ sudo yum install pg_repack13 -y
- 修复新版本所需的配置参数更改 :
$ 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'
-
使用最新版本的
pg_dumpall二进制文件转储旧版本的集群 :
$ /usr/pgsql-13/bin/pg_dumpall > /backupdir/dumpall.sql
-
使用
psql将文本格式的转储文件恢复到新集群 :
$ /usr/pgsql-13/bin/psql -p 5433 -f /backupdir/dumpall.sql
- 关闭旧集群,并以所需端口重启新集群 :
$ /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
-
在新集群上运行全集群范围的
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"
- 删除旧版本的数据目录、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
-
使用
psql将文本格式的转储文件恢复到新集群 :
$ /usr/pgsql-13/bin/psql -p 5433 -f /backupdir/globals.sql
- 对要迁移的数据库进行仅模式转储,并将其恢复到新集群 :
$ /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
-
进行仅数据转储,可以使用单进程或多并行进程来加速恢复
:
- 单进程转储和恢复:
$ /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
-
启动新集群,并在新集群上运行全集群范围的
ANALYZE:
$ /usr/pgsql-13/bin/pg_ctl -D /var/lib/pgsql/13/data start
$ /usr/pgsql-13/bin/vacuumdb -a -z -j 4
- 删除旧版本的数据目录、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进行升级,以利用并行转储和恢复的优势,提高升级效率。 -
升级过程
:
- 按照前面介绍的步骤,完成准备工作,包括获取现有 PostgreSQL 包、安装 PostgreSQL 13 版本、初始化数据目录等。
-
使用
pg_dumpall转储旧集群的全局对象,并恢复到新集群。 - 对每个数据库进行仅模式转储和恢复,然后使用并行转储和恢复的方式进行仅数据转储和恢复。
-
关闭旧集群,重启新集群,并运行全集群范围的
ANALYZE。 - 删除旧版本的数据目录、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
超级会员免费看
1189

被折叠的 条评论
为什么被折叠?



