2010-05-23 3 views
182

Я пытаюсь создать cronjob для резервного копирования моей базы данных каждую ночь, прежде чем произойдет что-то катастрофическое. Похоже, эта команда должна отвечать моим потребностям:Как передать пароль pg_dump?

0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz 

За исключением этого, он ожидает, что я наберу пароль. Я не могу этого сделать, если я запустил его из cron. Как я могу передать это автоматически?

+0

возможно полезное сообщение, которое я написал о автоматизации pg_restore! https://medium.com/@trinity/automating-postgres-import-from-heroku-db-to-other-db-449d5946e1fb – kittyminky

ответ

194

Создайте файл .pgpass в домашнем каталоге учетной записи, который будет работать как pg_dump. См. Документацию Postgresql libpq-pgpass для получения подробной информации о формате (включая последний абзац, где он объясняет это, будет проигнорирован, если вы не установили режим на 0600).

+58

Создайте ~/.pgpass с localhost: 5432: mydbname: postgres: mypass Затем chmod 600 ~/.pgpass –

+2

Возможно, полезно: на Ubuntu, «sudo su postgres», чтобы переключиться на пользователя postgres, затем создайте файл .pgpass и выполните дамп. – fivedogit

+1

Я последовал за вашим ответом, но все еще не смог создать файл резервной копии. См. Мою ссылку: http://unix.stackexchange.com/questions/257898/pg-dump-does-not-work-in-cron. Спасибо. – Eliyah

145

Или вы можете настроить crontab для запуска скрипта. Внутри этого скрипта вы можете установить переменную окружения следующим образом: export PGPASSWORD="$put_here_the_password"

Таким образом, если у вас есть несколько команд, для которых потребуется пароль, вы можете поместить их все в скрипт. Если пароль изменен, вам нужно изменить его только в одном месте (сценарий).

И я согласен с Джошуа, используя pg_dump -Fc, создает наиболее гибкий формат экспорта и уже сжат. Для получения дополнительной информации см .: pg_dump documentation

E.g.

# dump the database in custom-format archive 
pg_dump -Fc mydb > db.dump 

# restore the database 
pg_restore -d newdb db.dump 
+3

Это не идеально. бросание его в '.pgpass' будет держать все в одном месте, не добавляя лишний слой косвенности. плюс, если все, что я хотел сделать с экспортом переменной, я бы сделал это в файле '.bashrc' или что бы это ни было. – mpen

+8

Я вижу, почему файл '.pgpass' будет лучшим решением. Я просто давал альтернативу, не уверен, что она заслуживает нисходящего потока :) :) – Max

+10

Я не спустил вниз. Это был кто-то еще; Я не думал, что это оправдало нисходящее движение. Имейте +1, чтобы компенсировать это. – mpen

-1

Другой (вероятно, не безопасный) способ передачи пароля использует перенаправление ввода т.е. вызова

pg_dump [params] < [path to file containing password]

+0

Что касается безопасности - этот файл должен быть доступен только для предполагаемого пользователя (пользователей); однако любой человек с правами root сможет изменить параметры безопасности и, таким образом, прочитать незашифрованный пароль. Так что да, это небезопасно ... – Tobias

+3

@Tobias есть ли альтернатива? Казалось бы, каждый, кто имеет права root, всегда может видеть пароль независимо от того, какой метод отличается от ввода пароля в интерактивном режиме (и вопрос о cron). http://www.postgresql.org/docs/9.3/static/auth-methods.html#GSSAPI-AUTH упоминает, что GSSAPI поддерживает единый вход, но не упоминает, работает ли это неинтерактивно. –

+4

Любой, кто имеет права root, также может читать .pgpass, который является рекомендуемым способом. Поэтому я не стал бы считать root доступ к угрозе безопасности. – max

4

Поправьте меня, если я ошибаюсь, но если пользователь системы такой же, как пользователь базы данных, PostgreSQL не будет запрашивать пароль - он полагается на систему для аутентификации. Это может быть вопросом конфигурации.

Таким образом, когда я хотел, чтобы владелец базы данных postgres резервировал свои базы данных каждую ночь, я мог бы создать кнтаб для этого: crontab -e -u postgres. Конечно, postgres должно быть разрешено выполнять задания cron; поэтому он должен быть указан в /etc/cron.allow, или /etc/cron.deny должен быть пустым.

+0

Ты вроде как здесь. Конфигурация Postgres по умолчанию использует аутентификацию TRUST для локальных учетных записей системы. Однако большинство производственных установок избавляются от этого блока сразу после установки РСУБД. –

105

Если вы хотите сделать это в одной команде:

PGPASSWORD="mypass" pg_dump mydb > mydb.dump 
+12

** Настройка переменной среды PGPASSWORD не является рекомендуемой практикой ** по документации (http://www.postgresql.org/docs/current/static/libpq-envars.html): _Использование этой переменной окружения не является рекомендуется по соображениям безопасности, так как некоторые операционные системы позволяют пользователям без полномочий root видеть переменные среды процесса через ps; вместо этого рассмотрим использование файла ~/.pgpass_ – bouchon

+5

. Это по-прежнему полезный комментарий. Есть много случаев развертывания, когда это по-прежнему полезно. –

+1

У меня всегда была ошибка «Ошибка аутентификации пользователя» для пользователя «имя пользователя». Решение было: PGPASSWORD = «mypass» pg_dump -U username -h localhost> mydb.dump –

36
$ PGPASSWORD="mypass" pg_dump -i -h localhost -p 5432 -U username -F c -b -v -f dumpfilename.dump databasename 
+0

Приятно, но, к сожалению, не работает для меня, я получаю «запрос не выполнен: ERROR: разрешение отклонено для отношения direction_lookup» –

+0

@ Doc вы пытались предоставить необходимые разрешения пользователю pg? –

73

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

Лучшая практика в вашем случае (повторяющиеся задачи в хрон), это не должно быть сделано из-за вопросов безопасности. Если бы не файл .pgpass, я бы сохранил строку подключения в качестве переменной среды.

export MYDB=postgresql://username:[email protected]:5432/mydatabase

то есть в вашем кронтаб

0 3 * * * pg_dump --dbname=$MYDB | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz

+0

Версия 9.1 выходов Postgre неизвестна для dbname – akohout

+0

Это было протестировано с версиями 9.4 и 9.3 на арке и RHEL соответственно. можете ли вы разместить строку соединения? конечно, анонимизировано. –

+0

Спасибо, @JosueIbarra. Успешно протестирован на PostgreSQL 9.3, Ubuntu 14.04. –

4

@Josue Александр Ибарра ответ работает на CentOS 7 и версии 9.5 если --dbname не передается.

pg_dump postgresql://username:[email protected]:5432/mydatabase 
+0

Вы правы, вот как это должно выглядеть, я думаю, что было не так несколько лет назад, это моя конфигурация оболочки. Поэтому для меня было важно использовать '--dbname' –

-3

самый простой способ, на мой взгляд, это: редактированием вам главный 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

и она работала без пароля

Смежные вопросы