ОБЕСПЕЧЕНИЕ СОХРАНЕНИЯ "АРХИ СВЕЖИХ" ДАННЫХ ПК ФАБИУС.

Вашему вниманию предлагается пример инкрементального ведения копий данных Фабиуса, реализованный у одного из наших клиентов.

 

!!! Только для *.adt !!!

 

Требуемое оборудование:

1. сервер-ads (у Вас есть),

2. резервный-сервер (а лучше резервный-сервер-ads).

 

Далее по тексту:

сервер-ads = 1сервер,

резервный-сервер = 2сервер.

 

Программное основание:

1. Утилита adsbackup, запущенная с ключом -A, создает

в указанной backup-директории копию всех файлов, что были

когда-то открыты, хотя бы один раз, в программе Фабиус.

При этом adsbackup изменит для все этих файлов

дату последнего изменения на дату запуска с ключом -A.

 

2. Утилита adsbackup, запущенная с ключом -F,

согласует содержимое измененных, с момента последнего запуска

adsbackup с ключом -A или -F, файлов Фабиус с одноименными

файлами backup-директории.

 

Из этого следует, чем чаще запускаешь adsbackup -F,

тем меньше объем изменений, и тем скорее отработает

запуск adsbackup -F.

 

Плохо одно - утилита adsbackup читает только с сервера-ads

и пишет тоже только на сервер-ads.

 

Иметь на одном сервере две почти одинаковые базы как-то не очень нужно.

Но можно копировать backup-директорию с 1сервера на 2сервер,

что делает 2сервер почти зеркалом 1сервера и, кроме этого, 1сервер и 2сервер,

вероятно, не развалятся одновременно.

 

Осталось только найти утилиту, что действует, как adsbackup

с ключами -A и -F, но с двумя машинами.

И такая утилита есть. Это robocopy (Microsoft), которая способна учитывать

время изменения файла источника и файла цели до долей секунды.

В отличие от xcopy, которая учитывает с точностью 1 день.

 

Первый запуск robocopy перепишет backup-директорию с 1сервера на 2сервер

один в один, а каждый следующий запуск будут переписываться только

измененные файлы без всякого нашего дополнительного указания.

 

**************************************************************************

 

Вот вариант пакета ПОДГОТОВКИ К ВЕДЕНИЮ инкрементальной backup-базы данных Фабиус

 

rem PREP_INCR_BACKUP.BAT

 

rem ----------------------------------------------------------------------------------------------------------

 

rem 1

rem c: - диск 2сервера

rem \perl\backup - директория запуска PREP_INCR_BACKUP.BAT

 

rem 2

rem SRC_PATH_INCR_BACKUP=\\1сервер-путь-к-директории-Фабиус

rem DST_PATH_INCR_BACKUP=\\1сервер-путь-к-директории-Фабиус-backup

rem DIR_REFL=имя-директории-справочников

rem DIR_OPDT=имя-директории-данных

rem LOG_INCR_BACKUP=имя-лог-файла

 

rem 3

rem запуск adsbackup ключом -A (создание) для директории-справочников

 

rem 4

rem запуск adsbackup ключом -A (создание) для директории-данных

 

rem ВЫРЕЗАЙТЕ ОТСЮДА V

 

@echo off

rem 1

rem !!! Замените диск и директорию на Ваши

c:

cd \perl\backup

rem 2

SETLOCAL

rem !!! Замените SET-значения переменных на Ваши

set SRC_PATH_INCR_BACKUP=\\1сервер\users\fabius

set DST_PATH_INCR_BACKUP=\\1сервер\users\fabius-incremental-backup

set DIR_REFL=Reflis

set DIR_OPDT=Opdata

set LOG_INCR_BACKUP=prep-incr-backup-bat-log.txt

rem 3

echo // ---------------------  > %LOG_INCR_BACKUP%

echo // Prepare Incremental Archive %DIR_REFL% >> %LOG_INCR_BACKUP%

echo // From %SRC_PATH_INCR_BACKUP%\%DIR_REFL%\dict.add >> %LOG_INCR_BACKUP%

echo // To   %DST_PATH_INCR_BACKUP%\%DIR_REFL% >> %LOG_INCR_BACKUP%

echo // Start %DATE% %TIME% >> %LOG_INCR_BACKUP%

adsbackup -a %SRC_PATH_INCR_BACKUP%\%DIR_REFL%\dict.add %DST_PATH_INCR_BACKUP%\%DIR_REFL% >> %LOG_INCR_BACKUP%

echo // End  %DATE% %TIME% >> %LOG_INCR_BACKUP%

rem 4

echo // ---------------------  >> %LOG_INCR_BACKUP%

echo // Prepare Incremental Archive %DIR_OPDT% >> %LOG_INCR_BACKUP%

echo // From %SRC_PATH_INCR_BACKUP%\%DIR_OPDT%\dict.add >> %LOG_INCR_BACKUP%

echo // To   %DST_PATH_INCR_BACKUP%\%DIR_OPDT% >> %LOG_INCR_BACKUP%

echo // Start %DATE% %TIME% >> %LOG_INCR_BACKUP%

adsbackup -a %SRC_PATH_INCR_BACKUP%\%DIR_OPDT%\dict.add %DST_PATH_INCR_BACKUP%\%DIR_OPDT% >> %LOG_INCR_BACKUP%

echo // End  %DATE% %TIME% >> %LOG_INCR_BACKUP%

ENDLOCAL

 

rem ВЫРЕЗАЙТЕ ДОСЮДА ^

rem ----------------------------------------------------------------------------------------------------------

 

**************************************************************************

 

Вот вариант пакета ВЕДЕНИЯ инкрементальной backup-базы данных Фабиус

 

rem INCR_BACKUP.BAT

 

rem ----------------------------------------------------------------------------------------------------------

rem 1

rem c: - диск 2сервера

rem \perl\backup - директория запуска PREP_INCR_BACKUP.BAT

 

rem 2

rem SRC_PATH_INCR_BACKUP=\\1сервер-путь-к-директории-Фабиус

rem DST_PATH_INCR_BACKUP=\\1сервер-путь-к-директории-Фабиус-backup

rem DIR_REFL=имя-директории-справочников

rem DIR_OPDT=имя-директории-данных

rem DST_PATH_XCOPY=\\2сервер-путь-к-директории-Фабиус-backup

rem LOG_INCR_BACKUP=имя-лог-файла

 

rem 3

rem Удаление временных рабочих директорий

 

rem 4

rem запуск adsbackup ключом -F (изменения) для директории-справочников

 

rem 5

rem запуск adsbackup ключом -F (изменение) для директории-данных

 

rem 6

rem копирование изменений директории Reflis\LastUpd

rem без индексных файлов (/XF *.adi), включая вложенные директории (/S)

rem (cм. Robocopy.doc).

 

rem 7

rem копирование изменений директории Reflis\Private.bln

 

rem 8

rem копирование изменений директории Reflis\Template

 

rem 9

rem копирование изменений директории Reflis\Delete

 

rem 10

rem копирование изменений директории Opdata\Delete

 

rem ВЫРЕЗАЙТЕ ОТСЮДА V

 

@echo off

 

rem 1

c:

cd \perl\backup

 

rem 2

SETLOCAL

set SRC_PATH_INCR_BACKUP=\\1сервер-путь-к-директории-Фабиус

set DST_PATH_INCR_BACKUP=\\1сервер-путь-к-директории-Фабиус-backup

set DIR_REFL=reflis

set DIR_OPDT=opdata

set DST_PATH_XCOPY=\\2сервер-путь-к-директории-Фабиус-backup

set LOG_INCR_BACKUP=incr-backup-bat-log.txt

 

rem 3

echo // Удаление файлов backup_*.* > %LOG_INCR_BACKUP%

if exist %SRC_PATH_INCR_BACKUP%\%DIR_REFL%\backup_*.* erase %SRC_PATH_INCR_BACKUP%\%DIR_REFL%\backup_*.* /Q  >> %LOG_INCR_BACKUP%

if exist %SRC_PATH_INCR_BACKUP%\%DIR_OPDT%\backup_*.* erase %SRC_PATH_INCR_BACKUP%\%DIR_OPDT%\backup_*.* /Q  >> %LOG_INCR_BACKUP%

 

rem 4

echo // ---------------------  >> %LOG_INCR_BACKUP%

echo // Incremental Backup %DIR_REFL% >> %LOG_INCR_BACKUP%

echo // From %SRC_PATH_INCR_BACKUP%\%DIR_REFL%\dict.add >> %LOG_INCR_BACKUP%

echo // To   %DST_PATH_INCR_BACKUP%\%DIR_REFL% >> %LOG_INCR_BACKUP%

echo // Start %DATE% %TIME% >> %LOG_INCR_BACKUP%

adsbackup -F %SRC_PATH_INCR_BACKUP%\%DIR_REFL%\dict.add %DST_PATH_INCR_BACKUP%\%DIR_REFL% >> %LOG_INCR_BACKUP%

echo // End  %DATE% %TIME% >> %LOG_INCR_BACKUP%

echo //  >> %LOG_INCR_BACKUP%

echo // Копирование измененных файлов %DIR_REFL% >> %LOG_INCR_BACKUP%

echo // Из %DST_PATH_INCR_BACKUP%\%DIR_REFL%  >> %LOG_INCR_BACKUP%

echo // В  %DST_PATH_xcopy%\%DIR_REFL%  >> %LOG_INCR_BACKUP%

robocopy %DST_PATH_INCR_BACKUP%\%DIR_REFL% %DST_PATH_XCOPY%\%DIR_REFL% /FFT /NP >> %LOG_INCR_BACKUP%

 

rem 5

echo // ---------------------  >> %LOG_INCR_BACKUP%

echo // Incremental Backup %DIR_OPDT% >> %LOG_INCR_BACKUP%

echo // From %SRC_PATH_INCR_BACKUP%\%DIR_OPDT%\dict.add >> %LOG_INCR_BACKUP%

echo // To   %DST_PATH_INCR_BACKUP%\%DIR_OPDT% >> %LOG_INCR_BACKUP%

echo // Start %DATE% %TIME% >> %LOG_INCR_BACKUP%

adsbackup -F %SRC_PATH_INCR_BACKUP%\%DIR_OPDT%\dict.add %DST_PATH_INCR_BACKUP%\%DIR_OPDT% >> %LOG_INCR_BACKUP%

echo // End   %DATE% %TIME% >> %LOG_INCR_BACKUP%

echo //  >> %LOG_INCR_BACKUP%

echo // Копирование измененных файлов %DIR_OPDT% >> %LOG_INCR_BACKUP%

echo // Из %DST_PATH_INCR_BACKUP%\%DIR_OPDT% >> %LOG_INCR_BACKUP%

echo // В  %DST_PATH_XCOPY%\%DIR_OPDT%  >> %LOG_INCR_BACKUP%

robocopy %DST_PATH_INCR_BACKUP%\%DIR_OPDT% %DST_PATH_XCOPY%\%DIR_OPDT% /FFT /NP >> %LOG_INCR_BACKUP%

 

rem 6

echo // ---------------------  >> %LOG_INCR_BACKUP%

echo // Копирование измененных файлов %DIR_REFL%\LastUpd >> %LOG_INCR_BACKUP%

echo // Из %SRC_PATH_INCR_BACKUP%\%DIR_REFL%\LastUpd >> %LOG_INCR_BACKUP%

echo // В  %DST_PATH_XCOPY%\%DIR_REFL%\LastUpd >> %LOG_INCR_BACKUP%

if NOT exist %DST_PATH_XCOPY%\%DIR_REFL%\LastUpd mkdir %DST_PATH_XCOPY%\%DIR_REFL%\LastUpd

robocopy %SRC_PATH_INCR_BACKUP%\%DIR_REFL%\LastUpd %DST_PATH_XCOPY%\%DIR_REFL%\LastUpd /S /XF *.adi /FFT /NP >> %LOG_INCR_BACKUP%

 

rem 7

echo // ---------------------  >> %LOG_INCR_BACKUP%

echo // Копирование измененных файлов %DIR_REFL%\Private.bln >> %LOG_INCR_BACKUP%

echo // Из %SRC_PATH_INCR_BACKUP%\%DIR_REFL%\Private.bln >> %LOG_INCR_BACKUP%

echo // В  %DST_PATH_XCOPY%\%DIR_REFL%\Private.bln >> %LOG_INCR_BACKUP%

if NOT exist %DST_PATH_XCOPY%\%DIR_REFL%\Private.bln mkdir %DST_PATH_XCOPY%\%DIR_REFL%\Private.bln

robocopy %SRC_PATH_INCR_BACKUP%\%DIR_REFL%\Private.bln %DST_PATH_XCOPY%\%DIR_REFL%\Private.bln /FFT /NP >> %LOG_INCR_BACKUP%

 

rem 8

echo // ---------------------  >> %LOG_INCR_BACKUP%

echo // Копирование измененных файлов %DIR_REFL%\Template >> %LOG_INCR_BACKUP%

echo // Из %SRC_PATH_INCR_BACKUP%\%DIR_REFL%\Template >> %LOG_INCR_BACKUP%

echo // В  %DST_PATH_XCOPY%\%DIR_REFL%\Template >> %LOG_INCR_BACKUP%

if NOT exist %DST_PATH_XCOPY%\%DIR_REFL%\Template mkdir %DST_PATH_XCOPY%\%DIR_REFL%\Template

robocopy %SRC_PATH_INCR_BACKUP%\%DIR_REFL%\Template %DST_PATH_XCOPY%\%DIR_REFL%\Template /FFT /NP >> %LOG_INCR_BACKUP%

 

rem 9

echo // ---------------------  >> %LOG_INCR_BACKUP%

echo // Копирование измененных файлов %DIR_REFL%\Delete >> %LOG_INCR_BACKUP%

echo // Из %SRC_PATH_INCR_BACKUP%\%DIR_REFL%\Delete >> %LOG_INCR_BACKUP%

echo // В  %DST_PATH_XCOPY%\%DIR_REFL%\Delete >> %LOG_INCR_BACKUP%

if NOT exist %DST_PATH_XCOPY%\%DIR_REFL%\Delete mkdir %DST_PATH_XCOPY%\%DIR_REFL%\Delete

robocopy %SRC_PATH_INCR_BACKUP%\%DIR_REFL%\Delete %DST_PATH_XCOPY%\%DIR_REFL%\Delete /XF *.adi /FFT /NP >> %LOG_INCR_BACKUP%

 

rem 10

echo // ---------------------  >> %LOG_INCR_BACKUP%

echo // Копирование измененных файлов %DIR_OPDT%\Delete >> %LOG_INCR_BACKUP%

echo // Из %SRC_PATH_INCR_BACKUP%\%DIR_OPDT%\Delete >> %LOG_INCR_BACKUP%

echo // В  %DST_PATH_XCOPY%\%DIR_OPDT%\Delete >> %LOG_INCR_BACKUP%

if NOT exist %DST_PATH_XCOPY%\%DIR_OPDT%\Delete mkdir %DST_PATH_XCOPY%\%DIR_OPDT%\Delete

robocopy %SRC_PATH_INCR_BACKUP%\%DIR_OPDT%\Delete %DST_PATH_XCOPY%\%DIR_OPDT%\Delete /XF *.adi /FFT /NP >> %LOG_INCR_BACKUP%

ENDLOCAL

 

rem ВЫРЕЗАЙТЕ ДОСЮДА ^

rem ----------------------------------------------------------------------------------------------------------

 

**************************************************************************

 

Важно !

 

1) Напоминаю, что утилита adsbackup в этих bat-файлах работает со словарем базы данных (DICT.ADD).

Это значит, что с точки зрения adsbackup в базу входят только те файлы, имена которых есть

в словаре. А в словаре файлы "прописываются" тогда, когда их откроет Фабиус.

Возможна ситуация, когда всех файлов базы - за три года, а в словаре - за один текущий месяц.

Это возможно, если удалить в \Фабиус\Opdata\DICT.ADD, запустить

пользователей Фабиус и тут же посмотреть список файлов в словаре.

То же верно и для \Фабиус\Reflis\DICT.ADD.

Теоретически, катастрофы произойти не должно - востребованные пользователями файлы постепенно

"пропишутся" в словаре и будут вновь "охвачены" процедурой ведения изменений.

 

2) Строго советую НЕ допускать пользователей к файлам базы данных из DST_PATH_INCR_BACKUP

(\\1сервер-путь-к-директории-Фабиус-backup) даже на просмотр. Назначение DST_PATH_INCR_BACKUP-файлов

- хранение последней даты изменения, которая может быть изменена, если пользователи

получат доступ. В этом случае "инкремент" между базами будет "сбит" и для его восстановления

придется заново запускать adsbackup с ключом -A.

 

 

**************************************************************************

 

Что должно быть в директории запуска и где это взять:

 

Утилита adsbackup.exe размещается в директории инсталляции сервера ads.

Для ads-8.1 это директория "\Program files\Extended Systems\Advantage\8.1\Server".

 

Библиотеки a*.dll можно взять из \директория-Фабиус\Program.

 

prep_incr_backup.bat здесь ftp://user:passw@212.248.40.154/_pl/prep_incr_backup.bat

 

incr_backup.bat здесь ftp://user:passw@212.248.40.154/_pl/incr_backup.bat

 

Robocopy.exe здесь ftp://user:passw@212.248.40.154/_pl/robocopy.exe

 

Docs-robocopy здесь ftp://user:passw6@212.248.40.154/_pl/robocopy.doc

 

**************************************************************************

 

Напоминаю, что для ведения rar-архива

все еще существует скрипт ftp://user:passw@212.248.40.154/_pl/fabback.bat

(см. СИСТЕМНЫЙ от 29.08.2008 PERL-SCRIPT АРХИВАЦИИ ДАННЫХ ФАБИУС)

благополучно отрабатывающий на архивации всей(!)  базы

запусками вида:

 

fabback 48 1 \\fabius-real-base reflis opdata \\fabius-archive

 

Четыре года в прошлое(можно и больше!) в этом примере - практически, вся база.

 

А также "маленькие и быстрые", с 2-х часовым интервалом, запуски вида:

 

fabback 0 5 \\fabius-real-base - opdata c:\client-fabius-archive

 

без сохранения \Фабиус\Reflis.

 

 

Это типа всё.

 

Буду рад услышать Ваши замечания и предложения.

 

Мягков Алексей.