PostgreSQL 13 升级与补丁操作指南
1. 准备 pglogical 扩展
在进行 PostgreSQL 不同版本间的逻辑复制前,需要在新旧集群上设置相关参数并创建 pglogical 扩展。
- 旧集群(PostgreSQL 9.6) :
$ /usr/pgsql-9.6/bin/psql -c "ALTER SYSTEM SET wal_level TO 'logical'"
$ /usr/pgsql-9.6/bin/psql -c "ALTER SYSTEM SET shared_preload_libraries TO pglogical"
$ /usr/pgsql-9.6/bin/psql -d percona -c "CREATE EXTENSION pglogical"
- 新集群(PostgreSQL 13) :
$ /usr/pgsql-13/bin/psql -c "ALTER SYSTEM SET wal_level TO 'logical'"
$ /usr/pgsql-13/bin/psql -c "ALTER SYSTEM SET shared_preload_libraries TO pglogical"
$ /usr/pgsql-13/bin/psql -c "CREATE DATABASE percona"
$ /usr/pgsql-13/bin/psql -d percona -c "CREATE EXTENSION pglogical"
2. 使用 pglogical 扩展升级到 PostgreSQL 13
由于流复制不支持不同主版本的 PostgreSQL 之间的复制,因此可以使用逻辑复制来实现不同版本间的迁移,减少停机时间。
2.1 准备工作
确保在新旧版本的 PostgreSQL 服务器上都安装了 pglogical 扩展。可以使用 pglogical 复制旧集群的现有数据,也可以并行使用 pg_dump 和 pg_restore 来更快地配置复制。
2.2 操作步骤
- 创建提供者节点 :在旧集群上使用
pglogical.create_node函数创建提供者节点。
$ /usr/pgsql-9.6/bin/psql -d percona -c "SELECT pglogical.create_node(node_name := 'providernode', dsn := 'host=localhost port=5432 dbname=percona user=postgres password=secret')"
- 复制数据库架构 :从旧集群复制数据库的架构(DDL)到新集群。
$ /usr/pgsql-13/bin/pg_dump -h <old_cluster_ip> -p 5432 -d percona -Fc -s -U postgres | /usr/pgsql-13/bin/pg_restore -d percona -h <new_cluster_ip> -p 5432 -U postgres
- 添加表到复制集 :在旧集群上添加需要复制的表到复制集。
$ /usr/pgsql-9.6/bin/psql -d percona -c "SELECT pglogical.replication_set_add_all_tables('default',ARRAY['public','scott','tiger'])"
- 验证提供者节点和复制集 :验证提供者节点的创建和添加到复制集的表列表。
$ /usr/pgsql-9.6/bin/psql -d percona -c "select * from pglogical.node"
$ /usr/pgsql-9.6/bin/psql -d percona -c "select * from pglogical.replication_set_table"
- 创建订阅者节点 :在新集群上使用
pglogical.create_node函数创建订阅者节点。
$ /usr/pgsql-13/bin/psql -d percona -c "SELECT pglogical.create_node(node_name := 'subscriber1',dsn := 'host=localhost port=5432 dbname=percona user=postgres password=secret')"
- 启用复制和数据复制 :在新集群上创建订阅以启用复制并复制现有数据。
$ /usr/pgsql-13/bin/psql -d percona -c "SELECT pglogical.create_subscription(subscription_name := 'subscription1',provider_dsn := 'host=old_cluster_IP port=5432 dbname=percona user=postgres password=secret',synchronize_structure:= true)"
3. 使用逻辑复制和逻辑解码升级到 PostgreSQL 13
从 PostgreSQL 10 开始,PostgreSQL 内置了逻辑复制功能,可以使用此功能在 PostgreSQL 10 及更高版本之间进行复制,无需依赖 pglogical 扩展。
3.1 准备工作
旧集群应使用 PostgreSQL 10 或 11。对于没有主键的表,需要设置副本标识。
ALTER TABLE sales REPLICA IDENTITY USING INDEX unique_index_name;
ALTER TABLE sales REPLICA IDENTITY FULL;
3.2 操作步骤
- 设置 wal_level :在新旧集群上都将
wal_level设置为logical,并重启数据库集群。- 旧集群(PostgreSQL 10 或更高版本) :
$ psql -c "ALTER SYSTEM SET wal_level TO 'logical'"
$ pg_ctl -D /var/lib/pgsql/10/data restart -mf
- **新集群(PostgreSQL 13)**:
$ psql -c "ALTER SYSTEM SET wal_level TO 'logical'"
$ pg_ctl -D /var/lib/pgsql/13/data restart -mf
- 创建发布 :在旧集群上创建要复制的表的发布。
$ /usr/pgsql-10/bin/psql -d percona -c "CREATE PUBLICATION percpub FOR ALL TABLES"
- 复制数据库架构 :从旧集群复制数据库的架构(DDL)到新集群,与前面步骤相同。
- 创建订阅 :在新集群上创建订阅以启用逻辑复制。
$ /usr/pgsql-13/bin/psql -d percona -c "CREATE SUBSCRIPTION percsub CONNECTION 'host=publisher_server_ip dbname=percona user=postgres password=secret port=5432' PUBLICATION percpub"
- 监控复制延迟 :在发布节点上监控复制延迟。
$ /usr/pgsql-13/bin/psql
\x
select * from pg_stat_replication;
4. 更新 PostgreSQL 13 的小版本
PostgreSQL 社区每 3 个月发布一次小版本更新,以下是更新 PostgreSQL 13 小版本的步骤。
4.1 准备工作
需要有一个正在运行的 PostgreSQL 13 集群的数据库服务器,并配置好 yum 或 apt 仓库。
4.2 操作步骤
- 关闭 PostgreSQL 集群 :
$ /usr/pgsql-13/bin/pg_ctl -D /var/lib/pgsql/13/data stop -mf
- 查看已安装的 Postgres 包 :
$ rpm -qa | grep postgres
- 安装最新小版本 :
- CentOS/Red Hat :
$ sudo yum install postgresql13-server postgresql13-contrib
- **Ubuntu/Debian**:
$ sudo apt-get update postgresql13-server postgresql13-contrib
- 启动 PostgreSQL 集群 :
$ /usr/pgsql-13/bin/pg_ctl -D /var/lib/pgsql/13/data stop -mf
- 验证小版本更新 :
$ /usr/pgsql-13/bin/psql -c "select version()"
操作流程总结
以下是使用 pglogical 扩展升级到 PostgreSQL 13 的操作流程 mermaid 图:
graph LR
A[准备 pglogical 扩展] --> B[创建提供者节点]
B --> C[复制数据库架构]
C --> D[添加表到复制集]
D --> E[验证提供者节点和复制集]
E --> F[创建订阅者节点]
F --> G[启用复制和数据复制]
通过以上步骤,可以实现 PostgreSQL 不同版本的升级和小版本的更新,同时减少停机时间,确保数据的顺利迁移和复制。在实际操作中,需要根据具体情况调整参数和命令,以满足需求。
PostgreSQL 13 升级与补丁操作指南
5. 不同升级方法对比
为了更清晰地了解各种升级方法的特点,我们将使用 pglogical 扩展升级、使用逻辑复制和逻辑解码升级以及小版本更新这三种方法进行对比,具体信息如下表所示:
| 升级方法 | 适用版本 | 依赖扩展 | 操作复杂度 | 停机时间 | 数据迁移方式 |
| — | — | — | — | — | — |
| 使用 pglogical 扩展升级 | 可用于不同主版本(如 9.6 到 13) | pglogical | 较高,涉及多个节点和复制集操作 | 可控制,并行操作可减少停机时间 | 可使用 pglogical 或并行 pg_dump 和 pg_restore |
| 使用逻辑复制和逻辑解码升级 | PostgreSQL 10 及以上版本 | 无(内置逻辑复制) | 适中,需要设置发布和订阅 | 可控制,并行操作可减少停机时间 | 可选择复制现有数据或仅复制变更 |
| 小版本更新 | 同一主版本内(如 13.1 到 13.2) | 无 | 低,主要是包的安装和集群重启 | 短,仅需关闭和启动集群 | 无数据迁移,仅更新软件版本 |
6. 常见问题及解决方法
在进行 PostgreSQL 13 升级和补丁操作过程中,可能会遇到一些常见问题,以下是部分问题及解决方法:
- 表无主键无法添加到复制集 :
- 问题描述 :在使用 pglogical 扩展升级时,执行 pglogical.replication_set_add_all_tables 命令,部分表因无主键无法添加到复制集。
- 解决方法 :为这些表添加主键,或者在使用逻辑复制和逻辑解码升级时,对于无主键的表设置副本标识,例如:
ALTER TABLE sales REPLICA IDENTITY USING INDEX unique_index_name;
ALTER TABLE sales REPLICA IDENTITY FULL;
- 复制延迟过高 :
- 问题描述 :在监控复制延迟时,发现
pg_stat_replication显示的延迟时间过长。 - 解决方法 :检查网络连接是否稳定,确认旧集群和新集群的性能是否满足要求,也可以考虑优化数据库配置参数,如调整
wal_sender_timeout等。
- 问题描述 :在监控复制延迟时,发现
- 小版本更新后应用连接失败 :
- 问题描述 :完成 PostgreSQL 13 小版本更新后,应用程序无法连接到数据库。
- 解决方法 :检查数据库集群是否正常启动,确认应用程序的连接配置(如主机、端口、用户名、密码等)是否正确,还可以查看数据库日志文件,排查是否有错误信息。
7. 升级后的验证与监控
升级完成后,需要对数据库进行验证和监控,确保升级成功且数据库正常运行。以下是一些验证和监控的步骤:
1. 验证数据完整性 :
- 可以通过查询数据库中的关键表,检查数据是否完整且准确。
- 对比新旧集群中相同表的数据行数和内容,确保数据一致。
2. 监控性能指标 :
- 使用 pg_stat_activity 视图监控数据库的活动会话,查看是否有长时间运行的查询或阻塞情况。
- 监控数据库的 CPU、内存和磁盘 I/O 使用情况,确保性能稳定。
3. 检查复制状态 :
- 对于使用逻辑复制的情况,定期查看 pg_stat_replication 视图,确保复制正常进行,延迟在可接受范围内。
整体操作流程图
以下是包含所有升级和更新操作的 mermaid 流程图:
graph LR
A[开始] --> B{选择升级类型}
B -->|使用 `pglogical` 扩展升级| C[准备 pglogical 扩展]
B -->|使用逻辑复制和逻辑解码升级| D[设置 wal_level 和副本标识]
B -->|小版本更新| E[关闭 PostgreSQL 集群]
C --> F[创建提供者节点]
F --> G[复制数据库架构]
G --> H[添加表到复制集]
H --> I[验证提供者节点和复制集]
I --> J[创建订阅者节点]
J --> K[启用复制和数据复制]
D --> L[创建发布]
L --> G
E --> M[查看已安装的 Postgres 包]
M --> N[安装最新小版本]
N --> O[启动 PostgreSQL 集群]
O --> P[验证小版本更新]
K --> Q[验证与监控]
G --> Q
P --> Q
Q --> R[结束]
通过以上详细的操作指南、对比分析、问题解决方法以及升级后的验证和监控步骤,希望能帮助你顺利完成 PostgreSQL 13 的升级和补丁操作。在实际操作中,务必做好数据备份,遵循操作步骤,确保数据库的安全和稳定。
超级会员免费看
551

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



