PostgreSQL 12: 新增 pg_promote() 函数用于激活备库(流复制主备切换)

激活流复制备库是非常重要的运维操作,PostgreSQL 12 之前有两种方式可以激活流复制备库,如下:

  • pg_ctl 方式: 在备库主机执行 pg_ctl promote shell 脚本
  • 触发器文件方式: 备库配置 recovery.conf 文件的 trigger_file 参数,之后在备库主机上创建触发器文件

这两种方式都必须登录备库主机进行操作。PostgreSQL 12 新增 pg_promote() 函数允许在SQL接口层激活备库,这种激活方式显然更灵活,手册说明如下:

发行说明

Add function pg_promote() to promote standbys to primaries (Laurenz Albe, Micha?l Paquier)

Previously, this operation was only possible by using pg_ctl or creating a trigger file.

关于 pg_promote() 函数

pg_promote() 函数语法如下:

1
pg_promote(wait boolean DEFAULT true, wait_seconds integer DEFAULT 60)

pg_promote() 函数有两个参数:

  • wait: 表示是否等待备库的 promotion 完成或者 wait_seconds 秒之后返回成功,默认值为 true。
  • wait_seconds: 等待时间,单位秒,默认 60

只有超级用户才有执行 pg_promote() 函数的权限,也可以单独将此函数的执行权限赋给其它用户。

本文后续演示通过 pg_promote() 函数进行流复制主备切换,之前也分享过一篇基于 PostgreSQL 9.1 版本的流复制主备切换,可参考: PostgreSQL HOT-Standby 的主备切换

流复制主备切换主要步骤

流复制环境激活备库操作很简单,但想把老的主库转换成备库,可能难住了不少新手。

为了便于描述,先给出本文的测试环境,如下:

1
2
pghost1 192.168.2.11 主节点
pghost2 192.168.2.12 备节点

流复制主备切换主要步骤如下:

  • 步骤1 关闭主库: 可以通过 ‘pg_ctl stop’ 命令关闭主库,也可以关闭主库主机 pghost1。
  • 步骤2 激活备库: 三种方式任选一种: 1) pg_ctl promote 命令方式; 2) 创建触发器文件方式; 3) pg_promote()函数方式。
  • 步骤3 老主库角色转换成备库: 在老主库主机 pghost1 的 $PGDATA 目录下创建 standby.signal 标识文件( 12 版本之前为 recovery.conf 配置文件,若已存在 recovery.done,则修改成 recovery.conf)。
  • 步骤4 启动老主库: 在老主库 pghost1 上启动老主库,切换角色为备库。

pg_promote()函数进行主备切换

以下演示通过 pg_promote()函数进行流复制主备切换,如下:

1、关闭主库: pghost1 上停主库,如下:

1
2
3
[pg12@pghost1 pg_root]$ pg_ctl stop -m fast
waiting for server to shut down.... done
server stopped

2、激活备库: 可以在 pghost1 或 pghost12 或其它通过 psql 能连的第三台主机上发起操作。

以下示例是在 pghost1 上通过 psql 远程连接 pghost2 上的备库并执行 pg_promote()函数进行激活,如下:

1
2
3
4
5
6
7
8
9
10
[pg12@pghost1 pg_root]$ psql -h pghost2 -p 1921 postgres postgres
Password for user postgres:
psql (12beta2)
Type "help" for help.

postgres=# SELECT pg_promote(true,60);
pg_promote
------------
t
(1 row)

这时可以观察 pghost2 上的数据库日志,发现数据库已被正常激活。

3、老主库角色转换成备库: 在老主库主机 pghost1 的 $PGDATA 目录下创建 standby.signal 标识文件,如下:

1
[pg12@pghost1 pg_root]$ touch standby.signal

同时确保 pghost1 目录下存在 postgresql.auto.conf 配置文件。

4、启动老主库: 在 pghost1 上启动老主库,切换角色为备库,如下:

1
[pg12@pghost1 pg_root]$ pg_ctl start

以上四步则完成了流复制主备切换,最后检查下流复制是否正常工作。

总结

PostgreSQL 12 的流复制主备切换和之前版本的流复制主备切换整体思路是一样的,步骤2中新增 pg_promote() 函数切换方式,步骤3略有区别,以上两点需要注意。

参考

最后推荐和张文升共同编写的《PostgreSQL实战》,本书基于PostgreSQL 10 编写,共18章,重点介绍SQL高级特性、并行查询、分区表、物理复制、逻辑复制、备份恢复、高可用、性能优化、PostGIS等,涵盖大量实战用例!

购买链接:https://item.jd.com/12405774.html

PostgreSQL实战
感谢支持!
0%