我正在Debian上的本地无头服务器上为postgres db设置自动备份。我有一个脚本:
#!/bin/bash
export PGPASSFILE='/home/mtn/.pgpass'
pg_dumpall -U db_user --verbose 2>/var/log/postgresql/pgdump.log | gzip > /mnt/bulk-data/db_backup/db_bak.gz
有一个.pgpass
文件:
-rw------- 1 mtn mtn 47 Nov 13 10:14 .pgpass
带有:
*:*:*:postgres:guest
*:*:*:db_user:guest
和sudo crontab -e
作业:
20 0 * * * /home/mtn/backup.sh >/dev/null 2>&1
pg_hba
:
local all postgres peer
当我尝试运行它时,我得到:
pg_dumpall: error: could not connect to database "template1": FATAL: Peer authentication failed for user "db_user"
错误在哪里?
PS如果我将脚本更改为以根sudo -u postgres pg_dumpall
的身份运行,一切都会正常工作。
更新:最终对我起作用的是将这一行添加到pg_ident.conf
:
omicron root postgres
然后先到pg_hba.conf
,然后再到其他:
local all all ident map=omicron
并将脚本更改为以用户postgres
的身份运行pg_dumpall
(只是因为db_user
对dumpall
没有所有必要的特权(。
在没有通过pg_ident.conf的用户映射的情况下,只有一个名为"db_user";被允许作为数据库用户"登录;db_user";。这就是对等身份验证的含义。您的.pgpass
并不重要,因为对等身份验证不使用密码。
你展示的pg_hba中的一行也无关紧要,因为"postgres"!="db_user";所以那条线不匹配。但很明显,您还有其他行没有显示给我们。如果您查看服务器的日志文件,您应该会发现有关错误的更多详细信息,以及使用了pg_hba的哪一行。
有很多解决方案。您可以更改您的linux用户名以匹配postgres用户名,或者更改postgres名称以匹配linux用户名,或者使用pg_ident.conf在它们之间进行映射,或者更改您的pg_hba(正确的行!(以使用md5而不是peer。