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

Оглавление

  1. Исходные данные
  2. Скрипт бэкапа нескольких баз 1С PostgreSQL на Windows Server 2016
  3. Автоматизируем запуск задачи в планировщике Windows
  4. Полный скрипт создания резервных копий

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

Всем привет! Вот простой рецепт автоматизации бэкапа баз 1С на PostgreSQL который установлен на Windows Server.
Казалось бы в чем проблема? – скриптов на резервное копирование базы в постгресс полно, очень много раз разбирали этот вопрос, НО в основном все для linux-серверов и готового решения по своим вопросам я не нашел. В итоге написал свой скрипт.

Входные условия просты:

  • PostgreSQL14 для 1С сервера стоит на Windows Server 2016.
  • Есть FTP сервер под Бэкапы
  • Баз – несколько.
  • Железный сервер: Intel Xeon 2xE5-2667v2 (3.3ггц) , 16 core, RAM 96Гб, 2×500 Gb SSD за 14т.р./мес
  • Необходим автоматический бэкап 1С баз на PostgreSQL.
  • Не хотелось бы ставить сторонние программы, языки и т.п. Я понимаю, что это все можно решить на php, Python и д.р.

Я решил все сделать посредством обычного Batch script – скрипта в файле с расширением .bat ну или .cmd (Пишем батник) 😉

1 Шаг. Скрипт бэкапа нескольких баз 1С PostgreSQL на Windows Server 2016

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

Разберем по косточкам скрипт:

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

CLS
ECHO OFF
CHCP 1251
SET PGBIN=C:\Program Files\PostgreSQL 1C\14\bin

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

SET PGHOST=localhost
SET PGPORT=5432
SET PGUSER=postgresuser
SET PGPASSWORD=pguser_pass

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

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

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

: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%"

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

IF NOT EXIST Backup MD Backup
IF NOT EXIST Backup\%DUMPDIR% MD Backup\%DUMPDIR%
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

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

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

В случае удачного резервного копирования просто делается запись в журнал.

: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

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

:End

2 Шаг. Автоматизируем запуск задачи в планировщике Windows

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

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

создаем задачу -> Задаем ей имя в планировщике и устанавливаем триггеры (расписание начала задачи). Я ставлю еженедельно задачу в рабочие дни ночью.

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

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

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

Привожу для удобства 🙂

CLS
ECHO OFF
CHCP 1251
REM Установка переменных окружения
REM Укажем где лежат исполняемые утилиты PostgreSQL нам потребуется pgdump:
SET PGBIN=C:\Program Files\PostgreSQL 1C\14\bin
REM Батник будет запускаться локально на сервере:
SET PGHOST=localhost
SET PGPORT=5432
REM Укажем пользователя и пароль пользователя в Postgres
SET PGUSER=postgresuser
SET PGPASSWORD=pguser_pass
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%
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_1
GOTO Sstart
:Cleaning
forfiles /p "C:\Backup\Backup" /S /D -31 /C "cmd /c del /f /a /q @file"
forfiles /p "C:\Backup\Logback" /S /D -31 /C "cmd /c del /f /a /q @file"
IF NOT %ERRORLEVEL%==0 GOTO End
ECHO %DATETIME% Очистка от старых бэкапов проведена успешно! >> backup.log
:End

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

Для переноса бэкапов баз 1С на ftp-сервер воспользуемся отличной утилитой rsync, а как настроить rsync на Windows Server рассмотрим в новой статье Автоматическое резервное копирование с Windows Server.

Нет Ответов

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *