При настройке автоматического резервного копирования баз данных PostgreSQL с помощью консольной утилиты pg_dump.exe часто возникает проблема: утилита останавливает выполнение скрипта и запрашивает ввод пароля пользователя СУБД. Это делает невозможным запуск копирования по расписанию через Планировщик задач (Task Scheduler) Windows. Рассмотрим подробнее, как обойти этот запрос и передать авторизационные данные автоматически.
Разберем наиболее простой и распространенный способ решения задачи. Перед вызовом утилиты pg_dump.exe в командном файле можно задать переменные окружения PGUSER и PGPASSWORD. Сессионные переменные считываются консольным клиентом PostgreSQL автоматически, благодаря чему окно ввода пароля не появляется.
Посмотрим на пример командного файла (backup.cmd):
SET PGUSER=postgres
SET PGPASSWORD=ВашПароль
"C:\Program Files\PostgreSQL\9.6.3-3.1C\bin\pg_dump.exe" -h localhost -p 5432 -U postgres -F c -b -v -f "D:\Backup\PG\Buh_baza_%DATE%.backup" Buh_baza
В данном примере применяются важные параметры утилиты pg_dump:
pg_restore.>.Обратите внимание на безопасность: хранение открытого пароля в файлах скриптов несет риски безопасности, так как пароль может быть прочитан сторонними пользователями системы или отображен в списке процессов.
Для более безопасного хранения учетных данных в ОС Windows целесообразно использовать специальный файл конфигурации паролей. PostgreSQL умеет автоматически искать учетные данные в файле pgpass.conf, расположенном в каталоге профиля пользователя.
Выясним, как правильно создать и настроить данный файл:
%APPDATA%\postgresql\ (например, C:\Users\Administrator\AppData\Roaming\postgresql\).pgpass.conf.
сервер:порт:база_данных:имя_пользователя:пароль
Пример содержимого файла для локального сервера:
localhost:5432:Buh_baza:postgres:МойНадежныйПароль
Если требуется разрешить подстановку для любых баз или портов, можно использовать маску со звездочкой *:
localhost:5432:*:postgres:МойНадежныйПароль
При запуске резервного копирования от имени службы или через системную учетную запись (SYSTEM) стандартный путь %APPDATA% может быть недоступен. В таком случае в самом скрипте зададим путь к файлу паролей с помощью переменной PGPASSFILE:
SET PGPASSFILE=C:\scripts\pgpass.conf
"C:\Program Files\PostgreSQL\9.6.3-3.1C\bin\pg_dump.exe" -h localhost -p 5432 -U postgres -F c -f "D:\Backup\Buh_baza.backup" Buh_baza
Проанализируем дополнительные способы и лучшие практики организации бекапов СУБД PostgreSQL, особенно при работе с информационными базами 1С:
-w: Чтобы скрипт не зависал неограниченно долго при сбоях авторизации в фоновом режиме, рекомендуется добавлять флаг -w (--no-password). В этом случае утилита сразу завершит работу с ошибкой, если пароль не был получен из переменных окружения или pgpass.conf.> D:\Backup\backup.log 2>&1. Это позволит оперативно диагностировать возможные ошибки выполнения.pg_dump создаёт дамп только одной конкретной базы данных. Глобальные объекты СУБД (пользователи, роли и их права) в дамп не попадают. Для их сохранения периодически выполняйте команду:
"C:\Program Files\PostgreSQL\9.6.3-3.1C\bin\pg_dumpall.exe" -U postgres --roles-only > D:\Backup\roles.sql
-F c может выполняться очень долго. В таких случаях выгрузку ускоряют использованием формата каталога (-F d) с многопоточным выполнением через параметр -j (число параллельных потоков), либо переходят на механизмы физического резервного копирования (утилита pg_basebackup, инструменты WAL-G или pgBackRest).