PostgreSQL 12 的一个重要变化是 recovery.conf 配置文件中的参数合并到 postgresql.conf,recovery.conf 不再使用,我们看看手册的说明,如下:
发行说明
Move recovery.conf settings into postgresql.conf (Fujii Masao, Simon Riggs, Abhijit Menon-Sen, Sergei Kornilov)
recovery.conf is no longer used, and the server will not start if the file exists. recovery.signal and standby.signal are now used to switch into non-primary mode. trigger_file has been renamed to promote_trigger_file. The standby_mode setting has been removed.
手册提到变化信息不少,包括以下几点:
- recovery.conf 配置文件不再支持,此文件中的参数合并到 postgresql.conf,若 recovery.conf 存在,数据库无法启动
- 新增 recovery.signal 标识文件,表示数据库处于 recovery 模式
- 新增加 standby.signal 标识文件,表示数据库处于 standby 模式
- trigger_file 参数更名为 promote_trigger_file
- standby_mode 参数不再支持
以上变化对于部署 PostgreSQL 流复制有哪些地方需要注意?本文本简单演示,流复制的部署可参考 PostgreSQL:使用 pg_basebackup 搭建流复制环境。
pg_basebackup 命令差异
12 版本pg_basebackup
命令的 -R 参数的效果和之前不同,主要体现在:
- 命令执行后在 $PGDATA 目录创建 standby.signal 标识文件,文件内容为空
- 命令执行后在 $PGDATA 目录的 postgresql.auto.conf 文件中添加 primary_conninfo 参数信息
接着验证下,测试环境信息如下:
pghost1 192.168.2.11 主节点
pghost2 192.168.2.12 备节点
在 pghost2 执行 pg_basebackup
命令,如下:
[pg12@pghost2 pg12]$ pg_basebackup -R -D /pgdata/pg12/pg_root -Fp -Xs -v -P -h 192.168.2.11 -p 1921 -U repuser
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/5B000028 on timeline 1
pg_basebackup: starting background WAL receiver
pg_basebackup: created temporary replication slot "pg_basebackup_34159"
1144035/1144035 kB (100%), 2/2 tablespaces
pg_basebackup: write-ahead log end point: 0/5B000138
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: syncing data to disk ...
pg_basebackup: base backup completed
验证 standby.signal 文件,如下:
[pg12@pghost2 pg_root]$ ll $PGDATA/standby.signal
-rw-------. 1 pg12 pg12 0 Jul 18 10:30 /pgdata/pg12/pg_root/standby.signal
验证 postgresql.auto.conf 文件,如下:
[pg12@pghost2 pg_root]$ cat $PGDATA/postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
primary_conninfo = 'user=repuser passfile=''/home/pg12/.pgpass'' host=192.168.2.11 port=1921 sslmode=disable sslcompression=0 gssencmode=disable target_session_attrs=any'
果然 $PGDATA 目录下产生了 standby.signa 标识文件,同时 postgresql.auto.conf 配置文件增加了 primary_conninfo 参数信息。
之后启动备库,如下:
[pg12@pghost2 pg_root]$ pg_ctl start
并验证主备角色,流复制正常工作。
recovery.conf 不再支持
之前版本 PostgreSQL 的流复制备库是通过在 $PGDATA 目录中创建 recovery.conf 文件来标识的,这是流复制部署的重要文件,若 $PGDATA 目录下不存在此文件,数据库无法以流复制备库角色启动。
12 版本开始 recovery.conf 文件不再支持,若数据目录中存在此文件,数据库启动报错。
总结
虽然 PostgreSQL 12 部署流复制在操作层面和之前版几乎没有区别,但在处理机制上 12 版本和之前版本相差较大,同时 pg_basebackup
命令的 -R 参数的效果也和之前版本不一样,这些是需要注意的地方。
参考
- Waiting for PostgreSQL 12 – Integrate recovery.conf into postgresql.conf
- PostgreSQL 12 preview - recovery.conf 合并入 postgresql.conf后的HOT STANDBY配置
- Archive Recovery
- pg_basebackup
源文链接: https://postgres.fun/20190718155800.html
新书推荐
最后推荐和张文升共同编写的《PostgreSQL实战》,本书基于PostgreSQL 10 编写,共18章,重点介绍SQL高级特性、并行查询、分区表、物理复制、逻辑复制、备份恢复、高可用、性能优化、PostGIS等,涵盖大量实战用例!