早在 PostgreSQL 9.1 推出的 pg_basebackup 工具,用来搭建流复制的备库。
主备环境:
PG SQL 版本:9.3主库 IP: 192.168.1.36备库 IP: 192.168.1.35注:表空间目录和数据目录,因为这些目录需要在备库主机上手工创建。
这时表空间目录,数据($PGDATA)目录都复制过来了,这里使用了 -X 参数,在备份完成之后,会到主库上收集 pg_basebackup 执行期间产生的 WAL 日志,在 9.2 版本之后支持 -Xs 即 stream(流)形式,这种模式不需要收集主库的 WAL 文件,而能以 stream 复制方式直接同步主库。
设置备库 postgresql.conf hot_standby = on 设置从库 recovery.conf $ cp /opt/pgsql9.3beta1/share/recovery.conf.sample recovery.conf # vi recovery.conf standby_mode = on primary_conninfo = 'host=192.168.1.36 port=1925 user=repuser' trigger_file = '/database/pg93/pg_root/postgresql.trigger.1925' 启动服务 $ pg_ctl start -D $PGDATA server starting 查看备库进程 $ ps -ef | grep pg93 pg93 31398 1 0 21:09 pts/0 00:00:00 /opt/pgsql9.3beta1/bin/postgres -D /database/pg93/pg_root pg93 31399 31398 0 21:09 ? 00:00:00 postgres: logger process pg93 31400 31398 0 21:09 ? 00:00:00 postgres: startup process waiting for 00000001000000010000001A pg93 31401 31398 0 21:09 ? 00:00:00 postgres: checkpointer process pg93 31402 31398 0 21:09 ? 00:00:00 postgres: writer process pg93 31403 31398 0 21:09 ? 00:00:00 postgres: stats collector process pg93 31404 31398 0 21:09 ? 00:00:00 postgres: wal receiver process 查看主库进程 $ ps -ef | grep pg93 pg93 2504 1 0 Jun28 ? 00:00:26 /opt/pgsql9.3beta1/bin/postgres -D /database/pg93/pg_root pg93 2505 2504 0 Jun28 ? 00:00:00 postgres: logger process pg93 2507 2504 0 Jun28 ? 00:00:08 postgres: checkpointer process pg93 2508 2504 0 Jun28 ? 00:00:28 postgres: writer process pg93 2509 2504 0 Jun28 ? 00:00:08 postgres: wal writer process pg93 2510 2504 0 Jun28 ? 00:00:19 postgres: autovacuum launcher process pg93 2511 2504 0 Jun28 ? 00:00:00 postgres: archiver process last was 000000010000000100000019.00000024.backup pg93 2512 2504 0 Jun28 ? 00:00:44 postgres: stats collector process pg93 31898 2504 0 21:09 ? 00:00:00 postgres: wal sender process repuser 192.168.1.35(39545) idle默认情况下,恢复会一直恢复到 WAL 日志的末尾。在 recovery_target、recovery_target_lsn、recovery_target_name、recovery_target_time 和 recovery_target_xid 中,最多只能使用一个,如果在配置文件中使用了多个,将使用最后一个。
recovery_target = ‘immediate’:指定恢复应该在达到一致状态后尽快结束。在从一个在线备份中恢复时,这意味着备份结束的那个点。recovery_target_name (string):指定 pg_create_restore_point() 所创建的已命名的恢复点,进行恢复。recovery_target_time (timestamp):指定按时间戳恢复。recovery_target_xid (string):指定按事务 ID 进行恢复。recovery_target_lsn (pg_lsn):指定按继续进行的预写日志位置的 LSN 进行恢复。recovery_target_inclusive (boolean):指定是否仅在指定的恢复目标之后停止(true), 或者仅在恢复目标之前停止(false)。 适用于 recovery_target_lsn、recovery_target_time 或者 recovery_target_xid被 指定的情况。这个设置分别控制事务是否有准确的目标 WAL 位置(LAN)、提交时间或事务 ID 将被包括在该恢复中。 默认值为 true。recovery_target_timeline (string):指定恢复到一个特定的时间线中。默认值是沿着基础备份建立时的当前时间线恢复。将这个参数设置为 latest 会恢复到该归档中能找到的最新的时间线。recovery_target_action (enum):指定在达到恢复目标时服务器应该立刻采取的动作,包括 pause(暂停)、promote(接受连接)、shutdown(停止服务器),其中 pause 为默认动作。注意:当 synchronous_commit 被设置为 remote_apply 时,同步复制会受到这个设置的影响,每一个 COMMIT 都需要等待被应用。
PostgreSQL 12 的一个重要变化就是将 Recovery.conf 文件参数合并到了 postgresql.conf。之前版本 PostgreSQL 的流复制备库是通过在 $PGDATA 目录中创建 recovery.conf 文件来标识的,这是流复制部署的重要文件,若 $PGDATA 目录下不存在此文件,数据库无法以流复制备库角色启动。PostgreSQL 12 之后 recovery.conf 不再使用,若 recovery.conf 文件存在,数据库将无法启动。
此外,还:
新增 recovery.signal 标识文件,表示数据库处于 recovery 模式。新增加 standby.signal 标识文件,表示数据库处于 standby 模式。trigger_file 参数更名为 promote_trigger_file。standby_mode 参数不再支持。12 版本pg_basebackup 命令的 -R 参数的效果和之前不同,主要体现在:
命令执行后在 $PGDATA 目录创建 standby.signal 标识文件,文件内容为空。命令执行后在 $PGDATA 目录的 postgresql.auto.conf 文件中添加 primary_conninfo 参数信息。