pg_basebackup是主从同步最稳起点,必须配合-r参数自动生成standby.signal和postgresql.auto.conf,并设置listen_addresses='*'、wal_level=replica、max_wal_senders≥从库数、wal_keep_size足够等主库关键配置,缺一不可。

pg_basebackup 是主从同步最稳的起点,别手写复制 data 目录或 rsync —— 那不是同步,是埋雷。
主库必须开的几个关键配置项
主库的 postgresql.conf 不只是“能连上”就行,流复制依赖 WAL 的实时推送能力。以下参数缺一不可:
-
listen_addresses = '*':不光是为远程连接,从库的walreceiver进程要通过 TCP 主动拉取 WAL,必须监听非 localhost 地址 -
wal_level = replica:低于这个值(如replica以下的archive)无法启用流复制;logical可选但非必需 -
max_wal_senders = 10:必须 ≥ 从库数量;设为 0 就等于关掉复制通道 -
wal_keep_size = 1GB(或wal_keep_segments在旧版中):防止从库短暂断连后 WAL 被主库回收,导致“could not receive data from WAL stream: ERROR: requested WAL segment has already been removed” -
archive_mode = on+archive_command:非强制,但建议配上,为pg_basebackup提供基础归档兜底,也方便后续做 PITR
从库初始化必须用 pg_basebackup,不能删 data 后 rsync
手动拷贝 data 目录看似快,实则跳过一致性快照、WAL 位点校验和 recovery 状态标记,极大概率启动失败或数据错乱。正确流程是:
- 在从库机器上,用普通用户(如
postgres)执行:pg_basebackup -h 192.168.1.10 -U replicator -D /var/lib/pgsql/16/data -P -v -R -X stream -C -S pgslave1 -
-R:自动生成standby.signal和更新postgresql.auto.conf(PG 12+ 不再用recovery.conf) -
-X stream:边备份边接收 WAL 流,保证起点一致;不用此参数,备份完成后再追 WAL 容易丢位点 -
-C:自动在主库创建复制槽(replication slot),防止 WAL 被提前清理 —— 这比wal_keep_size更可靠 - 执行前确保主库已创建复制用户:
CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD 'repl2026';
pg_hba.conf 的两处权限必须分开配
主库的 pg_hba.conf 要同时放行两类连接,顺序和类型不能混:
- 普通客户端访问(如应用连接主库写入):
host all all 0.0.0.0/0 scram-sha-256 - 从库复制连接(只允许指定 IP + 复制用户):
host replication replicator 192.168.1.11/32 scram-sha-256 - 注意:
replication数据库名是关键字,不能写成all或具体 DB 名;认证方式推荐scram-sha-256,避免明文传输密码 - 改完后必须 reload:
pg_ctl reload -D /var/lib/pgsql/16/data(不要 restart,否则中断复制)
验证主从状态别只看进程,要看系统视图
启动从库后,ps aux | grep walreceiver 有进程 ≠ 复制正常。真正要看的是:
- 主库查发送状态:
SELECT client_addr, state, sent_lsn, write_lsn, flush_lsn, replay_lsn FROM pg_stat_replication;
理想状态是state = 'streaming',且replay_lsn与sent_lsn差距小(毫秒级) - 从库查接收状态:
SELECT * FROM pg_stat_wal_receiver;
重点看status = 'streaming'和last_msg_receipt_time是否持续更新 - 常见卡点:
• 时间不同步 → WAL 时间戳校验失败
• SELinux 或防火墙拦了 5432(或自定义端口)→connection refused
• 从库pg_hba.conf没配或配错 → 主库日志报no pg_hba.conf entry
从库 standby.signal 文件一旦生成就别删,重启时它就是“我是备库”的唯一凭证;而主库上对应的复制槽(slot)也不能手动删,除非你确定不再需要这台从库 —— 删了会导致 WAL 积压爆磁盘。











