Перейти к содержимому

Резервное копирование 1С баз postgreSQL на Windows Server 2016. Скрипт

Резервное копирование нескольких баз с распределением по отдельным директориям в Windows среде создадим batch-скрипт и создадим скрипт бэкапа . А далее настроем перенос полученных бэкапов на отдельное хранилище в сети с последующим удалением успешно переданных бэкапов.

Без использования стороннего софта

Бесплатно и стабильно

Используем стандартные утилиты PostgreSQL

Повышаем собственный скилл в batch

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

  1. Исходные данные
    Входные условия для автоматизации бэкапа баз 1С на PostgreSQL который установлен на Windows Server.

  2. Пишем скрипт бэкапа баз
    Разберем по косточкам скрипт бэкапа нескольких баз данных PostgreSQL.

  3. Автоматизируем запуск скрипта
    Экономим свои ресурсы и настраиваем автоматическое создание резервных копий баз данных 1C на Windows Server.

  4. Повышаем безопасность резервных копий
    Как обезопасить созданные БЭКАПы от вирусов и падения самого сервера и переносить резервные копии отдельное сетевое хранилище,

Исходные данные

Входные условия

  • PostgreSQL16 для 1С сервера стоит на Windows Server 2016.
  • Есть FTP сервер под Бэкапы.
  • Баз данных 1С – несколько.
  • Выделенный сервер: HP ProLiant DL360 GEN9 2xE5-2680v4, RAM:128 Гб, SSD 2x1TB 2.5 Sata3 за 13,5 т.р./мес
  • Необходим автоматический бэкап 1С баз на PostgreSQL.
  • Без установки сторонних программ, языков и т.п.

Итак решаем задачу посредством обычного batch–скрипта в файле с расширением .bat ну или .cmd (итак, пишем батник).

Пишем скрипт бэкапа баз данных 1С

Создаём батник в любимом Вашем текстовом редакторе или блокноте, например Notepad++.

Разберем по шагам скрипт

Установим переменные окружения и укажем где лежат исполняемые утилиты PostgreSQL, нам потребуется утилита pg_dump:

Окно терминала
CLS
ECHO OFF
CHCP 1251
SET PGBIN=C:\Program Files\PostgreSQL 1C\16\bin

Укажем, что скрипт будет запускаться локально на сервере и укажем пользователя и пароль БД, при необходимости можно задать IP сервера БД

Окно терминала
SET PGHOST=localhost
SET PGPORT=5432
SET PGUSER=postgresuser
SET PGPASSWORD=pguser_pass

Заменим строки объявления переменных на строки получения нашей пары ключей из файла <полный_путь_до файла>\.env c последующим присвоением значений соответствующим переменным:

Окно терминала
SET PGUSER=postgresuser
SET PGPASSWORD=pguser_pass
FOR /f "tokens=1,2 delims=:" %%a IN (C:\BAC\.env) DO (
SET PGUSER=%%a
SET PGPASSWORD=%%b
)

Объявим первую базу, которую будем резервировать а также переменную для счетчика:

Окно терминала
SET PGDATABASE=Base_name_1
REM Обьявим переменную для счетчика
SET I=1

Начинаем обрабатывать первую базу: перейдем в папку из которой запущен наш bat-ник и сформируем имя файла резервной копии и файла отчета с присвоением даты создания. Также будем раскладывать все бэкапы в свои подпапки SET DUMPDIR=%PGDATABASE% с именами соответствующих баз SET DUMPFILE=%PGDATABASE%%DATETIME%.sql.

Окно терминала
:Sstart
SET /a I=I+1
%~d0
CD %~dp0
SET DATETIME=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%%TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2%
SET DUMPFILE=%PGDATABASE%%DATETIME%.sql
SET DUMPDIR=%PGDATABASE%
SET LOGFILE=%PGDATABASE%_%DATETIME%.log
SET DUMPPATH="Backup\%DUMPDIR%\%DUMPFILE%"
SET LOGPATH="Logback\%LOGFILE%"

Для начала проверим, есть ли необходимые директории и если нет - создадим их. Далее переходим собственно к созданию дампа базы и лога, при этом анализируем код завершения операции.

Окно терминала
REM Создание резервной копии, создаем необходимые директории, в том числе и для Логов
IF NOT EXIST Backup MD Backup
IF NOT EXIST Backup\%DUMPDIR% MD Backup\%DUMPDIR%
IF NOT EXIST Logback MD Logback
CALL "%PGBIN%\pg_dump.exe" >=%DUMPPATH% 2>%LOGPATH%
IF NOT %ERRORLEVEL%==0 GOTO Error
GOTO Successfull

В случае получения ошибки удаляем поврежденную резервную копию и делаем соотвествующую запись в журнал.

Окно терминала
:Error
DEL %DUMPPATH%
ECHO %DATETIME% Ошибки при создании резервной копии базы данных %DUMPFILE%. Смотрите отчет %LOGFILE%. >> backup.log

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

Окно терминала
IF %I%==2 GOTO Second
IF %I%==3 GOTO Third
IF %I%==4 GOTO Fourth
IF %I%==5 GOTO Fifth
IF %I%==6 GOTO Sixth
GOTO End
:Successfull
ECHO %DATETIME% Успешное создание резервной копии %DUMPFILE% >> backup.log
IF %I%==2 GOTO Second
IF %I%==3 GOTO Third
IF %I%==4 GOTO Fourth
IF %I%==5 GOTO Fifth
IF %I%==6 GOTO Sixth
GOTO Cleaning

Присваиваем переменной имя следующей базы SET PGDATABASE=Base_name_2 и возвращаемся в начало процесса обработки (дампа) базы по метке :Sstart и так до конца перебора интересующих нас баз:

Окно терминала
:Second
SET PGDATABASE=Base_name_2
GOTO Sstart
:Third
SET PGDATABASE=Base_name_3
GOTO Sstart
:Fourth
SET PGDATABASE=Base_name_4
GOTO Sstart
:Fifth
SET PGDATABASE=Base_name_5
GOTO Sstart
:Sixth
SET PGDATABASE=Base_name_6
GOTO Sstart

Теперь проведем очистку от старых БЭКАП-ов, чтобы не дожидаться момента, когда нам просто не хватит места на диске для работы. В скрипте настроено удалять все что старше 31 дня, но следует учитывать размеры баз и их количество с учетом размеров диска, на который создаются бэкапы:

Окно терминала
:Cleaning
forfiles /p "C:\BAC\Backup" /S /D -31 /C "cmd /c del /f /a /q @file"
forfiles /p "C:\BAC\Logback" /S /D -31 /C "cmd /c del /f /a /q @file"
IF NOT %ERRORLEVEL%==0 GOTO End
ECHO %DATETIME% Очистка от старых бэкапов проведена успешно! >> backup.log

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

Окно терминала
:End

Полный вариант скрипта

Полный batch-скрипт создания резервных копий баз данных 1С на PostgreSQL с комментариями.

Окно терминала
CLS
ECHO OFF
CHCP 1251
REM Установка переменных окружения
REM Укажем где лежат исполняемые утилиты PostgreSQL нам потребуется pgdump:
SET PGBIN=C:\Program Files\PostgreSQL 1C\16\bin
REM Батник будет запускаться локально на сервере:
SET PGHOST=localhost
SET PGPORT=5432
REM Укажем пользователя и пароль пользователя в Postgres, взяв пару ключей из отдельного файла .env с указанием пути до него
FOR /f "tokens=1,2 delims=:" %%a IN (C:\BAC\.env) DO (
SET PGUSER=%%a
SET PGPASSWORD=%%b
)
REM Укажем первую базу, которую будем резервировать:
SET PGDATABASE=Base_name_1
REM Объявим переменную для счетчика
SET I=1
:Sstart
SET /a I=I+1
REM Смена диска и переход в папку из которой запущен bat-файл
%~d0
CD %~dp0
REM Формирование имени файла резервной копии и файла-отчета
SET DATETIME=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%_%TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2%
SET DUMPFILE=%PGDATABASE%_%DATETIME%.sql
SET DUMPDIR=%PGDATABASE%
SET LOGFILE=%PGDATABASE%_%DATETIME%.log
SET DUMPPATH="Backup\%DUMPDIR%\%DUMPFILE%"
SET LOGPATH="Logback\%LOGFILE%"
REM Создание резервной копии, создаем необходимые директории, в том числе и для Логов
IF NOT EXIST Backup MD Backup
IF NOT EXIST Backup\%DUMPDIR% MD Backup\%DUMPDIR%
IF NOT EXIST Logback MD Logback
CALL "%PGBIN%\pg_dump.exe" >=%DUMPPATH% 2>%LOGPATH%
REM Анализ кода завершения
IF NOT %ERRORLEVEL%==0 GOTO Error
GOTO Successfull
REM В случае ошибки удаляется поврежденная резервная копия и делается соответствующая запись в журнале
:Error
DEL %DUMPPATH%
REM MSG * "Ошибка при создании резервной копии базы данных. Смотрите backup.log."
ECHO %DATETIME% Ошибки при создании резервной копии базы данных %DUMPFILE%. Смотрите отчет %LOGFILE%. >> backup.log
IF %I%==2 GOTO Second
IF %I%==3 GOTO Third
IF %I%==4 GOTO Fourth
IF %I%==5 GOTO Fifth
IF %I%==6 GOTO Sixth
GOTO End
REM В случае удачного резервного копирования просто делается запись в журнал
:Successfull
ECHO %DATETIME% Успешное создание резервной копии %DUMPFILE% >> backup.log
IF %I%==2 GOTO Second
IF %I%==3 GOTO Third
IF %I%==4 GOTO Fourth
IF %I%==5 GOTO Fifth
IF %I%==6 GOTO Sixth
GOTO Cleaning
:Second
SET PGDATABASE=Base_name_2
GOTO Sstart
:Third
SET PGDATABASE=Base_name_3
GOTO Sstart
:Fourth
SET PGDATABASE=Base_name_4
GOTO Sstart
:Fifth
SET PGDATABASE=Base_name_5
GOTO Sstart
:Sixth
SET PGDATABASE=Base_name_6
GOTO Sstart
:Cleaning
forfiles /p "C:\BAC\Backup" /S /D -31 /C "cmd /c del /f /a /q @file"
forfiles /p "C:\BAC\Logback" /S /D -31 /C "cmd /c del /f /a /q @file"
IF NOT %ERRORLEVEL%==0 GOTO End
ECHO %DATETIME% Очистка от старых бэкапов проведена успешно! >> backup.log
:End

Все что Вам остается, это заменить имя пользователя postgresuser базы PostgreSQL, его пароль pguser_pass, и имена баз данных (Base_name_1)

Автоматизация запуска скрипта по времени

Ставим задачу в планировщик задач.

Запускаем планировщик:

Пуск – Панель Управления – Администрирование – Планировщик заданий.

Создаем задачу -> Задаем ей имя в планировщике

New job in windows

и устанавливаем триггеры (расписание начала задачи). Я ставлю еженедельно задачу в рабочие дни ночью.

New job in windows

Далее указываем Действие: Создать -> программу сценарий: (находим нашу программу) run_backup.cmd жмем Ок.

New job in windows

Всё, наш Скрипт создан и установлен в планировщик Windows. Осталось проверить его работоспособность: прямо в планировщике задач выбираем нашу задачу и вызвав правой кнопкой мыши контекстное меню, выбираем “Запустить” – далее смотрим результат. радуемся жизни или анализируем причины записи ошибок в лог.

New job in windows

Повышаем безопасность бэкапов

Подробнее о том, как организовать перенос бэкапов баз данных на удаленные сетевые хранилища:

Улучшайте Ваши IT-инструменты

Когда резервные копии наших баз данных 1С на сервере PostgreSQL под Windows Server создаются, укладываются по своим директориям и радуют глаз, стоит задуматься над тем, чтобы обезопасить эти БЭКАПы от вирусов и падения самого сервера. А значит есть смысл организовать БЭКАП-сервер на отдельном железе и переносить резервные копии туда, либо использовать другие сетевые хранилища.