Я пытаюсь создать cronjob для резервного копирования базы данных каждую ночь, прежде чем случится что-то катастрофическое. Похоже, эта команда должна соответствовать моим потребностям:
0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
За исключением того, что после запуска, он ожидает, что я наберу пароль. Я не могу этого сделать, если я запускаю его из cron. Как я могу передать один автоматически?
bash
postgresql
shell
crontab
mpen
источник
источник
Ответы:
Создайте
.pgpass
файл в домашнем каталоге учетной записи, котораяpg_dump
будет работать как. См. Документацию Postgresql libpq-pgpass для получения подробной информации о формате (включая последний абзац, где объясняется, что он будет игнорироваться, если вы не установите режим в0600
).источник
sudo su postgres
том, что пользователь Unix не обязательно существует. Это не нужно. Но пользователь БД должен.Или вы можете настроить crontab для запуска скрипта. Внутри этого скрипта вы можете установить переменную окружения следующим образом:
export PGPASSWORD="$put_here_the_password"
Таким образом, если у вас есть несколько команд, для которых требуется пароль, вы можете поместить их все в сценарий. Если пароль меняется, вам нужно изменить его только в одном месте (сценарий).
И я согласен с Джошуа, используя
pg_dump -Fc
генерирует наиболее гибкий формат экспорта и уже сжат. Для получения дополнительной информации см. Документацию pg_dump.Например
источник
.pgpass
вы сохраните все в одном месте, без добавления дополнительного слоя косвенности. плюс, если бы все, что я хотел сделать с экспортом переменной, я сделал бы это в своем.bashrc
файле, или что бы то ни было..pgpass
файл будет лучшим решением. Я просто давал альтернативу, не уверен, что она заслуживает понижения, хотя :)Если вы хотите сделать это одной командой:
источник
postgres://
синтаксисом. Не пробовал,.pgpass
потому что у моего пользователя postgress нет домашнего каталога.Для однострочников, таких как миграция базы данных, вы можете использовать
--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
источник
источник
Этот лайнер помогает мне при создании дампа одной базы данных.
источник
@Josue Александр Ибарра ответ работает на centos 7 и версии 9.5, если --dbname не передано.
источник
--dbname
Обратите внимание, что в Windows
pgpass.conf
файл должен находиться в следующей папке:если
postgresql
внутри%APPDATA%
папки нет папки, создайте ее.pgpass.conf
содержимое файла что - то вроде:ура
источник
Поправьте меня, если я ошибаюсь, но если системный пользователь совпадает с пользователем базы данных, PostgreSQL не будет запрашивать пароль - он использует систему для аутентификации. Это может быть вопросом конфигурации.
Таким образом, когда я хотел владельца базы данных
postgres
для резервного копирования своих баз данных каждую ночь, я мог бы создать кронтаб для него:crontab -e -u postgres
. Конечно,postgres
нужно разрешить выполнять задания cron; таким образом, он должен быть указан/etc/cron.allow
или/etc/cron.deny
должен быть пустым.источник
Сделайте резервную копию через ssh с паролем, используя временные учетные данные .pgpass и отправьте на S3:
Просто замените первые пару строк конфигурации на то, что вам нужно - очевидно. Для тех, кто не заинтересован в резервной части S3, возьмите это - очевидно.
Этот сценарий
.pgpass
впоследствии удаляет учетные данные, поскольку в некоторых средах пользователь SSH по умолчанию может выполнять sudo без пароля, например, экземпляр EC2 сubuntu
пользователем, поэтому использование.pgpass
другой учетной записи хоста для защиты этих учетных данных может быть бессмысленным.источник
history
таким образом, нет?history -c
. При использовании с Jenkins используйте этуInject passwords to the build as environment variables
опцию, чтобы пароль был замаскированКак подробно описано в этом блоге , существует два способа неинтерактивно предоставлять пароль для утилит PostgreSQL, таких как команда «pg_dump»: с помощью файла «.pgpass» или с помощью переменной среды «PGPASSWORD» .
источник
Другой (возможно, небезопасный) способ передачи пароля - это использование перенаправления ввода, т.е.
pg_dump [params] < [path to file containing password]
источник
Вы можете передать пароль в pg_dump напрямую, используя следующее:
источник
самый простой способ, на мой взгляд, это: вы редактируете свой основной файл конфигурации 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
и это работало без пароля
источник