Системные администраторы делятся на тех, кто не делает бэкапы, и тех, кто УЖЕ делает...
Мой самописный "велосипед", который можно использовать для архивации данных на локальный диск и на файловый сервер (по SMB, в расшаренный каталог на сервере). Дополнительных программ устанавливать не нужно, используется portable версия 7zip, виндовая утилита robocopy и консольный почтовый клиент Zerat (для отправки уведомлений). Всё находится в одном каталоге со скриптами и просто копируется на целевой компьютер, без процедуры установки.
Для отправки уведомлений клиентом Zerat в локальной сети установлен почтовый сервер iRedMail.
Для начала нужно создать каталог, в котором будут размещаться программные и текстовые файлы пакета. Предположим, C:\programs\cmd. В нём будут находиться:
[7-ZipPortable] - каталог с portable-версией архиватора 7zip.
[zerat] - каталог с консольным клиентом Zerat, для отправки уведомлений по электронной почте.
[files] - внутри каталога zerat каталог с текстовыми файлами конфигураций отправляемых писем. Формируются автоматически скриптом arhive1.cmd при первом запуске. При необходимости можно изменить текст вручную, так как проверяется только существование этих файлов.
arhive.cmd - стартовый скрипт, который отключает терминальные сессии, закрывает экземпляры 1С и запускает следующий скрипт, выполняющий всю работу.
arhive1.cmd - скрипт, вызываемый из стартового, собственно, в нём вся программная часть.
name_list.txt - файлы-списки для архивации, содержат списки каталогов, файлов или масок для архивации. В моём случае - каталогов с базами 1С, которые необходимо архивировать.
ren_list.txt - файл-список, содержащий полные пути к лог-файлам, по одному на строку. Используется в процедуре ротации логов, чтобы они не пухли безразмерно.
xlist.txt - файл-список исключений для архивации, содержит список того, что не нужно включать в архив.
Содержимое стартового скрипта arhive.cmd:
@ECHO OFFecho y | logoff rdp-tcptimeout /T 60TASKKILL /T /F /IM 1cv8.exetimeout /T 60CALL %~dp0\arhive1.cmd plitkaCALL %~dp0\arhive1.cmd stroy:ENDЧто здесь к чему.
echo y | logoff rdp-tcp отключает все терминальные сессии к данному серверу. Если не нужно, то можно удалить или закомментировать.timeout /T 60 - пауза (в секундах) на всякий случай, чтобы всё закрылось.CALL %~dp0\arhive1.cmd plitka - вызов основного скрипта. Передаваемый параметр (plitka, stroy) это условное название архивируемой базы, оно же будет использоваться в имени создаваемого архива и в имени файла-списка для архивации.Содержимое скрипта:
@ECHO OFFSETLOCALREM ===== Установка переменных =====REM Расположение командных и программных файлов:SET PROGPATH=C:\programs\cmdSET ZIP=%PROGPATH%\7-ZipPortable\App\7-Zip\7z.exeREM Каталог, в котором будет храниться архив:SET ARCHPATH=C:\Arhiv\%1REM Временный каталог, который будет использоватьсяREM в процедуре ротации архивовREM Каталог должен находиться на одном диске с каталогом архива,REM тогда перемещение будет мгновенным.SET TMPDIR=c:\tempSET TMPFILE=%PROGPATH%\arhrotation.txtSET TMPFILE2=%PROGPATH%\arhrotation2.txtREM Сколько дней хранить архивы (уровень хранения):SET LEVEL=5REM Префикс имени архива (с путём)REM %1 - имя архивируемой базы (Stroy, Plitka или любое другое)REM передаётся при вызове из головного файла arhive.cmd,REM дата и время будут добавлены при создании архива:SET ARCHNAME=%ARCHPATH%\%1REM Файл лога:SET LOG=%ARCHPATH%\%1.logSET LOG1=%1.logREM Расположение файла-списка для архивацииSET LIST=%PROGPATH%\%1_list.txtREM Расположение файла-списка исключений для архивацииSET XLIST=%PROGPATH%\xlist.txt REM Установка количества попыток подключения сетевого дискаSET TRY=20REM Формирование переменных, содержащих время и датуREM Нужно для именования архивов и ротацииSET NOW=%DATE:~-4%%DATE:~3,2%%DATE:~0,2%SET DAY=%DATE:~0,2%SET /a DAY_BEGIN=%DAY%-1SET DATE_BEGIN=%DATE:~-4%%DATE:~3,2%%DAY_BEGIN%REM Переменную TIMESTAMP приходится выставлять, проверяя условиеREM В утренние часы, когда присутствует лидирующий ноль (04:30, например),REM на самом деле подставляется пробел ( 4:30).REM Поэтому приходится это проверять и, при необходимости, подставлятьREM этот ноль самостоятельно.SET UTRO=%TIME:~0,1%IF "%UTRO%" == " " ( SET TIMESTAMP=%DATE:~-4%%DATE:~3,2%%DATE:~0,2%-0%TIME:~1,1%%TIME:~3,2%) ELSE ( SET TIMESTAMP=%DATE:~-4%%DATE:~3,2%%DATE:~0,2%-%TIME:~0,2%%TIME:~3,2%)REM Установка переменных для работы системы оповещения по эл. почте:SET ZERAT=%PROGPATH%\zerat\zerat.exeSET ZERAT_FILES=%PROGPATH%\zerat\filesSET MAILLIST=%ZERAT_FILES%\maillist.txtSET SMTPSENDER=sender@mydomain.ru SET SMTPSERVER=mail.mydomain.ruSET SMTPPORT=25 SET SMTPUSER=sender@mydomain.ru SET SMTPPWD=password SET CODEPAGE=Windows-1251REM Проверка и создание, при необходимости, файлов, необходимых для работыREM системы оповещения по эл. почтеIF NOT EXIST %ZERAT_FILES%\%1_error.txt ( ECHO SMTPHOST:mail.mydomain.ru:25 >> %ZERAT_FILES%\%1_error.txt ECHO FROM:Sender ^<sender@mydomain.ru^> >> %ZERAT_FILES%\%1_error.txt ECHO TO:Admin ^<admin@mydomain.ru^> >> %ZERAT_FILES%\%1_error.txt ECHO SUBJECT:Error of Backup of 1C %1. >> %ZERAT_FILES%\%1_error.txt ECHO SMTPAuth:LOGIN >> %ZERAT_FILES%\%1_error.txt ECHO SMTPUSER:sender@mydomain.ru >> %ZERAT_FILES%\%1_error.txt ECHO SMTPPASS:password >> %ZERAT_FILES%\%1_error.txt ECHO CHARSET:Windows-1251 >> %ZERAT_FILES%\%1_error.txt ECHO Unsuccessfully completed to creation backup copy of the database 1C %1. >> %ZERAT_FILES%\%1_error.txt ECHO Backup file not finded on Z: disk. >> %ZERAT_FILES%\%1_error.txt ECHO Check your backup procedure. >> %ZERAT_FILES%\%1_error.txt)IF NOT EXIST %ZERAT_FILES%\%1_success.txt ( ECHO SMTPHOST:mail.mydomain.ru:25 >> %ZERAT_FILES%\%1_success.txt ECHO FROM:Sender ^<sender@mydomain.ru^> >> %ZERAT_FILES%\%1_success.txt ECHO TO:Admin ^<admin@alcoplus2.ru^> >> %ZERAT_FILES%\%1_success.txt ECHO SUBJECT:Backup of 1C %1. >> %ZERAT_FILES%\%1_success.txt ECHO SMTPAuth:LOGIN >> %ZERAT_FILES%\%1_success.txt ECHO SMTPUSER:sender@mydomain.ru >> %ZERAT_FILES%\%1_success.txt ECHO SMTPPASS:passwors >> %ZERAT_FILES%\%1_success.txt ECHO CHARSET:Windows-1251 >> %ZERAT_FILES%\%1_success.txt ECHO Successfully completed to creation backup copy of the database 1C %1. >> %ZERAT_FILES%\%1_success.txt ECHO Backup file is on Z: disk. >> %ZERAT_FILES%\%1_success.txt))IF NOT EXIST %ZERAT_FILES%\maillist.txt ( ECHO admin@mydomain.ru >> %ZERAT_FILES%\maillist.txtREM ECHO user1@mydomain.ru >> %ZERAT_FILES%\maillist.txtREM ECHO user2@mydomain.ru >> %ZERAT_FILES%\maillist.txt)REM Каталог на сервере, в котором будут храниться архивы,REM считая от базового каталога \\192.168.0.1\backup\SET PATH_ON_SERVER=test\%1REM ==== Программная часть ====REM При первом запуске автоматически будет создан каталог, в который будет выполняться архивация.REM И временный каталог для ротации файлов архиваREM Если они не существуют.IF NOT EXIST %ARCHPATH% MD %ARCHPATH%IF NOT EXIST %TMPDIR% MD %TMPDIR%IF NOT EXIST %TMPDIR%\1 MD %TMPDIR%\1IF NOT EXIST %TMPDIR%\2 MD %TMPDIR%\2REM Запись в лог-файл времени начала архивацииECHO ========================== >> %LOG%ECHO Start backup at >> %LOG%DATE /T >> %LOG%TIME /T >> %LOG%REM Собственно, архивация данных выполняется этой командой.%ZIP% a -t7z -r %ARCHNAME%-%TIMESTAMP% @%LIST% -x@%XLIST% -scsWINREM Ротация файлов архивов, чтобы не копились до бесконечности.MOVE %ARCHPATH%\*.7z %TMPDIR%\1\DIR %TMPDIR%\1 /a-d /b /o-d > %TMPFILE%CALL :ARHROTATION %LEVEL% %TMPFILE%REM Подключение сетевого диска:CONNECTNET USE Z: /d /yFOR /L %%N IN (1,1,%TRY%) DO ( IF NOT EXIST Z:\nul ( NET USE Z: \\192.168.0.1\backup\%PATH_ON_SERVER% /user:username userpassword /persistent:no ECHO Disk Z: connected sucsessfully! >> %log% ) ELSE ( ECHO Disk Z: already connected! >> %log% GOTO EXIT01
)):EXIT01REM На сервер имеет смысл копировать только самый свежий архив,REM т.к. предыдущие там уже должны быть.REM Имя искомого архива формируется так:REM %1-%NOW%-*.7zREM %1 - входной параметр этого .cmd файла, имя архивируемой базыREM %NOW% - сегодняшняя датаREM * - всё, что после даты, т.е. время создания архива, в данном случае игнорируетсяREM Копирование архива на сервер (синхронизация каталогов, если быть точным)%PROGPATH%\robocopy %ARCHPATH% Z:\ /MIR /E /Z /R:100 /TBDREM Проверка существования архива на сервере и отправка уведомлений по почтеIF EXIST "Z:\%1-%NOW%-*.7z" ( ECHO File exist CALL :SENDMSG %ZERAT_FILES%\%1_success.txt) ELSE ( ECHO File not exist CALL :SENDMSG %ZERAT_FILES%\%1_error.txt)REM Отключение сетевого дискаNET USE Z: /d /yREM Запись в лог-файл времени окончания архивацииECHO End backup at >> %LOG%DATE /T >> %LOG%TIME /T >> %LOG%REM Ротация логовREM Запускается только по первым числам месяцаIF %DAY% == 01 CALL :LOGROTATIONGOTO ENDREM =========== FUNCTIONS ============REM ===== Begin ARHROTATION function =====:ARHROTATIONREM http://forum.script-coding.com/viewtopic.php?id=7493:: Вывод n первых строк файла:::: Использование::: head n filename:::: Пример::: head 10 %windir%\System32\drivers\etc\hosts:: Необходим временный файл для хранения n номеров первых строк в виде "[n]"(for /l %%n in ( 1, 1, %~1 ) do ( echo.[%%n]))>"%TEMP%\$$$head.txt":: нумеруем каждую строку:: ищем только строки с заданным номером и выводим эти строки:: по окончании временный файл удаляемfor /f "tokens=1,* delims=]" %%n in ( 'find /n /v "" "%~2" ^| findstr /b /l /g:"%TEMP%\$$$head.txt" ^&^& del "%TEMP%\$$$head.txt"') do ( echo.%%o >> %TMPFILE2%)FOR /F %%f in ('TYPE %TMPFILE2%') DO (MOVE %TMPDIR%\1\%%f %TMPDIR%\2)DEL /F /Q %TMPDIR%\1\*.*MOVE %TMPDIR%\2\*.* %ARCHPATH%DEL %TMPFILE2%EXIT /bREM ===== End ARHROTATION function =====REM ===== Begin SENDMSG function =====:SENDMSG%ZERAT% %1EXIT /bREM ===== End SENDMSG function =====REM ===== Begin LOGROTATION function =====:LOGROTATIONIF NOT EXIST %LOG% EXIT /bIF EXIST %LOG%.bak DEL %LOG%.bakIF EXIST %LOG% ( CD %ARCHPATH% REN %LOG% %LOG1%.bak )EXIT /bREM ===== End LOGROTATION function =====REM =========== END FUNCTIONS ============:ENDЗдесь всё достаточно подробно прокомментировано в самом скрипте.
Перед первым запуском нужно проверить и правильно задать все переменные, определяемые в начале скрипта - пути и имена файлов.
SET PROGPATH=C:\programs\cmd задаётся путь к каталогу, в котором расположен весь пакет программ и скриптов, всё остальное пляшет от него.SET ARCHPATH=C:\Arhiv\%1 задаётся каталог, в котором будет храниться архив. Параметр %1 передаётся из стартового скрипта при вызове, в данном примере plitka, stroy. В принципе, каталог этот создастся автоматически при первом запуске скрипта, если его не существует. Но лучше, наверное, всё же создать ручками, на всякий случай.SET TMPDIR=c:\temp задаётся временный каталог, в котором будет проводиться ротация архивов. Опять же, создастся автоматически, если не существует, но можно и ручками. Внутри каталога нужно ещё создать каталоги 1 и 2. Ну, или пустить всё на самотёк. Файлы TMPFILE=%PROGPATH%\arhrotation.txt и TMPFILE2=%PROGPATH%\arhrotation2.txt создаются автоматически в процессе работы скрипта.SET LIST=%PROGPATH%\%1_list.txt определяется имя файла-списка для архивации. Параметр %1 передаётся при вызове файла (plitka, stroy). Файл заполняется вручную, каждая строка содержит путь к архивируемому каталогу (например, c:\1c\Plitka\* для архивации всех файлов из каталога c:\1c\Plitka). Файл должен быть в кодировке Windows-1251, иначе кириллические имена не будут распознаны.SET XLIST=%PROGPATH%\xlist.txt задаётся файл-список исключений для архивации. Можно указывать как маски файлов, так и каталоги, по одному исключению на строку. Например, так:SET XLIST=%PROGPATH%\%1_xlist.txt, тогда надо будет создавать несколько таких файлов. SET PATH_ON_SERVER=test\%1, нужно создать заранее, до архивации, и корректно настроить доступ к ним.Для работы скрипта используются текстовые файлы-списки, уже упомянутые выше. Приведу текст файлов из примера.
plitka_list.txt:
c:\1c\Plitka\*
stroy_list.txt:
c:\1c\Stroy\*
xlist.txt:
*.cdx
test\*.*
Robocopy - входит в состав Windows, начиная с Windows Vista