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


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

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

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

10 203

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) это не должно быть сделано из-за проблем безопасности. Если бы не .pgpass file я бы сохранил строку подключения в качестве переменной среды.

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.конф там вы должны добавить следующую строку:

host <you_db_name> <you_db_owner> 127.0.0.1/32 trust

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

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

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