Application: "Bacula 5.2/7.4", "db2".
Задача: наладить выгрузку резервной копии "баз данных" СУБД DB2 посредством "Bacula".
Резервное копирование содержимого "баз данных" прямым копированием из файлов как правило невозможно и требуется предварительная выгрузка консистентного "дампа" в заранее известную директорию. Сделаем это, воспользовавшись встроенной возможностью "Bacula" исполнения произвольных скриптов на стороне клиента до и после процедуры непосредственного резервного копирования.
Предварительная настройка СУБД.
Подготавливать к выгрузке "дампа баз данных" сервер СУБД DB2 практически не требуется. Нужен только доступ от имени обладающего достаточными привилегиями пользователя - но процедуры резервного копирования обычно запускаются в контексте суперпользователя, что позволит обойти все возможные ограничения.
В большинстве виденных мною "наколенных" проектов с использованием СУБД DB2 имелся автоматически созданный при инсталляции пользователь-владелец ресурсов "db2inst1" - его можно использовать для выгрузки резервной копии.
Насколько я уловил, СУБД DB2 позволяет в один приём снимать "дамп" только одной БД, так что заранее выясняем, какие "базы данных" обслуживаются сервером:
# su - db2inst1
$ db2 list database directory | grep -i "Database name"
$ db2 list database directory | grep -i "Database name"
Database name = DBONE
....
....
Конфигурирование "Bacula".
Дополняем описание задания резервного копирования сервиса СУБД DB2 следующими блоками конфигурации:
# vi /etc/bacula/client.d/example.net.conf
....
FileSet {
....
Include {
....
# Директория резервных копий "дампов баз данных"
File = "/var/backups/bacula-db2_backup"
}
}
....
Job {
Name = "example.net"
Type = Backup
....
# Запуск выгрузки "бинарной" резервной копии целевой локальной "базы данных" DB2:
# (запрос списка БД: db2 "list database directory")
Run Script {
Runs When = Before
Fail Job On Error = No
# Зачищаем и воссоздаём место для сохранения "дампа"
Command = "rm -rf /var/backups/bacula-db2_backup"
Command = "mkdir -p /var/backups/bacula-db2_backup"
Command = "chown -R db2inst1 /var/backups/bacula-db2_backup"
# Запускаем выгрузку резервной копии БД
Command = "/bin/bash -c 'sudo -u db2inst1 /home/db2inst1/sqllib/bin/db2 \"backup db DBONE online to /var/backups/bacula-db2_backup/ compress include logs\" 1>/var/log/bacula-db2_backup.log 2>&1'"
}
#
Run Script {
Runs When = After
Runs On Failure = yes
# По завершению всех процедур задания высвобождаем ресурсы
Command = "rm -rf /var/backups/bacula-db2_backup"
}
}
FileSet {
....
Include {
....
# Директория резервных копий "дампов баз данных"
File = "/var/backups/bacula-db2_backup"
}
}
....
Job {
Name = "example.net"
Type = Backup
....
# Запуск выгрузки "бинарной" резервной копии целевой локальной "базы данных" DB2:
# (запрос списка БД: db2 "list database directory")
Run Script {
Runs When = Before
Fail Job On Error = No
# Зачищаем и воссоздаём место для сохранения "дампа"
Command = "rm -rf /var/backups/bacula-db2_backup"
Command = "mkdir -p /var/backups/bacula-db2_backup"
Command = "chown -R db2inst1 /var/backups/bacula-db2_backup"
# Запускаем выгрузку резервной копии БД
Command = "/bin/bash -c 'sudo -u db2inst1 /home/db2inst1/sqllib/bin/db2 \"backup db DBONE online to /var/backups/bacula-db2_backup/ compress include logs\" 1>/var/log/bacula-db2_backup.log 2>&1'"
}
#
Run Script {
Runs When = After
Runs On Failure = yes
# По завершению всех процедур задания высвобождаем ресурсы
Command = "rm -rf /var/backups/bacula-db2_backup"
}
}
Проверяем корректность конфигурации и применяем таковую:
# bacula-dir -c /etc/bacula/bacula-dir.conf -t
# /etc/init.d/bacula-dir reload
# /etc/init.d/bacula-dir reload
Выше я заворачиваю содержимое директивы "Command" в дополнительный контейнер из "/bin/bash" - это требуется потому, что по умолчанию "Bacula FD" запускает свои команды в интерпретаторе "Dash", синтаксис которого отличается от привычного мне "Bash".