Как передать пароль в дамп pg?

Я пытаюсь создать cronjob для резервного копирования моей базы данных каждую ночь, прежде чем произойдет что-то катастрофическое. Похоже, эта команда должна удовлетворить мои потребности:

0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz

кроме как после запуска этого, он ожидает, что я введу пароль. Я не смогу этого сделать, если буду работать с Кроном. Как я могу передать его автоматически?

10 ответов


создать .pgpass файл в домашнем каталоге учетной записи, который pg_dump будет работать как. См. документацию Postgresql libpq-pgpass для деталей формата (включая последний абзац, где он объясняет, что он будет проигнорирован, если вы не установите режим 0600).


или вы можете настроить crontab для запуска скрипта. Внутри этого скрипта вы можете установить переменную окружения такой: export PGPASSWORD="$put_here_the_password"

таким образом, если у вас есть несколько команд, которые потребуют пароль, вы можете поместить их все в сценарии. Если пароль меняется, вам нужно изменить его только в одном месте (скрипт).

и я согласен с Джошуа, используя pg_dump -Fc создает наиболее гибкий формат экспорта и уже сжат. Для получения дополнительной информации см.:помощью pg_dump документация

Е. Г.

# dump the database in custom-format archive
pg_dump -Fc mydb > db.dump

# restore the database
pg_restore -d newdb db.dump

Если вы хотите сделать это в одну команду:

PGPASSWORD="mypass" pg_dump mydb > mydb.dump

для однострочного, как миграция базы данных вы можете использовать --dbname затем следует строка подключения (включая пароль), как указано в руководство помощью pg_dump

в сущности.

pg_dump --dbname=postgresql://username:password@127.0.0.1:5432/mydatabase

Примечание: убедитесь, что вы используете --dbname вместо более короткого -d и используйте допустимый префикс URI,postgresql:// или postgres://.

общая форма URI есть:

postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]

Лучшая практика в вашем случае (повторяющаяся задача в cron) это не должно быть сделано из-за проблем безопасности. Если бы не ... --7--> файл я бы сохранил строку подключения в качестве переменной среды.

export MYDB=postgresql://username:password@127.0.0.1:5432/mydatabase

тогда имейте в своем crontab

0 3 * * * pg_dump --dbname=$MYDB | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz


$ PGPASSWORD="mypass" pg_dump -i -h localhost -p 5432 -U username -F c -b -v -f dumpfilename.dump databasename

@Josue Alexander Ibarra ответ работает на centos 7 и версии 9.5 если --dbname не передается.

pg_dump postgresql://username:password@127.0.0.1:5432/mydatabase 

исправьте меня, если я ошибаюсь, но если системный пользователь такой же, как пользователь базы данных, PostgreSQL не будет запрашивать пароль - он полагается на систему для аутентификации. Это может быть вопросом конфигурации.

таким образом, когда я хотел владельца базы данных postgres для резервного копирования его баз данных каждую ночь, я мог бы создать crontab для него:crontab -e -u postgres. Конечно,postgres должно быть разрешено выполнять задания cron; таким образом, он должен быть указан в /etc/cron.allow или /etc/cron.deny должен быть пустой.


резервное копирование через ssh с паролем с использованием временного .учетные данные pgpass и нажмите на S3:

#!/usr/bin/env bash
cd "$(dirname "")"

DB_HOST="*******.*********.us-west-2.rds.amazonaws.com"
DB_USER="*******"
SSH_HOST="my_user@host.my_domain.com"
BUCKET_PATH="bucket_name/backup"

if [ $# -ne 2 ]; then
    echo "Error: 2 arguments required"
    echo "Usage:"
    echo "  my-backup-script.sh <DB-name> <password>"
    echo "  <DB-name> = The name of the DB to backup"
    echo "  <password> = The DB password, which is also used for GPG encryption of the backup file"
    echo "Example:"
    echo "  my-backup-script.sh my_db my_password"
    exit 1
fi

DATABASE=
PASSWORD=

echo "set remote PG password .."
echo "$DB_HOST:5432:$DATABASE:$DB_USER:$PASSWORD" | ssh "$SSH_HOST" "cat > ~/.pgpass; chmod 0600 ~/.pgpass"
echo "backup over SSH and gzip the backup .."
ssh "$SSH_HOST" "pg_dump -U $DB_USER -h $DB_HOST -C --column-inserts $DATABASE" | gzip > ./tmp.gz
echo "unset remote PG password .."
echo "*********" | ssh "$SSH_HOST" "cat > ~/.pgpass"
echo "encrypt the backup .."
gpg --batch --passphrase "$PASSWORD" --cipher-algo AES256 --compression-algo BZIP2 -co "$DATABASE.sql.gz.gpg" ./tmp.gz

# Backing up to AWS obviously requires having your credentials to be set locally
# EC2 instances can use instance permissions to push files to S3
DATETIME=`date "+%Y%m%d-%H%M%S"`
aws s3 cp ./"$DATABASE.sql.gz.gpg" s3://"$BUCKET_PATH"/"$DATABASE"/db/"$DATETIME".sql.gz.gpg
# s3 is cheap, so don't worry about a little temporary duplication here
# "latest" is always good to have because it makes it easier for dev-ops to use
aws s3 cp ./"$DATABASE.sql.gz.gpg" s3://"$BUCKET_PATH"/"$DATABASE"/db/latest.sql.gz.gpg

echo "local clean-up .."
rm ./tmp.gz
rm "$DATABASE.sql.gz.gpg"

echo "-----------------------"
echo "To decrypt and extract:"
echo "-----------------------"
echo "gpg -d ./$DATABASE.sql.gz.gpg | gunzip > tmp.sql"
echo

просто замените первые пару строк конфигурации тем, что вам нужно - очевидно. Для тех, кто не заинтересован в резервной части S3, выньте ее - очевидно.

этот скрипт удаляет учетные данные в .pgpass затем, потому что в некоторых средах пользователь SSH по умолчанию может sudo без пароля, например экземпляр EC2 с ubuntu пользователь, поэтому используя .pgpass С другой учетной записью хоста для защиты этих учетных данных может быть бессмысленным.


другой (вероятно, не безопасный) способ передать пароль - использовать перенаправление ввода, т. е. вызов

pg_dump [params] < [path to file containing password]


самый простой способ, на мой взгляд, это: вы редактируете главный файл конфигурации postgres: pg_hba.conf там вы должны добавить следующую строку:

host <you_db_name> <you_db_owner> 127.0.0.1/32 trust

и после этого вам нужно начать КРУН таким образом:

pg_dump -h 127.0.0.1 -U <you_db_user> <you_db_name> | gzip > /backup/db/$(date +%Y-%m-%d).psql.gz

и он работал без пароля