Скрипт бэкапа баз 1с на ftp-сервер

Backup

Сегодня хочу предложить вам скрипт который реализовал на виртуальном сервере Windows Server 2008. Как-нибудь опишу как поднимал его на Hetzner.
Необходимо было делать полный бэкап файловых баз данных 1с с сервера расположенного в Германии на файловое хранилище к себе — ftp сервер.

Создадим скрипт в файле backup.bat.
Для начала определяем сегодняшнюю дату для подстановки в название папки и файла бэкапа (вид: годмесяцдата)

set DAT=%date:~6,4%%date:~3,2%%date:~0,2%

Почему такие значения? Если в кратце, то Если вместо %переменная% взять %переменная:~начало, длина% — получим часть строки.

Создаем папку с текущей датой т.к. баз несколько и класть все их в корень папки backup не удобно (вы можете поступить иначе).

MKDIR C:\backup\%DAT%

В качестве архиватора устанавливаем 7-zip. Команда бэкапа выглядит следующим образом:

«C:\Program Files\7-Zip\7z.exe» a -tzip -ssw -mx7 -r0 C:\backup\%DAT%\%DAT%.zip C:\db1c\BD

путь к программе — ключи — путь к паке где будут хранится бэкапы — база 1с
Поподробней об использованных ключах:
-tzip формат архива установливаем в zip
-ssw принудительная упаковка файлов, которые в данный момент открыты для записи (если пользователь не закрыл 1с);
-mx7 высокая степень сжатия (чтобы архив был поменьше, но делается подольше);
-r0 (ноль) исключения, которые могут быть прописаны дальше обрабатываются только в рабочем каталоге (напрмер можно добавить в команду -x@exclusions.txt, где прописать исключения);
Создается сжатый файл базы данных в папке с текущей датой.
Теперь его надо отправить на ftp.
Создаем новую папку C:\bat\ где будет хранится этот скрипт и вспомогательные файлы.
В командной строке доступ к ftp можно организовать с помощью команды «ftp» с переданными в текстовом файле данными. И так записываем в файл данные:

echo open <ip ftp-сервера> >C:\bat\list.txt
echo user <имя пользователя> <пароль> >>C:\bat\list.txt
echo prompt off >>C:\bat\list.txt
echo cd <папка на сервере> >>C:\bat\list.txt
echo mkdir %DAT% >>C:\bat\list.txt
echo cd %DAT% >>C:\bat\list.txt
for /f «tokens=*» %%i in ('dir /b «C:\backup\%DAT%\*.*»') do (@echo mput «C:\backup\%DAT%\%%i» >> C:\bat\list.txt)
echo disconnect>>C:\bat\list.txt
echo quit>>C:\bat\list.txt

Файл создан. Теперь подключаемся к ftp и копируем файлы на сервер

ftp -n -s:C:\bat\list.txt

По идее файлы с виртуального сервера можно удалить после их копирования на FTP с помощью команды del. Но я этого не делаю, потому что могут быть сбои при копировании файлов, тогда бэкап потеряется. Нашел выход — теперь удаляю файлы сроком более 7 дней:

forfiles /P «C:\backup» /M *.* /S /D -07 /C «cmd /c del /Q /F @PATH»

Не решил пока вопрос с удалением старых уже пустых папок с датами, но утешаю себя тем что они являются показателем того, что бекап в свое время был сделан.

Чтобы каждый день не заходить и не проверять выполнение скрипта реализуем отправку данных на почтовый ящик. Для этого использую отправщик почты SMTP через командную строку — blat.exe с https://sourceforge.net/projects/blat/. Скачиваем архив и распаковываем файл blat.exe в папку SYSTEM32 каталога Windows.
Поскольку я использую почту гугл, ставлю stunnel — прокси-сервер для добавления функции шифрования TLS.
Формируем файл с сообщением

echo backup end >C:\bat\report.txt

Указываем расположение программы blat и указываем файл с сообщением, файл для логирования

set file_blat=blat.exe
set file_text=C:\bat\report.txt
set file_log=C:\bat\log_blat.txt

Прописываем SMTP сервер для отправки сообщения:

set from_server=127.0.0.1

Порт SMTP сервера для отправки

set from_port=25

Данные пользователя от которого будет отправлено сообщение

set from_mail=майл@домен.ru

Данные пользователя от которого отправляется сообщение

set from_name=майл@домен.ru

Пароль от почтового ящика пользователя от которого отправляется сообщение

set from_pass=пароль

Электронный адрес, кому мы отправляем сообщение

set to_mail=майл@домен.ru

Тема сообщения

set to_subject=«Report»
%file_blat% %file_text% -server %from_server%:%from_port% -f %from_mail% -u %from_name% -pw %from_pass% -to %to_mail% -s %to_subject% -log %file_log%

Добавляем батник в планировщик задач.
Ждем сообщения после бэкапа.

Полный скрипт выглядит так:

set DAT=%date:~6,4%%date:~3,2%%date:~0,2%
MKDIR C:\backup\%DAT%
«C:\Program Files\7-Zip\7z.exe» a -tzip -ssw -mx7 -r0 C:\backup\%DAT%\%DAT%.zip C:\db1c\BD
echo open <ip ftp-сервера> >C:\bat\list.txt
echo user <имя пользователя> <пароль> >>C:\bat\list.txt
echo prompt off >>C:\bat\list.txt
echo cd <папка на сервере> >>C:\bat\list.txt
echo mkdir %DAT% >>C:\bat\list.txt
echo cd %DAT% >>C:\bat\list.txt
for /f «tokens=*» %%i in ('dir /b «C:\backup\%DAT%\*.*»') do (@echo mput «C:\backup\%DAT%\%%i» >> C:\bat\list.txt)
echo disconnect>>C:\bat\list.txt
echo quit>>C:\bat\list.txt
ftp -n -s:C:\bat\list.txt
forfiles /P «C:\backup» /M *.* /S /D -07 /C «cmd /c del /Q /F @PATH»
echo backup end >C:\bat\report.txt
set file_blat=blat.exe
set file_text=C:\bat\report.txt
set file_log=C:\bat\log_blat.txt
set from_server=127.0.0.1
set from_port=25
set from_mail=майл@домен.ru
set from_name=майл@домен.ru
set from_pass=пароль
set to_mail=майл@домен.ru
set to_subject=«Report»
%file_blat% %file_text% -server %from_server%:%from_port% -f %from_mail% -u %from_name% -pw %from_pass% -to %to_mail% -s %to_subject% -log %file_log%

Для локальных серверов я обычно использую Iperius Backup, но в бесплатной версии он к сожалению не умеет отправлять данные на ftp, поэтому написал скрипт. Может кто-то решил или решил бы эту задачу по другому? Делитесь в комментариях.

Wolver предлагал использовать CobianBackup. Хорошая прога , но у меня была задача создавать папки названные по текущей дате и в них уже складывать файлы архива. Вроде бы cobian это не умеет. Если умеет подскажите, где настраивать.

В статье использованы изображения с www.freedigitalphotos.net/
FavoriteLoadingДобавить в избранное

Автор публикации

не в сети 10 месяцев

il_da_r

Россия. Город: Казань
Комментарии: 2Публикации: 9Регистрация: 12-11-2016

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