Application: Bacula v.3.2/v.5.2.
Примем за данность, что мы имеем установленную, исправно функционирующую систему резервирования Bacula с сохранёнными наборами копий данных клиента, часть содержимого которых подлежит восстановлению.
В Bacula путей извлечения данных есть два. Первый - создание полноценного задания типа "restore", которое по ряду критериев, в соответствии с кучей параметров, которые мы вынуждены будем описать в этом задании (примерно так-же, как и в задании на резервировании типа "backup"). Это долгий и заковыристый путь (задание восстановления создаётся для каждого задания на резервирование - зеркально, если можно так выразится), который отлично подходит для строго регламентированной схемы, восстановлением пропавших данных в которой занимается оператор, просто запускающий заготовленное заранее задание на исполнение. Второй - ручной, с помощью команды "restore" утилиты "bconsole" набора приложений Bacula. В этом случае не нужно ничего готовить заранее - только в интерактивном режиме определится с тем, откуда берём данные, что конкретно берём, и куда складываем. Собственно, дальше поэтапно об этом.
Запускаем консольную утилиту "bconsole" (приглашение к вводу символов в виде символа "звёздочки"):
*restore
Первым делом необходимо определится, что конкретно мы будем восстанавливать. Все наборы резервных копий Bacula обозначены уникальным номером задания, в результате исполнения которого они были созданы. Это так называемый "JobId". На первом этапе нам будет предложено несколько вариантов определения этого самого "JobId", если он неизвестен заранее:
First you select one or more JobIds that contain files to be restored.
To select the JobIds, you have the following choices:
1: List last 20 Jobs run
2: List Jobs where a given File is saved
3: Enter list of comma separated JobIds to select
4: Enter SQL list command
5: Select the most recent backup for a client
6: Select backup for a client before a specified time
7: Enter a list of files to restore
8: Enter a list of files to restore before a specified time
9: Find the JobIds of the most recent backup for a client
10: Find the JobIds for a backup for a client before a specified time
11: Enter a list of directories to restore for found JobIds
12: Select full restore to a specified Job date
13: Cancel
Select item: (1-13): 3
To select the JobIds, you have the following choices:
1: List last 20 Jobs run
2: List Jobs where a given File is saved
3: Enter list of comma separated JobIds to select
4: Enter SQL list command
5: Select the most recent backup for a client
6: Select backup for a client before a specified time
7: Enter a list of files to restore
8: Enter a list of files to restore before a specified time
9: Find the JobIds of the most recent backup for a client
10: Find the JobIds for a backup for a client before a specified time
11: Enter a list of directories to restore for found JobIds
12: Select full restore to a specified Job date
13: Cancel
Select item: (1-13): 3
По хорошему, надо бы предварительно исследовать отчёты системы резервирования, узнав оттуда требуемый номер задания. После того, как "JobId" станет известен - сообщаем его системе восстановления (в примере это число "15"):
Enter JobId(s), comma separated, to restore: 15
Сразу после этого утилита находит набор резервных копий, закреплённый за введённым "JobId". В зависимости от количества объектов в файле-контейнере построение дерева его виртуальной файловой системы может занять от секунд до десятков минут:
Building directory tree for JobId(s) 15 ... ++++++++++++++++++ ...
3,609,267 files inserted into the tree.
3,609,267 files inserted into the tree.
Первый этап: определение источника данных для восстановления - завершён. Теперь выберем, что конкретно будем извлекать из резервной копии. Тут всё просто: ходим по виртуальной файловой системы и помечаем объекты, подлежащие восстановлению (обратите внимание, что знак приглашения к вводу команды сменился с "*" на "$"; это только на время "хождения" по виртуальной файловой системе контейнера резервной копии):
cwd is: /
$
$ cd /etc/
cwd is: /etc/
$ mark timezone
1 file marked.
$
$ cd /etc/
cwd is: /etc/
$ mark timezone
1 file marked.
Выше мы для примера пометили к последующему восстановлению один файл "timezone". Можно помечать директории. В процессе можно контролировать ситуацию, просматривая список отмеченных объектов или их общий объём, например:
$ estimate
3644562 total files; 1 marked to be restored; 12 bytes.
3644562 total files; 1 marked to be restored; 12 bytes.
После того, как подборка объектов для восстановления успешно сформирована, завершаем процедуру, призывая утилиту перейти к следующему этапу:
$ done
Следующим этапом подсистема восстановления запросит у нас, куда конкретно мы собираемся выкладывать извлекаемые из резервной копии файлы. Для упрощения процедуры будет выведен весь перечень уже определённых клиентских заданий (как они описываются мы проходили на этапе настройки сервиса Bacula):
Defined Clients:
1: client-restore
2: client-test0.domain.local
3: client-test1.domain.local
....
32: client-test31.domain.local
Select the Client (1-32): 1
1: client-restore
2: client-test0.domain.local
3: client-test1.domain.local
....
32: client-test31.domain.local
Select the Client (1-32): 1
Если нужно вывести файлы непосредственно на удалённую машину клиента, для которого уже имеется задача резервного копирования, то выбираем из списка выше соответствующий набор правил. На случай, если требуется вывести восстанавливаемые объекты в файловую систему, доступную непосредственно с сервера резервного копирования (например на подключенный к нему мобильный диск или временно смонтированную сетевую файловую систему), у нас заготовлено самое первое правило, которое мы описали на этапе настройки сервиса (просто потому, что Bacula считает ошибкой отсутствие хотя бы одной задачи типа "restore").
Для простоты выбираем набор правил "client-restore", что за первым номером в списке. После выбора набора правил клиента нам покажут перечень параметров задания, связанного с ним. Не спешите сразу запускать задание на исполнение - обязательно выбирайте вариант модификации профиля такового:
....
JobName: job-restore
Where: /tmp
Replace: always
FileSet: file-set-restore
Backup Client: client-restore
Restore Client: client-restore
Storage: dev0.sd0.backup.local
Catalog: cd0.backup.local
OK to run? (yes/mod/no): mod
JobName: job-restore
Where: /tmp
Replace: always
FileSet: file-set-restore
Backup Client: client-restore
Restore Client: client-restore
Storage: dev0.sd0.backup.local
Catalog: cd0.backup.local
OK to run? (yes/mod/no): mod
В своё время, на этапе первичной настройки сервиса резервирования параметры задания "job-restore" практически никак не были определены - только самым общим образом. Теперь, для того, чтобы указать системе, куда конкретно выкладывать восстанавливаемые файлы, необходимо внести корректировки в параметры - в пункте "Where" указать директорию, где будет частично (в меру надобности) воссоздана виртуальная файловая системы и выложены восстанавливаемые файлы:
Parameters to modify:
1: Level
2: Storage
3: Job
4: FileSet
5: Restore Client
6: When
7: Priority
8: Bootstrap
9: Where
10: File Relocation
11: Replace
12: JobId
13: Plugin Options
Select parameter to modify (1-13): 9
Please enter path prefix for restore (/ for none): /tmp/bacula-restore
1: Level
2: Storage
3: Job
4: FileSet
5: Restore Client
6: When
7: Priority
8: Bootstrap
9: Where
10: File Relocation
11: Replace
12: JobId
13: Plugin Options
Select parameter to modify (1-13): 9
Please enter path prefix for restore (/ for none): /tmp/bacula-restore
С предварительными настройками покончено - теперь только дождёмся завершения запущенного задания. Статус задачи восстановления проверяется так-же, как и задачи резервирования:
*status
Status available for:
1: Director
2: Storage
3: Client
4: All
Select daemon type for status (1-4): 1
Running Jobs:
JobId Level Name Status
===================================
226 job-restore is running
Status available for:
1: Director
2: Storage
3: Client
4: All
Select daemon type for status (1-4): 1
Running Jobs:
JobId Level Name Status
===================================
226 job-restore is running
Вот пример отчёта реально отработанной задачи восстановления объектов:
dir0.backup.local JobId 226: Start Restore Job job-restore
....
dir0.backup.local JobId 226: Bacula dir0.backup.local
JobId: 226
Job: job-restore
Restore Client: client-restore
Start time: 13:08:46
End time: 13:20:51
Files Expected: 16,918
Files Restored: 16,918
Bytes Restored: 12,529,329,262
Rate: 17281.8 KB/s
FD Errors: 0
FD termination status: OK
SD termination status: OK
Termination: Restore OK
....
dir0.backup.local JobId 226: Bacula dir0.backup.local
JobId: 226
Job: job-restore
Restore Client: client-restore
Start time: 13:08:46
End time: 13:20:51
Files Expected: 16,918
Files Restored: 16,918
Bytes Restored: 12,529,329,262
Rate: 17281.8 KB/s
FD Errors: 0
FD termination status: OK
SD termination status: OK
Termination: Restore OK
По завершению задачи обнаруживаем помеченные выше к восстановлению файлы в выбранной нами директории "/tmp/bacula-restore".