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
相关产品推荐
相关产品推荐

