Ситуация потери информации, хранящейся в службе Каталога 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-дампа.
Забавно, хранить бекап БД системы архивирования в самой системе архивирования 🙂
Хотя на всякий поставлю закладку на статье, но бекап БД системы буду производить другими средствами.
Собственно подобную схему предлагает Bacula по умолчанию (и зерно здравого смысла в этом присутствует). Как видно из заметки, никаких проблем не возникает с ее восстановлением. Разумеется, никто не мешает делать снимок базы штатными для нее средствами *sql*dump 🙂
Спасибо большое за статью 🙂 В документации сходу не разобрался, а тут всё так просто и понятно расписано
Спасибо Вам. Вы спасли меня.
Pingback: Резервное копирование MongoDB | Обитель UNIX