我在VM虚拟机里装了两个Linux系统,每个系统里面用docker 安装了postgresql数据库,现在两台数据库做集群主备切换,备库可以连接主库,一切正常,主库设置了复制用户。备库在用docker run --rm -it --network host postgres:16 pg_basebackup -h 192.168.223.128 -U replicator -D /tmp/pgdata -Fp -Xs -P
初始化时,一直报no pg_hba.conf entry for replication connection from host "192.168.223.129", user "replicator", no encryption错误,在主库日志上也能看到这个报错日志,虚拟机用的net网络,请问是怎么回事
postgresql主从复制问题
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
4条回答 默认 最新
檀越@新空间 2025-08-09 16:08关注下午好🌅🌅🌅
本答案参考通义千问你遇到的问题是 PostgreSQL 主从复制中
pg_basebackup报错,具体错误信息是:no pg_hba.conf entry for replication connection from host "192.168.223.129", user "replicator", no encryption
这个错误的原因是 主库的
pg_hba.conf配置没有允许备库的 IP 地址通过复制连接。下面我们来详细分析并提供解决方案。
一、问题原因分析
1. pg_hba.conf 文件配置缺失
PostgreSQL 的
pg_hba.conf文件控制客户端连接权限,包括 复制连接(replication)。如果未在该文件中添加对应的规则,就会出现上述错误。2. IP 地址不匹配或网络配置问题
虽然你说“备库可以连接主库”,但可能只是普通的连接(如使用
psql连接),而 复制连接需要特定的配置。此外,虚拟机的网络模式(如host模式)可能导致 IP 地址无法正确识别。
二、解决方案步骤
第一步:检查主库的
pg_hba.conf配置查找
pg_hba.conf的位置# 在主库容器中执行以下命令 psql -U postgres -c "SHOW hba_file;"打开
pg_hba.conf文件sudo nano /path/to/pg_hba.conf添加如下行(假设主库 IP 是
192.168.223.128,备库 IP 是192.168.223.129):# Allow replication connections from the standby server host replication replicator 192.168.223.129/32 trust注意: 如果使用的是
host网络模式,那么主库和备库可能共享同一个 IP,这时候需要根据实际网络情况调整 IP 或使用0.0.0.0/0(不推荐生产环境)。
第二步:重启 PostgreSQL 服务使配置生效
# 在主库容器中执行 sudo systemctl restart postgresql或者直接重启 Docker 容器(如果你使用的是 Docker):
docker restart <postgres_container_id>
第三步:确保主库监听所有接口
检查主库的
postgresql.conf文件中的listen_addresses设置:# 在主库容器中执行 psql -U postgres -c "SHOW listen_addresses;"如果输出为
localhost,则需要修改为:listen_addresses = '*'然后重启 PostgreSQL:
sudo systemctl restart postgresql
第四步:确认备库的 IP 地址是否正确
在备库中执行:
ifconfig或:
ip a查看你的网络接口(如
eth0或enp0s3)对应的 IP 地址,确保与pg_hba.conf中的 IP 匹配。
第五步:重新运行
pg_basebackup命令在备库中再次运行:
docker run --rm -it --network host postgres:16 \ pg_basebackup -h 192.168.223.128 -U replicator -D /tmp/pgdata -Fp -Xs -P注意: 如果使用的是
--network host,请确保主库和备库在同一个网络中,并且 IP 可以互相访问。
三、示例配置文件内容
pg_hba.conf示例(主库)# TYPE DATABASE USER ADDRESS METHOD local all all peer host all all 127.0.0.1/32 md5 host all all ::1/128 md5 host replication replicator 192.168.223.129/32 trustpostgresql.conf示例(主库)listen_addresses = '*'
四、常见错误排查建议
| 错误信息 | 解决方案 | |----------|----------| |
no pg_hba.conf entry for replication connection| 修改pg_hba.conf,添加复制用户和 IP 的规则 | |no encryption| 如果不需要加密,可以使用trust方法;若需加密,可配置 SSL | |connection refused| 检查主库是否监听所有地址(listen_addresses = '*') | |password authentication failed| 确保pg_hba.conf中的method设置为md5或scram-sha-256并设置密码 |
五、总结
| 步骤 | 内容 | |------|------| | 1 | 修改主库的
pg_hba.conf,添加复制用户的 IP 和权限 | | 2 | 重启 PostgreSQL 服务 | | 3 | 确保主库监听所有 IP 地址 | | 4 | 确认备库的 IP 地址是否正确 | | 5 | 重新运行pg_basebackup命令 |
如果你仍然遇到问题,可以提供以下信息帮助进一步诊断:
- 主库的
pg_hba.conf内容 - 主库的
postgresql.conf内容 - 备库的 IP 地址
- Docker 的网络配置(如
--network host是否生效)
希望这些信息能帮你解决问题!如果需要代码示例或进一步说明,请告诉我。
解决 无用评论 打赏 举报- 主库的