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