24、PostgreSQL 13 升级指南:多种方式实现平滑过渡

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
  1. 安装目标版本包 :根据上一步获取的包列表,安装目标版本(这里是 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
  1. 初始化数据目录 :使用 PostgreSQL 13 初始化数据目录,可根据需要修改数据目录位置。
$ /usr/pgsql-13/bin/initdb -D /var/lib/pgsql/13/data
  1. 修改端口并启动服务 :如果升级在同一服务器上进行,且旧版本使用端口 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
  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. 安装非 contrib 扩展 :对于旧版本中使用的非 contrib 模块的扩展(如 pg_repack),需要为 PostgreSQL 13 安装相应的二进制文件。
$ 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_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
  1. 解决错误并重新检查 :根据错误信息解决问题,然后重新运行一致性检查。
$ 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"
  1. 清理操作 :最后,移除旧版本的数据目录、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
  1. 启动新集群并更新统计信息 :同常规升级步骤 11。
  2. 清理操作 :同常规升级步骤 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 操作步骤
  1. 设置包管理器或仓库 :根据数据库服务器的操作系统设置相应的包管理器或仓库。
$ sudo yum install https://yum.postgresql.org/13/redhat/rhel-7.8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
  1. 安装 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 版本。在升级过程中,要严格按照步骤操作,注意各项细节,确保升级的安全性和稳定性。升级完成后,要进行充分的验证和优化,以提高数据库的性能和可靠性。

### CentOS 7 上 PostgreSQL 14.2 到 15.11 的无缝升级 #### 准备工作 为了确保从 PostgreSQL 14.2 升级至 15.11 过程中的数据安全性和服务连续性,建议先备份现有数据库。可以使用 `pg_dumpall` 或者通过复制整个集群目录来完成此操作。 ```bash sudo -u postgres pg_dumpall > /tmp/all_databases.sql ``` #### 添加新版本仓库并安装更新包 由于目标是从旧版迁移到新版,在执行具体命令之前需确认已添加最新的官方 YUM 源: ```bash sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm ``` 接着安装新的服务器组件以及客户端工具集[^1]。 #### 执行在线迁移前配置调整 对于希望实现零停机时间的场景来说,推荐采用逻辑复制的方式来进行跨主要版本间的转换。这涉及到创建发布者(Publisher)实例(即当前运行着 v14.2 的机器),订阅者(Subscriber)则会部署最新发布的稳定分支(v15.11)[^2]。 在 Publisher 实例上启用流复制功能: 编辑 `/var/lib/pgsql/14/data/postgresql.conf` 文件设置如下参数: ```ini wal_level = replica max_wal_senders = 3 hot_standby = on ``` 重启 PostgreSQL 使更改生效: ```bash systemctl restart postgresql-14.service ``` #### 创建 Publication 和 Subscription 关系 现在可以在 Publisher 节点定义 publication 并于 Subscriber 端建立 subscription 来同步表结构与增量变更记录。 Publisher 端创建 publication: ```sql CREATE PUBLICATION mypub FOR ALL TABLES; ``` 随后切换到 Subscriber (v15.11), 初始化一个新的集群环境, 安装必要的软件包之后初始化该节点作为备用模式启动. ```bash yum install -y postgresql15-server postgresql15-contrib.x86_64 /usr/pgsql-15/bin/initdb -D /var/lib/pgsql/15/data/ vi /var/lib/pgsql/15/data/postgresql.auto.conf # Add these lines at the end of file. primary_conninfo='host=old_server_ip port=5432 user=repl password=your_password' promote_trigger_file='/tmp/promote.trigger' standby_mode=on recovery_target_timeline='latest' systemctl start postgresql-15.service ``` 最后一步是在 Subscriber 中注册对 Publisher 数据库对象变化的兴趣点——subscription。 ```sql CREATE SUBSCRIPTION mysub CONNECTION 'dbname=mydb host=old_server_ip' PUBLICATION mypub WITH (copy_data=false); ``` 此时两个节点之间应该已经开始进行实时的数据交换了;随着越来越多的事物被处理完毕,最终达到一致状态时就可以考虑将流量逐步转移到较新的系统上去[^3]. #### 测试和验证过程 在整个过程中务必密切监控两套系统的日志文件以捕捉任何潜在错误消息,并定期对比双方之间的差异情况直到完全相同为止。一旦确定一切正常,则可正式对外宣布完成了平滑过渡[^4]. #### 清理遗留资源 当所有应用都已经顺利连接到了新的 PostgreSQL 15.11 后端以后,可以选择停止旧的服务进程并将不再使用的磁盘空间释放出来供其他用途所用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值