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