Я пытаюсь настроить автоматическое резервное копирование для postgres db на локальном автономном сервере в Debian. У меня есть сценарий:
#!/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 Все работает, если я изменяю скрипт на запуск от имени пользователя root sudo -u postgres pg_dumpall
.
ОБНОВЛЕНИЕ :
В итоге у меня сработало добавление этой строки в pg_ident.conf
:
omicron root postgres
Затем в pg_hba.conf
перед всем остальным:
local all all ident map=omicron
И изменение скрипта для запуска pg_dumpall
как пользователь postgres
(только потому, что db_user
не имел всех необходимых привилегий для dumpall
).
peer
аутентификация означает, что postgresql принимает соединения через сокет unix от указанного пользователя системы unix без пароля в качестве указанного пользователя базы данных, поэтому пытаться использовать PGPASS бессмысленно.
Подробнее о равноправном
доступе здесь: https://www.postgresql.org/docs/current/auth-peer.html
В вашем случае ваш pg_hba.conf
позволяет только системному пользователю postgres
подключаться ко всем базам данных в качестве пользователя базы данных postgres
. Я не вижу вашего db_user
в вашем pg_hba.conf
, поэтому он не может подключиться.sudo -u postgres pg_dumpall
означает, что вы переключаетесь на системного пользователя postgres
и запускаете pg_dumpall
от имени этого пользователя, подключающегося как пользователь базы данных postgres
. Вот почему это работает.