ОБЕСПЕЧЕНИЕ
СОХРАНЕНИЯ "АРХИ СВЕЖИХ" ДАННЫХ ПК ФАБИУС.
Вашему вниманию
предлагается пример инкрементального ведения копий данных Фабиуса,
реализованный у одного из наших клиентов.
!!! Только для *.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.
Это типа всё.
Буду рад услышать Ваши
замечания и предложения.
Мягков Алексей.