Назад | Перейти на главную страницу

простой скрипт для резервного копирования базы данных PostgreSQL

Здравствуйте, я пишу простой пакетный скрипт для резервного копирования баз данных postgeSQL, но я обнаружил одну странную проблему: pg_dump команда может указать пароль?

Есть пакетный скрипт:

 REM script to backup PostgresSQL databases
 @ECHO off

 FOR /f "tokens=1-4 delims=/ " %%i IN ("%date%") DO (

 SET dow=%%i
 SET month=%%j
 SET day=%%k
 SET year=%%l
 )

 SET datestr=%month%_%day%_%year%
 SET db1=opennms
 SET db2=postgres
 SET db3=sr_preproduction
 REM SET db4=sr_production

 ECHO datestr is %datestr%

 SET BACKUP_FILE1=D:\%db1%_%datestr%.sql
 SET FIlLENAME1=%db1%_%datestr%.sql

 SET BACKUP_FILE2=D:\%db2%_%datestr%.sql
 SET FIlLENAME2=%db2%_%datestr%.sql

 SET BACKUP_FILE3=D:\%db3%_%datestr%.sql
 SET FIlLENAME3=%db3%_%datestr%.sql

 SET BACKUP_FILE4=D:\%db14%_%datestr%.sql
 SET FIlLENAME4=%db4%_%datestr%.sql

 ECHO Backup file name is %FIlLENAME1% , %FIlLENAME2% , %FIlLENAME3% , %FIlLENAME4%

 ECHO off
 pg_dump -U postgres -h localhost -p 5432 %db1%  > %BACKUP_FILE1%
 pg_dump -U postgres -h localhost -p 5432 %db2%  > %BACKUP_FILE2%
 pg_dump -U postgres -h localhost -p 5432 %db3%  > %BACKUP_FILE3%
 REM pg_dump -U postgres -h localhost -p 5432 %db4%  > %BACKUP_FILE4%

 ECHO DONE !

Пожалуйста, дайте мне совет

С уважением, Мик

Вы не можете указать пароль для таких утилит Postgres, как pg_dump в командной строке.
Это было бы гигантская дыра в безопасности, требующая отвратительных обходных путей для смягчения.

Что ты ЖЕСТЯНАЯ БАНКА делать это создать pgpass файл, который pg_dump проконсультирую.

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

Спасибо за ваш cmd-скрипт. Я использовал его, чтобы написать свой собственный, как показано ниже. Он создаст резервную копию всех баз данных, хранящихся в postgresql, в файл, отформатированный в пользовательском формате, используемом pg_dump, с датой yyyymmdd_hhss во имя. Задача: резервное копирование полной схемы без данных.

Имя базы данных хранится в %%d переменная в цикле. Вы можете смело менять:

  • "backup_data_dir" (должен заканчиваться)
  • "pg_user" (по умолчанию postgres)
  • "pg_bin_dir" (должно заканчиваться)

Внимание: я француз. дд / мм / гггг для% date%, «DEBUT» для «START», «F I N» для «E N D».

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET backup_data_dir=C:\path\to\backup\
SET backup_file_name=%COMPUTERNAME%.%date:~6,4%%date:~3,2%%date:~0,2%_%time:~0,2%%time:~3,2%.PGDMP
SET pg_user=--username=postgres
SET pg_dmp_option=--clean %pg_user% --format=custom
SET pg_lst_db=psql.exe %pg_user% --list --field-separator=^; --tuples-only --no-align
SET pg_bin_dir=C:\Program Files\PostgreSQL\9.6\bin\

CD /D %pg_bin_dir%
FOR /f "delims=; tokens=1" %%d IN ('!pg_lst_db!^| find ";"^|find /v "template0"') DO (
  @ECHO !date! !time! pg_dump de la base [%%d] --- DEBUT ---
  SET backup_file_name=%%d.%backup_file_name%
  SET pg_dmp_option=%pg_dmp_option% --file="%backup_data_dir%!backup_file_name!" --dbname=%%d
  pg_dump.exe !pg_dmp_option!
  ECHO !date! !time! pg_dump de la base [%%d] --- F I N ---
)

Вы также можете создать специального пользователя, ограниченного локальным хостом и с ограниченными привилегиями, который может подключаться без пароля. (Например, пользователь unix).

Мы использовали это, и если пользователь хорошо защищен, это не нарушит безопасность.