You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL:如何结合pg_rewind实现逻辑复制并替代basebackup

PostgreSQL中pg_rewind的使用及与逻辑复制的说明

一、pg_rewind与逻辑复制的关系

首先明确:pg_rewind是物理复制场景的工具,无法结合逻辑复制使用,核心原因:

  • 逻辑复制要求wal_level = logical,你当前设置的replica级别仅支持物理复制,无法生成逻辑复制所需的行级变更日志。
  • pg_rewind的作用是通过对比主副库的磁盘块差异+wal日志,快速同步偏离主库的物理副本,和逻辑复制的行级订阅/发布机制完全无关。

若要使用逻辑复制,需先将主库wal_level改为logical并重启,再配置复制槽、发布者和订阅者,但这和pg_rewind没有交集。

二、用pg_rewind替代重复basebackup的操作流程

当你的归档服务器(作为物理副本)需要重新同步主库时,pg_rewind可以替代全量basebackup,前提满足:

  • 主副库PostgreSQL版本一致(跨大版本不支持)
  • 主库开启wal_log_hints = on(PostgreSQL 10+默认开启,低版本需手动配置并重启)
  • 副本库曾与主库保持物理同步(有共同的wal历史)

操作步骤:

1. 停止副本库服务

pg_ctl stop -D /path/to/replica/data_dir

2. 执行pg_rewind同步

无需将原数据目录重命名为data_old,直接对现有目录执行:

pg_rewind \
  --target-pgdata=/path/to/replica/data_dir \
  --source-server="host=MASTER_IP port=5432 user=REPL_USER password=REPL_PWD dbname=postgres"
  • --target-pgdata:指定副本库的数据目录路径
  • --source-server:主库的连接字符串,需使用具备复制权限的用户

3. 配置副本库的standby模式

PostgreSQL 12+版本:

编辑postgresql.conf,确保以下配置:

primary_conninfo = 'host=MASTER_IP port=5432 user=REPL_USER password=REPL_PWD'
restore_command = 'cp /path/to/archive_dir/%f %p' # 替换为你的归档路径

创建standby.signal文件标记为副本:

touch /path/to/replica/data_dir/standby.signal

PostgreSQL 11及更早版本:

编辑recovery.conf:

standby_mode = 'on'
primary_conninfo = 'host=MASTER_IP port=5432 user=REPL_USER password=REPL_PWD'
restore_command = 'cp /path/to/archive_dir/%f %p'

4. 启动副本库

pg_ctl start -D /path/to/replica/data_dir

注意事项

  • 如果副本库与主库差异过大(比如主库执行了大量DROP TABLE、TRUNCATE等操作,且对应的wal日志已被清理),pg_rewind可能无法完成同步,此时仍需执行basebackup。
  • 确保副本库在断开同步后没有被独立写入(比如单独启动为可写实例),否则pg_rewind会报错。

内容的提问来源于stack exchange,提问作者Akash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:39:59