在最近关于PostgreSQL 13新功能的文章中,我们回顾了该版本的一些新功能,但现在,让我们看看如何升级以利用所有这些提到的功能。
升级到 PostgreSQL 13
如果您想将当前的 PostgreSQL 版本升级到这个新版本,您可以使用三个主要的本机选项来执行此任务。
- Pg_dump/pg_dumpall:它是一个逻辑备份工具,允许您转储数据并在新的 PostgreSQL 版本中恢复它。在这里,您将有一个停机时间,该时间将根据您的数据大小而有所不同。您需要停止系统或避免主节点中的新数据,运行 pg_dump,将生成的转储移动到新的数据库节点,并恢复它。在此期间,您无法写入您的主 PostgreSQL 数据库,以避免数据不一致。
- Pg_upgrade:它是一个 PostgreSQL 工具,用于就地升级 PostgreSQL 版本。这在生产环境中可能很危险,在这种情况下我们不建议使用此方法。使用这种方法你也会有停机时间,但可能比使用以前的 pg_dump 方法要少得多。
- 逻辑复制:从 PostgreSQL 10 开始,您可以使用这种复制方法,它允许您以零(或几乎零)停机时间执行主要版本升级。这样就可以在上一个PostgreSQL版本中增加一个standby节点,当replication是最新的时候,你可以执行一个failover过程来提升新的PostgreSQL节点。
那么,让我们一一看看这些方法。
使用 pg_dump/pg_dumpall
如果停机对您来说不是问题,这种方法是一种简单的升级方法。
要创建转储,您可以运行:
$ pg_dumpall > dump_pg12.out
复制
或者创建单个数据库的转储:
$ pg_dump world > dump_world_pg12.out
复制
然后,您可以将此转储复制到具有新 PostgreSQL 版本的服务器,并恢复它:
$ psql -f dump_pg12.out postgres
复制
请记住,在此过程中您需要停止应用程序或避免写入数据库,否则会出现数据不一致或潜在的数据丢失。
使用 pg_upgrade
首先,您需要在服务器上安装新旧 PostgreSQL 版本。
$ rpm -qa |grep postgres postgresql13-contrib-13.3-2PGDG.rhel8.x86_64 postgresql13-server-13.3-2PGDG.rhel8.x86_64 postgresql13-libs-13.3-2PGDG.rhel8.x86_64 postgresql13-13.3-2PGDG.rhel8.x86_64 postgresql12-libs-12.7-2PGDG.rhel8.x86_64 postgresql12-server-12.7-2PGDG.rhel8.x86_64 postgresql12-12.7-2PGDG.rhel8.x86_64 postgresql12-contrib-12.7-2PGDG.rhel8.x86_64
复制
然后,首先,您可以通过添加 -c 标志运行pg_upgrade 来测试升级:
$ /usr/pgsql-13/bin/pg_upgrade -b /usr/pgsql-12/bin -B /usr/pgsql-13/bin -d /var/lib/pgsql/12/data -D /var/lib/pgsql/13/data -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 system-defined composite types in user tables ok
Checking for reg* data types in user tables ok
Checking for contrib/isn with bigint-passing mismatch ok
Checking for presence of required libraries ok
Checking database user is the install user ok
Checking for prepared transactions ok
Checking for new cluster tablespace directories ok
*Clusters are compatible*
复制
旗帜的意思是:
- -b : 旧的 PostgreSQL 可执行目录
- -B : 新的 PostgreSQL 可执行目录
- -d : 旧的数据库集群配置目录
- -D : 新的数据库集群配置目录
- -c:仅检查集群。它不会改变任何数据
如果一切正常,您可以在没有-c 标志的情况下运行相同的命令,它将升级您的 PostgreSQL 服务器。为此,您需要先停止当前版本并运行上述命令。
$ systemctl stop postgresql-12
$ /usr/pgsql-13/bin/pg_upgrade -b /usr/pgsql-12/bin -B /usr/pgsql-13/bin -d /var/lib/pgsql/12/data -D /var/lib/pgsql/13/data
...
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
复制
完成后,如消息所示,您可以使用这些脚本来分析新的 PostgreSQL 服务器并在安全时删除旧的服务器。
使用逻辑复制
逻辑复制是一种根据数据对象的复制标识复制数据对象及其更改的方法。它基于发布和订阅模式,其中一个或多个订阅者订阅发布者节点上的一个或多个发布。
因此,基于此,让我们配置发布者,在本例中为 PostgreSQL 12 服务器,如下所示。
编辑 postgresql.conf 配置文件:
listen_addresses = '*' wal_level = logical max_wal_senders = 8 max_replication_slots = 4
复制
编辑 pg_hba.conf 配置文件:
# TYPE DATABASE USER ADDRESS METHOD host all rep1 10.10.10.141/32 md5
复制
在那里使用订阅者 IP 地址。
现在,您必须配置订阅者,在本例中为 PostgreSQL 13 服务器,如下所示。
编辑 postgresql.conf 配置文件:
listen_addresses = '*' max_replication_slots = 4 max_logical_replication_workers = 4 max_worker_processes = 8
复制
由于本次PostgreSQL 13即将成为新的主节点,因此您应该考虑在此步骤中添加wal_level和archive_mode参数,以避免稍后重新启动服务。
wal_level = logical archive_mode = on
复制
如果要添加新副本或使用 PITR 备份,这些参数将非常有用。
其中一些更改需要重新启动服务器,因此重新启动发布者和订阅者。
现在,在发布者中,您必须创建订阅者使用的用户来访问它。用于复制连接的角色必须具有REPLICATION 属性,并且为了能够复制初始数据,它还需要对已发布表的 SELECT 权限:
world=# CREATE ROLE rep1 WITH LOGIN PASSWORD '********' REPLICATION;
CREATE ROLE
world=# GRANT SELECT ON ALL TABLES IN SCHEMA public to rep1;
GRANT
复制
让我们在发布者节点中为所有表创建pub1 发布:
world=# CREATE PUBLICATION pub1 FOR ALL TABLES;
CREATE PUBLICATION
复制
由于未复制模式,您必须在 PostgreSQL 12 中进行备份并在 PostgreSQL 13 中恢复它。备份将仅用于模式,因为信息将在初始传输中复制。
在 PostgreSQL 12 中,运行:
$ pg_dumpall -s > schema.sql
复制
在 PostgreSQL 13 中,运行:
$ psql -d postgres -f schema.sql
复制
在 PostgreSQL 13 中拥有架构后,您需要创建订阅,将主机、数据库名称、用户和密码的值替换为与您的环境对应的值。
world=# CREATE SUBSCRIPTION sub1 CONNECTION 'host=10.10.10.140 dbname=world user=rep1 password=********' PUBLICATION pub1;
NOTICE: created replication slot "sub1" on publisher
CREATE SUBSCRIPTION
复制
以上将启动复制过程,同步发布中表的初始表内容,然后开始将增量更改复制到这些表。
要验证创建的订阅,您可以使用 pg_stat_subscription 目录。此视图将为主工作程序的每个订阅包含一行(如果工作程序未运行,则 PID 为空),以及用于处理订阅表的初始数据副本的工作程序的其他行。
world=# SELECT * FROM pg_stat_subscription;
-[ RECORD 1 ]---------+------------------------------
subid | 16421
subname | sub1
pid | 464
relid |
received_lsn | 0/23A8490
last_msg_send_time | 2021-07-23 22:42:26.358605+00
last_msg_receipt_time | 2021-07-23 22:42:26.358842+00
latest_end_lsn | 0/23A8490
latest_end_time | 2021-07-23 22:42:26.358605+00
复制
要验证初始传输何时完成,您可以检查pg_subscription_rel 目录上的 srsubstate 变量。此目录包含每个订阅中每个复制关系的状态。
world=# SELECT * FROM pg_subscription_rel;
srsubid | srrelid | srsubstate | srsublsn
---------+---------+------------+-----------
16421 | 16408 | r | 0/23B1738
16421 | 16411 | r | 0/23B17A8
16421 | 16405 | r | 0/23B17E0
16421 | 16402 | r | 0/23B17E0
(4 rows)
复制
列说明:
- srsubid:对订阅的引用。
- srrelid:对关系的引用。
- srsubstate:状态代码:i = 初始化,d = 数据正在复制,s = 同步,r = 就绪(正常复制)。
- srsublsn:结束 s 和 r 状态的 LSN。
初始传输完成后,您已准备好将应用程序指向新的 PostgreSQL 13 服务器
结论
如您所见,PostgreSQL有不同的升级选项,具体取决于您的要求和停机时间容忍度。
无论您使用哪种技术,通过执行定期升级来保持数据库服务器最新是一项必要但艰巨的任务,因为您需要确保升级后不会出现数据丢失或数据不一致的情况。详细且经过测试的计划是这里的关键,当然,它必须包括回滚选项,以防万一。
评论
