暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

pg_rewind原理及使用

原创 2025-10-14
165

 

       pg_rewind是一个用于在PostgreSQL集群时间线分歧后同步集群的工具,尤其适用于故障转移场景。它通过扫描目标集群WAL日志并复制源集群的更改块来实现增量恢复,避免了全量复制。

     pg_rewind使一个PostgreSQL数据目录与另一个数据目录(该目录从第一个PostgreSQL数据目录创建而来)一致。

      典型的案例是旧主服务器在故障转移后重新联机,将其作为新主机之后的备用服务器。

      权限要求:pg_rewind需要使用高权限用户,pg新版本可以授权,pg老版本最好用超级用户。

      参数要求:使用pg_rewind要求wal_log_hints开启且full_page_writes设为on 

       数据库开启 checksums 或者设置wal_log_hints参数为on,一般采用后者

1. 优点

      与base backup或使用 rsync 等工具不同,pg_rewind不需要比较或复制群集中未更改的关系块。仅复制现有关系文件中更改的块和所有其他文件(包括new relation files, configuration files, and WAL segments)将完整复制。因此,当数据库很大且群集之间只有一小部分块不同时,pg_rewind操作比其他方法快得多。

     使用 pg_rewind 不限于故障转移,可以promote备用服务器,运行一些写入事务,然后重新回卷,再次成为备用服务器。

2. 使用要求

需要目标服务器设置wal_log_hints为on或者initdb时启用了data checksums
此外需要将full_page_writes设置为on(默认值on)
alter system set wal_log_hints = on;   ---默认off
alter system set full_page_writes = on;    --默认on
注意,使用pg_rewind需要提前配置参数

3. 工作原理

基本思想是将所有文件系统级别的更改从源群集复制到目标群集

1. 确定新Master和旧Master数据一致性的Checkpoint位置(时间线分叉点之前的最近一个checkpoint)。在该位置上, 新Master和旧Master数据完全一致。 这可以通过读取新旧Master节点时间线历史文件可以获得,该文件位于$PGDATA/pg_wal/目录下,文件名称为XX.history 
2. 旧Master节点根据上一步获取的Checkpoint读取本机日志文件WAL Record,获取在此Checkpoint之后出现变化的Block,生成目标群集中更改的所有数据块的列表。(以链表的方式存储Block编号等信息)
3. 根据第2步获取的Block信息从新Master节点拷贝相应的更改的Block到目标群集,替换旧Master节点相应的Block
4. 拷贝新Master节点上除数据文件外的所有其他文件,包括new relation files, WAL segments, pg_xact, and configuration files
5. 旧Master启动数据库,创建一个backup_lable文件,从failover的checkpoint开始,重放wal日志并更改pg_control文件的LSN信息,使数据库恢复到一致状态。

第5步 旧Master启动数据库   有待查看日志验证

4. 使用示例

  1. 故障转移后,重新启动旧主机作为新的备用服务器。

启动报错,出现了时间线分叉

LOG:  entering standby mode
FATAL:  requested timeline 2 is not a child of this server's history
DETAIL:  Latest checkpoint is at 0/6000028 on timeline 1, but in the history of the requested timeline, the server forked off from that timeline at 0/4000098.
LOG:  startup process (PID 22321) exited with exit code 1
LOG:  aborting startup due to startup process failure
LOG:  database system is shut down

此时需要用pg_rewind重新拉齐一次主备

2、配置新主pg_hba

配置pg_rewind的登陆用户登陆源库许可,注意配置后reload生效

vi pg_hba.conf

host    all       pg         172.17.100.150/32          trust

pg_rewind需要使用高权限用户,pg新版本可以授权,pg老版本最好用超级用户。

3.wal_log_hints = on参数配置

将wal_log_hints = on追加到目标库postgres.conf,重新启动并关闭目标库

或  启动目标库修改再关闭

alter system set wal_log_hints = on;     ---默认off
alter system set full_page_writes = on;    --默认on

4、pg_rewind命令执行

注意:执行前先备份目标库的数据

pg_rewind --target-pgdata /opt/pg106/data --source-server='host=192.168.6.142 port=5970 user=pg106 dbname=postgres' -P

5、配置备库参数

更改postgres.conf和recovery.conf中的IP、端口、目录等配置,pg_rewind会把配置文件也cp过来

mv recovery.done recovery.conf

vi recovery.conf

vi postgres.conf

启动备库

pg_ctl -D /pg/pg96data_sla -l /pg/pg96data_sla/server.log start

注意,

mv recovery.done recovery.conf

vi recovery.conf

  1.    pg_rewind 会将 recovery.conf 拷贝为 recovery.done。如果主库有的recovery.done文件,则会复制到备库并覆盖文件。此时重新修改recovery.done并重命名为recovery.conf
  2.     此外,数据库同步出现日志断档,无法使用pg_rewind增量追加数据

断档报错

pg_rewind --target-pgdata /opt/pg106/data --source-server='host=192.168.6.141 port=5970 user=pg106 dbname=postgres' -P

编辑

5、要求说明

pg_rewind对权限的要求
pg_rewind工具其实只依赖如下以下四个文件读取系统函数的权限:
pg_ls_dir()
pg_read_file()
pg_read_binary_file()
pg_stat_file()
这四个函数在PostgreSQL 11版本之前只能超级用户才有权限使用。从PostgreSQL 11开始,pg_rewind可以不依赖超级用户只需要分配这几个系统函数权限。

部分摘自pg_rewind_pg rewind-CSDN博客

  

最后修改时间:2025-10-14 18:14:24
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论