PostgreSQL 13 升级指南:多种方式实现平滑过渡
一、常规升级到 PostgreSQL 13
在对 PostgreSQL 进行升级时,为了顺利过渡到目标版本,需要遵循一系列步骤。
1.
查看现有 PostgreSQL 包
:在安装目标版本的包之前,先查看现有系统中安装的 PostgreSQL 包。可以使用以下命令查看 PostgreSQL 9.6 安装的包列表:
$ 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 13.1)的 rpm 仓库和包。
$ 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
- 修改端口并启动服务 :如果升级在同一服务器上进行,且旧版本使用端口 5432,可将新版本端口修改为 5433 或其他不同端口,然后启动 PostgreSQL 服务。
$ 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)
- 安装非 contrib 扩展 :对于旧版本中使用的非 contrib 模块的扩展(如 pg_repack),需要为 PostgreSQL 13 安装相应的二进制文件。
$ 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_upgrade 检查新旧集群的一致性。
$ /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
参数说明:
| 参数 | 说明 |
| ---- | ---- |
| -b | 旧集群二进制文件的位置 |
| -B | 新集群二进制文件的位置 |
| -d | 旧集群数据目录的位置 |
| -D | 新集群数据目录的位置 |
| -c | 执行一致性检查 |
如果检查失败,会输出具体错误信息。例如:
Performing Consistency Checks on Old Live Server
------------------------------------------------
Checking cluster versions ok
Checking database user is the install user ok
Checking database connection settings ok
Checking for prepared transactions ok
Checking for reg* data types in user tables ok
Checking for contrib/isn with bigint-passing mismatch ok
Checking for tables WITH OIDS ok
Checking for invalid "sql_identifier" user columns ok
Checking for invalid "unknown" user columns ok
Checking for hash indexes ok
Checking for presence of required libraries fatal
Your installation references loadable libraries that are missing from the
new installation. You can add these libraries to the new installation,
or remove the functions using them from the old installation. A list of
problem libraries is in the file:
loadable_libraries.txt
Failure, exiting
$ cat loadable_libraries.txt
could not load library "$libdir/pg_repack": ERROR: could not access file "$libdir/pg_repack": No such file or directory
Database: percona
- 解决错误并重新检查 :根据错误信息解决问题,然后重新运行一致性检查。
$ 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.
执行升级
:确保新旧集群都已关闭,移除一致性检查命令中的 -c 参数,执行升级操作。
$ /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
此过程可能需要较长时间,但步骤并不复杂。
11.
启动新集群并更新统计信息
:升级完成后,启动新的 PostgreSQL 13 集群,并运行全集群的 ANALYZE 操作以更新数据库统计信息。
$ /usr/pgsql-13/bin/pg_ctl -D /var/lib/pgsql/13/data start
$ /usr/pgsql-13/bin/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
二、使用硬链接升级到 PostgreSQL 13
当数据库集群规模较大(数 GB 或数 TB)时,常规升级方式可能耗时较长。此时,可以使用 pg_upgrade 的硬链接选项,在几秒钟内完成升级。
2.1 适用条件
这种方法不仅适用于从当前支持的旧版本升级到 PostgreSQL 13,也适用于从一些过时版本升级。但硬链接选项仅在同一服务器上升级且新旧集群数据目录在同一文件系统时有效。
2.2 操作步骤
操作步骤与常规升级基本相同,只是在执行升级命令时添加 -k 参数。
1.
获取现有 Postgres 包
:同常规升级步骤 1。
2.
安装目标版本包
:同常规升级步骤 2。
3.
初始化数据目录
:同常规升级步骤 3。
4.
修改端口并启动服务
:同常规升级步骤 4。
5.
检查旧版本扩展
:同常规升级步骤 5。
6.
安装非 contrib 扩展
:同常规升级步骤 6。
7.
修复配置参数
:同常规升级步骤 7。
8.
一致性检查
:同常规升级步骤 8。
9.
解决错误并重新检查
:同常规升级步骤 9。
10.
执行升级
:确保新旧集群都已关闭,在升级命令中添加 -k 参数。
$ /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 -k
升级完成后,输出示例如下:
Performing Consistency Checks
-----------------------------
Checking cluster versions ok
Checking database user is the install user ok
Checking database connection settings ok
Checking for prepared transactions ok
Checking for reg* data types in user tables ok
Checking for contrib/isn with bigint-passing mismatch ok
Checking for tables WITH OIDS ok
Checking for invalid "sql_identifier" user columns ok
Checking for invalid "unknown" user columns ok
Creating dump of global objects ok
Creating dump of database schemas ok
Checking for presence of required libraries ok
Checking database user is the install user ok
Checking for prepared transactions ok
If pg_upgrade fails after this point, you must re-initdb the
new cluster before continuing.
Performing Upgrade
------------------
Analyzing all rows in the new cluster ok
Freezing all rows in the new cluster ok
Deleting files from new pg_xact ok
Copying old pg_clog to new server ok
Setting next transaction ID and epoch for new cluster ok
Deleting files from new pg_multixact/offsets ok
Copying old pg_multixact/offsets to new server ok
Deleting files from new pg_multixact/members ok
Copying old pg_multixact/members to new server ok
Setting next multixact ID and offset for new cluster ok
Resetting WAL archives ok
Setting frozenxid and minmxid counters in new cluster ok
Restoring global objects in the new cluster ok
Restoring database schemas in the new cluster ok
Adding ".old" suffix to old global/pg_control ok
If you want to start the old cluster, you will need to remove
the ".old" suffix from /var/lib/pgsql/9.6/data/global/pg_control.old.
Because "link" mode was used, the old cluster cannot be safely
started once the new cluster has been started.
Linking user relation files ok
Setting next OID for new cluster ok
Sync data directory to disk ok
Creating script to analyze new cluster ok
Creating script to delete old cluster ok
Checking for hash indexes ok
Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade so,
once you start the new server, consider running:
./analyze_new_cluster.sh
Running this script will delete the old cluster's data files:
./delete_old_cluster.sh
- 启动新集群并更新统计信息 :同常规升级步骤 11。
- 清理操作 :同常规升级步骤 12。
三、安装 pglogical 扩展升级到 PostgreSQL 13
从 PostgreSQL 10 开始,PostgreSQL 支持内置的逻辑复制和逻辑解码。对于 PostgreSQL 10 之前的版本,可以使用 pglogical 扩展实现从 PostgreSQL 9.6 到 PostgreSQL 13 的复制,从而最小化停机时间。
3.1 适用条件
pglogical 扩展仅复制具有主键的表,适用于从 PostgreSQL 9.4.x 及更高版本的复制。如果 Postgres 版本为 9.3 或更旧,pglogical 无法满足需求。
3.2 操作步骤
- 设置包管理器或仓库 :根据数据库服务器的操作系统设置相应的包管理器或仓库。
$ sudo yum install https://yum.postgresql.org/13/redhat/rhel-7.8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
-
安装 pglogical 扩展
:在旧集群(PostgreSQL 9.6)和新集群(PostgreSQL 13)上分别安装 pglogical 扩展。
在 PostgreSQL 9.6 服务器上运行:
$ sudo yum install pglogical_96 -y
在 PostgreSQL 13 服务器上运行:
$ sudo yum install pglogical_13 -y
综上所述,根据不同的场景和需求,可以选择合适的升级方式将 PostgreSQL 数据库升级到 13 版本。无论是常规升级、使用硬链接升级还是借助 pglogical 扩展升级,都需要严格按照步骤操作,确保升级过程顺利进行。
PostgreSQL 13 升级指南:多种方式实现平滑过渡
四、升级方式对比分析
为了让大家更清晰地了解不同升级方式的特点,下面对常规升级、使用硬链接升级和安装 pglogical 扩展升级这三种方式进行对比分析。
| 升级方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 常规升级 | 数据库规模较小,对升级时间要求不高 | 操作步骤相对简单,不需要特殊的文件系统条件 | 升级时间较长,尤其是数据库规模较大时 |
| 使用硬链接升级 | 数据库规模较大,且新旧集群数据目录在同一文件系统 | 升级速度快,能在几秒钟内完成 | 受文件系统限制,只能在同一服务器且同一文件系统下使用 |
| 安装 pglogical 扩展升级 | PostgreSQL 10 之前版本升级,需要最小化停机时间 | 可实现逻辑复制,最小化停机时间 | 仅适用于具有主键的表,且 Postgres 版本需在 9.4.x 及以上 |
五、升级过程中的注意事项
在进行 PostgreSQL 升级时,有一些通用的注意事项需要大家牢记,以确保升级过程的顺利进行。
5.1 备份数据
在升级之前,务必对数据库进行全面备份。即使升级过程中出现问题,也可以通过备份数据恢复到升级前的状态,避免数据丢失。可以使用
pg_dump
命令进行备份,示例如下:
$ pg_dump -U username -d database_name -F c -f backup_file.dump
5.2 测试环境验证
在生产环境进行升级之前,建议先在测试环境中进行升级测试。这样可以提前发现潜在的问题,并进行解决,避免在生产环境中出现不可挽回的错误。测试环境的配置应尽量与生产环境保持一致。
5.3 监控升级过程
在升级过程中,要密切监控系统的资源使用情况,如 CPU、内存、磁盘 I/O 等。如果发现资源使用异常,可能需要及时调整升级策略或优化系统配置。
5.4 检查扩展兼容性
不同版本的 PostgreSQL 对扩展的支持可能会有所不同。在升级之前,要仔细检查所使用的扩展是否与目标版本兼容。对于不兼容的扩展,需要提前进行处理,如升级扩展版本或寻找替代扩展。
六、升级后的验证与优化
升级完成后,还需要进行一系列的验证和优化操作,以确保新集群的正常运行和性能优化。
6.1 验证数据库功能
启动新集群后,要对数据库的各项功能进行验证,包括数据查询、插入、更新、删除等操作。可以编写一些简单的测试脚本,对数据库的核心功能进行测试。
6.2 更新统计信息
升级后,数据库的统计信息可能会过时,需要重新运行全集群的 ANALYZE 操作,以更新统计信息。这有助于查询优化器做出更准确的查询计划。
$ /usr/pgsql-13/bin/vacuumdb -a -z -j 4
6.3 性能优化
根据系统的实际情况,对数据库的配置参数进行调整和优化。例如,可以调整
shared_buffers
、
work_mem
等参数,以提高数据库的性能。同时,还可以对数据库的索引进行优化,删除不必要的索引,创建必要的索引。
6.4 监控系统性能
升级后,要持续监控系统的性能指标,如查询响应时间、吞吐量等。通过监控数据,及时发现性能瓶颈,并进行相应的优化。
七、升级流程总结
为了更直观地展示升级过程,下面给出一个 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{选择升级方式}:::decision
B -->|常规升级| C(查看现有 PostgreSQL 包):::process
B -->|使用硬链接升级| D(获取现有 Postgres 包):::process
B -->|安装 pglogical 扩展升级| E(设置包管理器或仓库):::process
C --> F(安装目标版本包):::process
D --> F
F --> G(初始化数据目录):::process
G --> H(修改端口并启动服务):::process
H --> I(检查旧版本扩展):::process
I --> J(安装非 contrib 扩展):::process
J --> K(修复配置参数):::process
K --> L(一致性检查):::process
L --> M{检查是否通过}:::decision
M -->|否| N(解决错误并重新检查):::process
N --> L
M -->|是| O{升级方式}:::decision
O -->|常规升级| P(执行升级):::process
O -->|使用硬链接升级| Q(执行升级 - 添加 -k 参数):::process
O -->|安装 pglogical 扩展升级| R(安装 pglogical 扩展):::process
P --> S(启动新集群并更新统计信息):::process
Q --> S
R --> S
S --> T(清理操作):::process
T --> U([结束]):::startend
通过以上的升级指南和注意事项,希望大家能够根据自己的实际情况选择合适的升级方式,顺利将 PostgreSQL 数据库升级到 13 版本。在升级过程中,要严格按照步骤操作,注意各项细节,确保升级的安全性和稳定性。升级完成后,要进行充分的验证和优化,以提高数据库的性能和可靠性。
超级会员免费看
544

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



