вторник, 5 мая 2009 г.

batch-backup обновлено

Сегодня я расскажу о том как я создал скрипт резервного копирования используя bat и 7z.

Так как я не был знаком с синтаксисом bat, за поисками я отправился к google и к cmd help. Попробовал написать простенький скрипт записывающий имя целевого диска и меняющий текущий диск на целевой:
SET DRIVEFROM = M:
%DRIVEFROM%
Не работает, думал может быть проблема в скрипте и я что-то не так понял. Оказалось мое "вежливое программирование" подвело меня, после "=" не должно быть пробелов.

Дальше так:

  1. Архивировать папку
  2. Удалить более старые версии архивов
попытаемся расчленить дату:
SET CURDATE=%date:~-4%-%date:~-7,2%-%date:~-10,2%

как видим работаем словно со строками
отлично, теперь можно архивировать

"c:\program files\7-zip\7z" a -r -ssw -tzip -mx5 -x!*.cdx %PATHTO%\%NAMEFILE%%CURDATE% %PATHFROM%\*.*

Здесь:



a - добавить в архив

-r - рекурсивно (вместе с каталогами)

-ssw - копировать открытые на чтение

-tzip - тип архива zip

-mx5 - тип сжатия x5 близка к предельному

-x!*.cdx - пропускать cdx файлы (1с хранит индексы в них)

-i - использовать файл-лист
-w - где разместить временные файлы

Ну и осталось почистить старые файлы. Сначала мы должны выяснить нижнюю границу:
вот тут я нашел как это сделать при помощи VBScript, конечно же можно было создать другой bat-файл который вычитает нужное количество дней из текущего, но мне показалось это слишком громоздким.
получаем дату следующим образом:
в файл "getDate.vbs" запишем

wscript.echo date-30

теперь получить дату можно с помощью:

FOR /F %%A IN ('cscript tmp.vbs //Nologo') DO SET "OLDDATE=%%A"

очищаем старые файлы:

%DRIVE2%
CD %PATHTO%
FOR %%P IN (*.*) DO (
  IF /I %NAMEFILE%%OLDDATE%.zip GTR %%P del %%P
  )

ECHO backup succesfuly created
ECHO on

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

Файл getDate.vbs

wscript.echo date-30

файл backup.bat

ECHO off
rem DRIVE1 это диск откуда копирую
SET DRIVE1=%1
rem DRIVE2 это диск куда копирую
SET DRIVE2=%2
rem PATHFROM папка которую архивируем
SET PATHFROM=%DRIVE1%\Paradis
rem PATHTO папка куда архивируем
SET PATHTO=%DRIVE2%
SET NAMEFILE=%3

SET CURDATE=%date:~-4%-%date:~-7,2%-%date:~-10,2%

FOR /F %%A IN ('cscript getDate.vbs //Nologo') DO SET "OLDDATE=%%A"

rem меняем диск, чтобы проверить вобще есть ли тот каталог который нужно архивировать
%DRIVE1%
rem собственно проверка
IF NOT EXIST %PATHFROM% (
  ECHO directory "%PATHFROM%" not found
  pause
  EXIT 1
  )

rem меняем диск, на диск назначения
%DRIVE2%
rem проверяем наличие каталога сохранения, если нет то создаем
IF NOT EXIST %PATHTO% md %PATHTO%

rem меняем диск, и создаем копию
%DRIVE1%
"c:\program files\7-zip\7z" a -r -ssw -tzip -mx5 -x!*.cdx %PATHTO%\%NAMEFILE%%CURDATE% %PATHFROM%\*.*
rem если по каким-то причинам не удалось создать файл выходим громко ругаясь
IF NOT EXIST %PATHTO%\%NAMEFILE%%CURDATE%.zip (
  ECHO copy not created!!!
  pause
  exit 1
  )

rem удаляем файлы старше 1 месяца
%DRIVE2%
CD %PATHTO%
FOR %%P IN (*.*) DO (
  IF /I %NAMEFILE%%OLDDATE%.zip GTR %%P del %%P
  )

echo backup succesfuly created


Как написал Dron можно сделать так:

 
%run_7z% a %baseArch% -w%tmpDir% -ir@%IncludeList% -ssw -slp -mmt=on -mx3 -ms=off -scsWIN %file_save% >> %Log%

PS: немного позже я разобрался как эту же операцию выполнить при помощи VBScript, но статью я уже начал писать, и бросать не хотелось.

PSS: Спустя почти три месяца, я вновь вернулся к данной проблеме, на этот раз нужно сохранять базу данных postgresql и папку upload мегаплана.

скрипт практически не менял.

12 комментариев:

  1. Познавательная статья. Причуды консольного интерпритатора windows всегда развлекали. Вот помню в молодости писал на батниках интреактивные приложения, которые чего-то у пользователя выпытывали :). Эх времена были. А для бекапа в винде есть стандартный инструмент.. ну это я так помню. Ему задаёшь файлы, расписание, он и бекапит :) или путаю что-то?

    ОтветитьУдалить
  2. Эм :) и ещё ежели по существу :) надо пусть до 7z вынести в отдельную переменную, объявляемую в начале скрипта, просто для удобства - а вдруг в другое место переставишь? да и проверять нужно. стоит этот самы архиватор или нет.

    ОтветитьУдалить
  3. наличие архиватора предпологается.
    можно и в переменную вынести. Скрипт писался под конкретную машину, для конкретной задачи. Скоро возможно на VBS перепишу (в конечном счете оказалось что необходимо архивировать не одну базу, а целый список)

    да в винде есть какая-то система для архивирования (воспоминания курса "администрирование" подсказывает), но как ты помнишь он делает backup полностью всей системы на которых стоит метка "Архивный", или я что-то путаю.

    ОтветитьУдалить
  4. нет, Сергей ты ошибаешься. Виндовый ntbackup может делать бэкап тех файлов которые ты укажешь.
    Иммет интерфейс командной строки. У меня на работе он достаточно эффективно справляется со своими обязанностями. Бэкапит около 500ГБ за месяц. Я пользуюсь связкой ntbackup + nncron как шедулер.

    ОтветитьУдалить
  5. ну вот, можно удалять пост :(
    даже при необходимости файлы посмотреть можно

    ОтветитьУдалить
  6. с появлением windows server 2008 тема вновь актуальна - там резервное копирование отдельных файлов отсутствует

    ОтветитьУдалить
  7. ура :)
    но ничего ведь не мешает установить ntbackup на 2008?

    ОтветитьУдалить
  8. честно говоря, никто не мешает и Symantec Backup exec поставить :)
    Кстати! у 7zip есть параметр -i@ после которого можно вставить файл со списком того, что нужно забэкапить. +сделать лог и уже готовый backup :)

    ОтветитьУдалить
  9. ну вот :) еще проще, когда разбирался, поленился прочитать все параметры 7z.
    Проверил вариант:
    7z a -r -ssw -tzip -mx5 -i@list.txt back.zip
    работает, в list.txt: back\*.*

    ОтветитьУдалить
  10. я навернул чуть круче :)
    %run_7z% a %baseArch% -w%tmpDir% -ir@%IncludeList% -ssw -slp -mmt=on -mx3 -ms=off -scsWIN >> %Log%
    соответственно, все параметры задаются переменными
    указываешь куда писать логи, откуда, куда, где временные файлы размещать

    ОтветитьУдалить
  11. хм... неплохо надо записать, спасибо

    ОтветитьУдалить
  12. и еще кое-что я понял, для каждого случая будет свой скрипт.
    я попытался написать универсальный скрипт, к сожалению у меня это получилось только для баз 1С
    Для базы мегаплана мне необходимо создавать сначала дамп базы postgres а затем уже закидывать его в общий backup

    ОтветитьУдалить