Оглавление
- Исходные данные
- Скрипт бэкапа нескольких баз 1С PostgreSQL на Windows Server 2016
- Автоматизируем запуск задачи в планировщике Windows
- Полный скрипт создания резервных копий
Исходные условия
Всем привет! Вот простой рецепт автоматизации бэкапа баз 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.
Нет Ответов