Application: Bacula v.3.2/v.5.2.
Как хорошо и просто делать инкрементальное резервирование данных Lotus Domino я не знаю. Не занимаюсь этой системой документооборота и взаимодействую с ней только со стороны. Каждый "чих" и "пых" подключенного к серверу клиента Lotus Notes вызывает изменение большущих файлов "баз данных" Lotus, которые в общем случае могут быть сохранены только целиком. Так и будем делать.
Чтобы сохранить "базы" Lotus в непротиворечивом состоянии считаю необходимым останавливать сервер Lotus перед резервным копированием данных.
Как правило, Lotus запускается в качестве системной службы. Следует выяснить точное имя этой службы:
# sc query
SERVICE_NAME: ALG
DISPLAY_NAME:
TYPE : 10 WIN32_OWN_PROCESS
STATE : 4 RUNNING
(STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
....
SERVICE_NAME: Lotus Domino Server (LotusDominoFullReplication)
DISPLAY_NAME: Lotus Domino Server (LotusDominoFullReplication)
TYPE : 110 WIN32_OWN_PROCESS (interactive)
STATE : 4 RUNNING
(STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
....
SERVICE_NAME: Eventlog
DISPLAY_NAME:
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 4 RUNNING
(NOT_STOPPABLE,NOT_PAUSABLE,ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
....
DISPLAY_NAME:
TYPE : 10 WIN32_OWN_PROCESS
STATE : 4 RUNNING
(STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
....
SERVICE_NAME: Lotus Domino Server (LotusDominoFullReplication)
DISPLAY_NAME: Lotus Domino Server (LotusDominoFullReplication)
TYPE : 110 WIN32_OWN_PROCESS (interactive)
STATE : 4 RUNNING
(STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
....
SERVICE_NAME: Eventlog
DISPLAY_NAME:
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 4 RUNNING
(NOT_STOPPABLE,NOT_PAUSABLE,ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
....
В середине - оно самое.
Далее всё просто. Пишем пару скриптов, корректно останавливающих, перед запуском резервирования, и запускающих, после такового, сервис Lotus.
Создадим на стороне клиента скрипт с именем "c:\custom\pre-backup-lotus.bat", исполняющий останов службы:
# Отключаем вывод скрипта в терминал
@echo off
set SUBJECT=Lotus Domino Server (LotusDominoFullReplication)
set WAIT=10
# Отдаём команду остановки службы
cmd.exe /c sc.exe stop "%SUBJECT%" >> %TEMP%\pre-backup-lotus.log
# Запускаем ожидание остановки с циклической проверкой
for /L %%i IN (1,1,%WAIT%) do (
# Выжидаем тридцать секунд (способ извращённый, но иного не предусмотрено)
ping -n 30 localhost > %TEMP%\sleep.txt
# Проверяем успешность завершения работы Lotus Domino Server
cmd.exe /c sc.exe query "%SUBJECT%" | FIND "STOPPED" > %TEMP%\sleep.txt
# Единственный нормальный способ выхода из скрипта с передачей управления Bacula
if %errorlevel% EQU 0 (exit 0)
)
# Отдаём команду запуска службы (на всякий случай, хуже не будет)
cmd.exe /c sc.exe start "%SUBJECT%" >> %TEMP%\pre-backup-lotus.log
# Завершаем исполнение скрипта с передачей сообщения о неудаче Bacula
exit 1
@echo off
set SUBJECT=Lotus Domino Server (LotusDominoFullReplication)
set WAIT=10
# Отдаём команду остановки службы
cmd.exe /c sc.exe stop "%SUBJECT%" >> %TEMP%\pre-backup-lotus.log
# Запускаем ожидание остановки с циклической проверкой
for /L %%i IN (1,1,%WAIT%) do (
# Выжидаем тридцать секунд (способ извращённый, но иного не предусмотрено)
ping -n 30 localhost > %TEMP%\sleep.txt
# Проверяем успешность завершения работы Lotus Domino Server
cmd.exe /c sc.exe query "%SUBJECT%" | FIND "STOPPED" > %TEMP%\sleep.txt
# Единственный нормальный способ выхода из скрипта с передачей управления Bacula
if %errorlevel% EQU 0 (exit 0)
)
# Отдаём команду запуска службы (на всякий случай, хуже не будет)
cmd.exe /c sc.exe start "%SUBJECT%" >> %TEMP%\pre-backup-lotus.log
# Завершаем исполнение скрипта с передачей сообщения о неудаче Bacula
exit 1
Так же создадим на стороне клиента скрипт с именем "c:\custom\post-backup-lotus.bat", исполняющий запуск службы:
# Отключаем вывод скрипта в терминал
@echo off
set SUBJECT=Lotus Domino Server (LotusDominoFullReplication)
# Отдаём команду запуска службы
cmd.exe /c sc.exe start "%SUBJECT%" >> %TEMP%\post-backup-lotus.log
exit 0
@echo off
set SUBJECT=Lotus Domino Server (LotusDominoFullReplication)
# Отдаём команду запуска службы
cmd.exe /c sc.exe start "%SUBJECT%" >> %TEMP%\post-backup-lotus.log
exit 0
Закрываем скрипты от чтения, не говоря уже о записи, кем бы то ни было, кроме суперпользователя, во избежание.
Корректируем конфигурацию Bacula Director:
# cat /etc/bacula/bacula-dir.conf
....
Job {
Name = "job-backup-test.domain.local"
Type = Backup
....
ClientRunBeforeJob = "c:/custom/pre-backup-lotus.bat"
ClientRunAfterJob = "c:/custom/post-backup-lotus.bat"
....
Job {
Name = "job-backup-test.domain.local"
Type = Backup
....
ClientRunBeforeJob = "c:/custom/pre-backup-lotus.bat"
ClientRunAfterJob = "c:/custom/post-backup-lotus.bat"
....
Описываем область резервирования:
# cat /etc/bacula/bacula-dir.conf
....
FileSet {
Name = "file-set-test.domain.local"
Include {
....
File = "c:\lotus\"
....
FileSet {
Name = "file-set-test.domain.local"
Include {
....
File = "c:\lotus\"
....
Объём резервируемых данных, как правило, настолько велик, что предварительное копирование таковых для скорейшего освобождения ресурса в подготовленное место с последующим извлечением Bacula не представляется возможным. Потому следует принять меры к тому, чтобы Lotus случайно не был запущен каким ни-будь "администратором".
По хорошему, в инфраструктуре с большим количеством серверов Lotus, хранящих критически важные данные, следует в обязательном порядке заиметь выделенный сервер репликаций, аккумулирующий данные и осуществляющих их резервирование в том или ином виде. Так будет гораздо лучше, нежели множить копии "баз данных" Lotus, содержащих практически идентичную информацию.