Bacula: bscan(8), bls(8), bextract(8)

Ситуация потери информации, хранящейся в службе Каталога Bacula (Bacula Catalog — основного хранилища информации о заданиях, файлах, томах, необходимой для восстановления) хотя и маловероятна, но возможна. При соответствующей политике резервного копирования в одном из резервных томов Бакулы будет храниться актуальный снимок данной службы (по сути представляющий из себя SQL-дамп, полученный одно из команд mysqldump, pg_dump). Путь к восстановлению нам преграждает вопрос «курицы и яйца». Как без информации о расположении снимка восстановить его. Разработчики заботливо продумали и этот момент, реализовав набор CLI утилит: bscan(8), bls(8), bextract(8).
Для их корректного функционирования потребуются работающий Bacula Storage демон, а для некоторых операций восстановления и Bootstrap file. Каждая из команд принимает в качестве основного параметра device-name, значение которого соответствует имени, описанному в bacula-sd.conf. Например, для файла bacula-sd.conf следующего содержания:

...
Device {
  Name                    = FileStorage
  Media Type              = File
  Archive Device          = /var/spool/bacula
  LabelMedia              = Yes;
  Random Access           = Yes;
  AutomaticMount          = Yes;
  RemovableMedia          = No;
  AlwaysOpen              = No;
}

это будет параметр FileStorage. Другой параметр, на который следует обратить внимание в конфигурационном файле bacula-sd.conf, является Archive Device (определяет месторасположение томов Bacula Storage демона).

Сабли вынуты из ножен и настало время ими немного помахать. Посмотрим какие тома существуют в указанном Archive Device:

[root@savecore bacula]# ls -l /var/spool/bacula/
total 170092
-rw-r----- 1 bacula disk   611737 Jun  7 05:00 VLM-DEFAULT-0001
-rw-r----- 1 bacula disk  5445736 Jun  5 09:51 VLM-DEV-001-0001
-rw-r----- 1 bacula disk 34184883 Jun  5 09:56 VLM-DEV-002-0001
-rw-r----- 1 bacula disk  7904414 Jun  5 10:09 VLM-DEV-002-0002
-rw-r----- 1 bacula disk 34293320 Jun  6 03:33 VLM-DEV-002-0003
-rw-r----- 1 bacula disk  9250270 Jun  6 07:59 VLM-DEV-002-0004
-rw-r----- 1 bacula disk  9306074 Jun  7 03:33 VLM-DEV-002-0005
-rw-r----- 1 bacula disk 34302202 Jun  6 07:59 VLM-DEV-003-0001
-rw-r----- 1 bacula disk 34453604 Jun  7 03:33 VLM-DEV-003-0002
-rw-r----- 1 bacula disk  4174860 Jun  5 09:35 VLM-LOCALHOST-001-0001
[root@savecore bacula]# 

Просмотреть список сохраненных файлов конкретного тома можно командой bls -V <VOLUMENAME> <device-name>

[root@savecore bacula]# bls -V VLM-LOCALHOST-001-0001 FileStorage
bls: match.c:249 add_fname_to_include prefix=0 gzip=0 fname=/
bls: butil.c:283 Using device: "FileStorage" for reading.
07-Jun 08:40 bls: Ready to read from volume "VLM-LOCALHOST-001-0001" on device "FileStorage" (/var/spool/bacula).
bls: -rw-r--r--   1 root     root          1437 2007-04-24 18:07:11  /etc/bashrc
bls: -rw-r--r--   1 root     root            84 2007-04-24 18:09:41  /etc/yum/pluginconf.d/installonlyn.conf
bls: drwxr-xr-x   2 root     root          4096 2007-05-21 06:49:18  /etc/yum/pluginconf.d/
bls: -rw-r--r--   1 root     root            19 2007-05-21 10:38:05  /etc/yum/yum-daily.yum
bls: drwxr-xr-x   3 root     root          4096 2007-05-21 10:38:14  /etc/yum/
bls: drwxr-xr-x   2 root     root          4096 2007-04-24 18:11:11  /etc/logwatch/scripts/
bls: drwxr-xr-x   2 root     root          4096 2007-04-24 18:11:11  /etc/logwatch/conf/services/
...

Помимо этого есть возможность, просмотреть список задач сохраненных в данном томе. В этом случае необходимо добавить ключик -j к вызову:

[root@savecore bacula]# bls -j -V VLM-LOCALHOST-001-0001 FileStorage
bls: match.c:249 add_fname_to_include prefix=0 gzip=0 fname=/
bls: butil.c:283 Using device: "FileStorage" for reading.
07-Jun 08:42 bls: Ready to read from volume "VLM-LOCALHOST-001-0001" on device "FileStorage" (/var/spool/bacula).
Volume Record: File:blk=0:64511 SessId=1 SessTime=1181034701 JobId=0 DataLen=183
Begin Job Session Record: File:blk=0:64730 SessId=1 SessTime=1181034701 JobId=1
   Job=hq-localhost-default-fileset-job.2007-06-05_09.35.23 Date=05-Jun-2007 09:35:27 Level=F Type=B
End Job Session Record: File:blk=0:4174859 SessId=1 SessTime=1181034701 JobId=1
   Date=05-Jun-2007 09:35:37 Level=F Type=B Files=1,393 Bytes=4,131,365 Errors=0 Status=T
07-Jun 08:42 bls: End of Volume at file 0 on device "FileStorage" (/var/spool/bacula), Volume "VLM-LOCALHOST-001-0001"
07-Jun 08:42 bls: End of all volumes.
[root@savecore bacula]# 

Однако наиболее ценным параметром является параметр -b, который на основе существующего Bootstrap файла отображает/позволяет извлечь информацию о наиболее актуальной резервной копии для указанного задания. Возвратимся к изначально поставленной задачи восстановления утерянной информации службы Каталога Бакулы, для этого выполним команду, указав путь к Boostrap файлу:

[root@savecore bacula]# bls -b /var/lib/bacula/hq-bacula-catalog-fileset-job.bsr FileStorage
bls: match.c:249 add_fname_to_include prefix=0 gzip=0 fname=/
bls: butil.c:283 Using device: "FileStorage" for reading.
07-Jun 08:49 bls: Ready to read from volume "VLM-DEFAULT-0001" on device "FileStorage" (/var/spool/bacula).
07-Jun 08:49 bls: Forward spacing Volume "VLM-DEFAULT-0001" to file:block 0:236423.
bls: -rw-r-----   1 bacula   bacula     1354053 2007-06-07 05:00:02  /var/bacula/bacula.sql
07-Jun 08:49 bls: End of Volume at file 0 on device "FileStorage" (/var/spool/bacula), Volume "VLM-DEFAULT-0001"
07-Jun 08:49 bls: End of all volumes.
1 files found.
[root@savecore bacula]#

Как видно наиболее актуальная информация расположена в томе VLM-DEFAULT-0001 по смещению file:block 0:236423. Настало время её извлечь. Для этого воспользуемся ранее остававшейся в тени командой bextract(8), указав ей в качестве входных параметров ранее упомянутый Bootstrap файл и директорию для размещения восстанавливаемой резервной копии:

[root@savecore bacula]# bextract -b /var/lib/bacula/hq-bacula-catalog-fileset-job.bsr FileStorage /var/bacula/restores
bextract: match.c:249 add_fname_to_include prefix=0 gzip=0 fname=/
bextract: butil.c:283 Using device: "FileStorage" for reading.
07-Jun 08:55 bextract: Ready to read from volume "VLM-DEFAULT-0001" on device "FileStorage" (/var/spool/bacula).
07-Jun 08:55 bextract: Forward spacing Volume "VLM-DEFAULT-0001" to file:block 0:236423.
bextract: -rw-r-----   1 bacula   bacula     1354053 2007-06-07 05:00:02  /var/bacula/restores/var/bacula/bacula.sql
07-Jun 08:55 bextract: End of Volume at file 0 on device "FileStorage" (/var/spool/bacula), Volume "VLM-DEFAULT-0001"
07-Jun 08:55 bextract: End of all volumes.
1 files restored.
[root@savecore bacula]#

Беглый просмотр директории /var/bacula/restores демонстрирует нам восстановленный снимок.

[root@savecore bacula]# ls -l /var/bacula/restores/var/bacula
total 1328
-rw-r----- 1 bacula bacula 1354053 Jun  7 05:00 bacula.sql
[root@savecore bacula]# 

Дальнейшее восстановление непосредственно базы данных (будь то MySQL, PostgreSQL, SQLite) сильно зависит от специфики базы, но в целом это задача тривиальная и как правило вытекающая в запуск приложения-клиента с указанием параметров соединения с реляционной базой данных и расположением SQL-дампа.

5 thoughts on “Bacula: bscan(8), bls(8), bextract(8)

  1. Забавно, хранить бекап БД системы архивирования в самой системе архивирования 🙂
    Хотя на всякий поставлю закладку на статье, но бекап БД системы буду производить другими средствами.

    • Собственно подобную схему предлагает Bacula по умолчанию (и зерно здравого смысла в этом присутствует). Как видно из заметки, никаких проблем не возникает с ее восстановлением. Разумеется, никто не мешает делать снимок базы штатными для нее средствами *sql*dump 🙂

  2. Спасибо большое за статью 🙂 В документации сходу не разобрался, а тут всё так просто и понятно расписано

  3. Pingback: Резервное копирование MongoDB | Обитель UNIX

Добавить комментарий

Ваш e-mail не будет опубликован.