Hare.ru @ Коллективный разум / Hare.ru @ Дикое место

Архив hare.ru 
Мысли, конвертированные в текст

Полезные технологии


Все статьи раздела

Альтернативное резервирование баз V7

Сергей Гридасов (сентябрь 2002)

Предисловие

Полнофункциональное резервирование бывает трех видов:

  • Полное, FULL (все файлы из конкретных каталогов)
  • Дифференциальное, DIF (только то, что изменялось с момента последнего полного резервирования)
  • Инкрементальное, INC (только то, что изменялось с момента просто последнего резервирования – полного или, что чаще, предыдущего инкрементального резервирования)
Самым простым решением является периодическое проведение полного резервирования. В то же время это решение является наиболее ресурсоёмким (по расходу дискового пространства). Именно так организована штатная функция резервирования в "1С:Предприятии".

Дифференциальное резервирование является более экономным решением – сначала проводится полное резервирование, а затем в течение некоторого периода времени резервируются лишь модифицировавшиеся файлы. Новое полное резервирование нужно проводить тогда, когда в дифференциальный набор файлов попадает более 75% объёма полного набора файлов.

Наиболее экономным является инкрементальное (т.е. "наращиваемое") резервирование, но процедуры отката могут занимать довольно много времени. Ведь при откате нужно последовательно, по шагам, вернуться к тому состоянию, при котором последний раз проводилось проное резервирование, и этих шагов будет ровно столько, сколько раз запускалась процедура инкрементального резервирования.

Инкрементальное резервирование имеет смысл тогда, когда вам приходится часто создавать новые файлы и/или в разные периоды времени работать с большим количеством разных программ; если же Вы обычно имеете дело с одним и тем же набором файлов, то лучше воспользоваться дифференциальным резервированием.

Дифференциальное резервирование, по сравнению с инкрементальным, имеет еще и то преимущество, что в случае нехватки дискового пространства для новых задач можно удалять не слишком важные промежуточные дифференциальные наборы; а при инкрементальномы резервировании надо хранить все промежуточные наборы файлов – иначе точное восстановление не произойдет, хотя, конечно, каждый новый инкрементальный набор будет занимать меньше места на диске, чем при дифференциальном резервировании.

Моя идея состоит в том, чтобы заменить штатную процедуру резервирования V7 на свой собственный алгоритм, а в качестве инструментального средства привлечь последние наработки в области сжатия данных. Легко догадаться, что речь идёт о популярных в народе архиваторах.

Посмотрим, можно ли с помощью стороннего архиватора реализовать полнофункциональное резервирование:

  • Полное – возможно с любым архиватором
  • Инкрементальное – наверно, тоже с любым, все они после архивирования сбрасывают файловый атрибут "Архивный", и у всех есть ключ "архивировать только с установленным атрибутом "Архивный"
  • А вот дифференциальное – далеко не на каждом, до мая 2002 года такой функциональной полнотой отличался только ARJ
Но ARJ далеко не чемпион по части плотности упаковки данных. В этом плане лучшим (из популярных) архиватором является RAR. В нём реализован режим "solid archive" (это когда все файлы выстраиваются в одну непрерывную цепочку битов и жмутся, как единое целое), да и размер скользящего словаря (цепочка битов, на которой ищутся повторы) у него на порядок больше, чем у конкурентов (4Mb максимум, на текущий момент).

В описываемом решении я использовал RAR 3.0 – как наиболее подходящий и по плотности сжатия, и по функциональным возможностям.

Как я это сделал

Задача состоит в том, чтобы из-под V7 запустить RAR с нужными параметрами и передать ему имя файла архива. Желательно, чтобы это имя содержало дату и время момента начала резервирования. Также архиватору необходимо передать дату и время момента последнего полного резервирования (мы рассматриваем реализацию дифференциального резервирования). Это нужно для того, чтобы RAR поместил в архив только те файлы, которые были изменены с момента полного архивирования.

Как это сделать? Очевидно, через BAT-файл. BAT-файл запускается с параметрами в виде:

DiffRzrv.bat %1 %2 %3

После подстановки параметров должно получиться что-то вроде:

Diff_rzv.bat YYMMDDhhmmss MMDD hhmm

Первый параметр передается RAR'овскому ключу -ta для отбора файлов, измененных с момента YYMMDDhhmmss. Из двух других формируется имя архива.

В итоге на вход командному интерпретатору подается строка BAT-файла примерно такого вида (это всё одна строка):

rar a -m5 -md4096 -s -ta20%1 ..\Lokal_Proiz-vo\%2_%3_diff.rar
..\..\ExtForms\*.* ..\..\*.dbf ..\..\1cv7.dd ..\..\1cv7.md
..\..\1cv7.ord ..\..\1cv7.spl ..\..\usrdef\users.usr

Комментарии

В каталоге Базы создан каталог REZERV, а в нем – каталог SYS. BAT-файл находится в каталоге SYS, а архивы хранятся в каталоге %DBDir%\REZERV\Lokal_Proiz-vo.

Ключи RAR:

  • a – создать архив;
  • -m4 – максимальная степень сжатия;
  • -md4096 – максимальный размер скользящего словаря;
  • -s – создавать непрерывный архив;
  • -ta20%1 – брать в архив файлы с момента %1
В последнем параметре перед %1 стоит "20", потому что RAR требует в параметре не YYMMDDhhmmss, а YYYYMMDDhhmmss (год четырьмя цифрамия). Так у меня сделано для совместимости моей оболочки с ARJ.

Как видно, в BAT-файле можно гибко настраивать скорость работы и плотность архива. Чтобы это работало, после установки WinRAR 3.00 консольный RAR (RAR.EXE) надо поместить в каталог, описанный в PATH – например, %SystemRoot%\COMMAND. Кстати, в BAT-файлах можно вызывать и WinRAR.exe с теми же параметрами, тогда резервирование запускается как приложение WINDOWS, с соответствующим интерфейсом.

Таким образом, можно откатиться на некоторое время назад и обратно – в зависимости от наличия дискового пространства. На небольших базах вполне можно обеспечить откат на месяц или даже квартал, в зависимости от частоты резервирования. Кроме того, методика вполне применима для "степпинга" проекта – можно пошагово отслеживать изменения ключевых внешних обработок или всей конфигурации.

Моя оболочка имеет вид обычной конфигурации 1С и работает под всеми версиями WINDOWS. См. приложненную к статье ссылку внизу страницы.

Первоначально я хотел реализовать эту систему обработкой, а не отдельной конфигурацией. И предпосылки к этому есть: в WinRAR 3.00 имеется ключ -dh, который, согласно документации, позволяет помещать в архив файлы, открытые для записи. Тогда администратор мог бы в монопольном режиме запустить архивацию и при этом был бы уверен, что за время архивации ни один файл не будет модифицирован. Но, к сожалению, на незарегистрированной копии WinRAR эта опция не работает. Или, что вполне возможно, это "фича" Windows 2000.

Дальнейшее развитие

Доработка требуется только по одному пункту: автоматический запуск резервирования по расписанию. Это можно реализовать двумя способами:

  1. Использовать системную процедуру ОбработкаОжидания в постоянно запущенной конфигурации "Резервы";
  2. Запускать конфигурацию "Резервы" внешними планировщиками.
Оба варианта являются абсолютно тривиальными задачами и представляют никакой сложности в реализации.

Партнеры:


Также может быть интересно:

Канал Россия 1 на http://spbtvonline.ru/
   
 Сайт поддерживается за счет партнеров:
:::... Сайт содержит архив двух версий hare.ru Карта сайта