Как передать пароль в pg_dump? - PullRequest
234 голосов
/ 24 мая 2010

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

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

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

Ответы [ 13 ]

247 голосов
/ 24 мая 2010

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

182 голосов
/ 14 ноября 2011

Или вы можете настроить 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
148 голосов
/ 11 июня 2014

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

PGPASSWORD="mypass" pg_dump mydb > mydb.dump
108 голосов
/ 24 июля 2015

Для однострочной, например, миграции базы данных, вы можете использовать --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, я бы сохранил строку подключения как переменную среды.

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

42 голосов
/ 25 июля 2014
$ PGPASSWORD="mypass" pg_dump -i -h localhost -p 5432 -U username -F c -b -v -f dumpfilename.dump databasename
17 голосов
/ 02 февраля 2017

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

pg_dump postgresql://username:password@127.0.0.1:5432/mydatabase 
8 голосов
/ 17 декабря 2018

Этот лайнер помогает мне при создании дампа одной базы данных.

PGPASSWORD="yourpassword" pg_dump -U postgres -h localhost mydb > mydb.pgsql
4 голосов
/ 02 апреля 2018

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

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

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=$1
PASSWORD=$2

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 используется с другой учетной записью узла для того, чтобы обеспечить эти полномочия, может быть бессмысленно.

4 голосов
/ 17 сентября 2013

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

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

3 голосов
/ 18 декабря 2018

Как подробно описано в этом сообщении в блоге , существует два способа неинтерактивно предоставить пароль для утилит PostgreSQL, таких как команда "pg_dump": используя файл ". Pgpass" или используя переменную окружения "PGPASSWORD" .

...