Как передать пароль на pg_dump?
Я пытаюсь создать cronjob для резервного копирования моей базы данных каждую ночь, прежде чем произойдет что-то катастрофическое. Похоже, эта команда должна соответствовать моим потребностям:
0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
За исключением этого, он ожидает, что я наберу пароль. Я не могу этого сделать, если я запустил его из cron. Как я могу передать его автоматически?
Ответы
Ответ 1
Создайте файл .pgpass
в домашнем каталоге учетной записи, под которой будет запускаться pg_dump
. См. Документацию Postgresql libpq-pgpass для получения подробной информации о формате (включая последний абзац, где объясняется, что он будет игнорироваться, если вы не установите режим в 0600
).
Ответ 2
Или вы можете настроить crontab для запуска script. Внутри script вы можете установить переменную среды следующим образом:
export PGPASSWORD="$put_here_the_password"
Таким образом, если у вас есть несколько команд, для которых потребуется пароль, вы можете поместить их все в script. Если пароль меняется, вам нужно изменить его только в одном месте (script).
И я согласен с Джошуа, используя 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
Ответ 3
Если вы хотите сделать это с помощью одной команды:
PGPASSWORD="mypass" pg_dump mydb > mydb.dump
Ответ 4
Для однострочного интерфейса, например, для миграции базы данных, вы можете использовать --dbname
, за которой следует строка подключения (включая пароль), как указано в pg_dump manual
В сущности.
pg_dump --dbname=postgresql://username:[email protected]:5432/mydatabase
Примечание. Убедитесь, что вы используете опцию --dbname
вместо более короткой -d
и используйте допустимый префикс URI, postgresql://
или postgres://
.
Общая форма URI:
postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
Лучшая практика в вашем случае (повторяющаяся задача в cron), это не должно быть сделано из-за проблем с безопасностью. Если бы не файл .pgpass
, я бы сохранил строку подключения как переменную среды.
export MYDB=postgresql://username:[email protected]:5432/mydatabase
то в вашем crontab
0 3 * * * pg_dump --dbname=$MYDB | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
Ответ 5
$ PGPASSWORD="mypass" pg_dump -i -h localhost -p 5432 -U username -F c -b -v -f dumpfilename.dump databasename
Ответ 6
@Josue Александр Ибарра отвечает на работы centos 7 и версии 9.5
если --dbname не передается.
pg_dump postgresql://username:[email protected]:5432/mydatabase
Ответ 7
Исправьте меня, если я ошибаюсь, но если системный пользователь совпадает с пользователем базы данных, PostgreSQL не будет запрашивать пароль - он полагается на систему для аутентификации. Это может быть вопросом конфигурации.
Таким образом, когда я хотел, чтобы владелец базы данных postgres
резервировал свои базы данных каждую ночь, я мог бы создать для него crontab: crontab -e -u postgres
. Конечно, postgres
должно быть разрешено выполнять задания cron; поэтому он должен быть указан в /etc/cron.allow
, или /etc/cron.deny
должен быть пустым.
Ответ 8
Сделайте резервную копию через ssh с паролем, используя временные учетные данные.pgpass и отправьте на S3:
#!/usr/bin/env bash
cd "$(dirname "$0")"
DB_HOST="*******.*********.us-west-2.rds.amazonaws.com"
DB_USER="*******"
SSH_HOST="[email protected]_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
с другой учетной записью хоста, может быть бессмысленным.
Ответ 9
Этот лайнер помогает мне при создании дампа одной базы данных.
PGPASSWORD="yourpassword" pg_dump -U postgres -h localhost mydb > mydb.pgsql
Ответ 10
Как подробно описано в этом сообщении, есть два способа неинтерактивно предоставлять пароль для утилит PostgreSQL, таких как команда "pg_dump": с помощью файла ".pgpass" или с помощью переменной среды "PGPASSWORD".
Ответ 11
Другой (возможно, не безопасный) способ передачи пароля - использование перенаправления ввода, то есть вызов
pg_dump [params] < [path to file containing password]
Ответ 12
Самый простой способ, на мой взгляд, это:
вы редактируете основной файл настроек postgres: pg_hba.conf
там вы должны добавить следующую строку:
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
и он работал без пароля