PostgreSQL 14升级后pg_dump备份失败(无密码报错)问题求助
PostgreSQL 14备份失败问题解决方法
问题描述
Speedy Net项目原使用PostgreSQL 13,执行备份命令:
pg_dump -U postgres -h localhost "speedy_net" | gzip > <file_name>.sql.gz
可正常完成备份。升级至Ubuntu 22.04.1 LTS + PostgreSQL 14后,数据库恢复正常但备份失败,报错:
pg_dump: error: connection to server at "localhost" (::1), port 5432 failed: fe_sendauth: no password supplied
手动执行备份命令时要求输入密码,但postgres用户无密码,且PostgreSQL 13版本无需密码即可备份。
原因分析
对比PostgreSQL 13与14的pg_hba.conf配置:
- PostgreSQL 13中IPv6本地连接(
::1/128)采用md5认证,IPv4本地连接(127.0.0.1/32)采用trust认证; - PostgreSQL 14中IPv6本地连接改为
scram-sha-256认证,且系统解析localhost时优先使用IPv6地址::1; - 由于postgres用户未设置适配
scram-sha-256的密码,导致通过IPv6连接时触发认证失败。
解决方案
方法1:使用Unix域套接字连接(推荐)
去掉备份命令中的-h localhost参数,pg_dump默认会使用Unix域套接字连接,对应pg_hba.conf中的local规则(local all postgres peer),无需密码即可认证:
# 以postgres系统用户执行 pg_dump -U postgres "speedy_net" | gzip > <file_name>.sql.gz # 以root用户执行时,需切换到postgres身份 sudo -u postgres pg_dump "speedy_net" | gzip > <file_name>.sql.gz
方法2:调整pg_hba.conf的IPv6认证规则
修改PostgreSQL 14的/etc/postgresql/14/main/pg_hba.conf,将IPv6本地连接的认证方式改为trust或peer:
# 将原行 host all all ::1/128 scram-sha-256 # 修改为(二选一) host all all ::1/128 trust # 无需认证,安全性较低 # 或 host all all ::1/128 peer # 依赖系统用户与数据库用户同名认证
修改后重启PostgreSQL服务生效:
sudo systemctl restart postgresql
方法3:给postgres用户设置scram-sha-256密码
若需保留scram-sha-256认证方式,可给postgres用户设置密码:
- 切换到postgres系统用户并进入psql:
sudo -u postgres psql
- 设置密码(替换为安全密码):
ALTER USER postgres WITH PASSWORD 'your_secure_password';
- 退出psql:
\q
- 可选:配置
~/.pgpass文件实现免密备份,文件格式:
localhost:5432:speedy_net:postgres:your_secure_password
设置文件权限:
chmod 600 ~/.pgpass
关于密码修改的说明
- 若采用方法1(Unix套接字连接),无需修改密码,且安全性最高;
- 若需保留
-h localhost参数,可选择方法2(调整认证规则,安全性较低)或方法3(设置密码+pgpass,安全性较高); - 生产环境优先推荐方法1或方法3。
内容的提问来源于stack exchange,提问作者Uri
相关产品推荐
相关产品推荐

