Как передать пароль в дамп pg?
Я пытаюсь создать cronjob для резервного копирования моей базы данных каждую ночь, прежде чем произойдет что-то катастрофическое. Похоже, эта команда должна удовлетворить мои потребности:
0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
за исключением того, что после запуска этого он ожидает, что я введу пароль. Я не могу этого сделать, если я запустил его из cron. Как я могу передать один автоматически?
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) это не должно быть сделано из-за проблем безопасности. Если бы не
.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
и он работал без пароля