Um dos erros mais comuns que ocorrem quando se está iniciando com o Bacula, é usar os arquivos padrões sem nenhuma modificação e colocar em produção, sem analisar ao menos os tempos de retenção, que são essenciais para o correto funcionamento do Bacula. O período de retenção dos arquivos e jobs (File Retention e Job Retention) servem para manter os dados no catálogo pelo máximo tempo possível. Por padrão, essas retenções tem um período de duração relativamente baixo.
Existe ainda a retenção dos volumes (Volume Retention), que neste caso é a retenção do volume físico, quanto tempo manter a informação no disco.
Então o ideal é configurar a retenção de arquivos e jobs com um tempo de retenção igual da Pool com maior tempo de retenção ou um valor bem alto, exemplo 365 dias. Quando algum volume for reciclado, automaticamente será apagado o dado físico, bem como as informações dos arquivos e jobs do catálogo.
Muitas vezes ocorre que o tempo de retenção estava errado e na hora de restaurar não é possível selecionar os arquivos, apenas restaurar o job inteiro, conforme abaixo:
*restore jobid=3439 You have selected the following JobId: 3439 Building directory tree for JobId(s) 3439 ... For one or more of the JobIds selected, no files were found, so file selection is not possible. Most likely your retention policy pruned the files. Do you want to restore all the files? (yes|no): yes Bootstrap records written to /etc/bacula/working/bacula-dir.restore.1.bsr Bootstrap records written to /etc/bacula/working/bacula-dir.restore.1.bsr The Job will require the following (*=>InChanger): Volume(s) Storage(s) SD Device(s) =========================================================================== Volume-Diario-0020 StorageLocal1 DiscoLocal1
Nestes casos é interessante utilizar os arquivos Bootstrap que são criados automaticamente em cada restore.
Note que o Bacula criou um arquivo Booststrap em “/etc/bacula/working/bacula-dir.restore.1.bsr”. Este arquivo basicamente é um arquivo texto que contém informações dos jobs nos volumes, e com ele é possível listar os arquivos contidos no volumes para uma possível seleção de arquivos.
Conteúdo de um arquivo bootstrap
Storage="StorageLocal1" Volume="Volume-Diario-0020" MediaType="File" Device="DiscoLocal1" VolSessionId=3 VolSessionTime=1456008329 VolAddr=206-9999561 FileIndex=1-2126 Count=2126 Storage="StorageLocal1"
Então após tentar restaurar e não conseguir selecionar os arquivos, anote o nome e localização do arquivo bootstrap e cancele a restauração do mesmo. Saia do bconsole e vamos utilizar o utilitário bls para listar os arquivos do job.
Sintaxe básica do comando bls:
bls -c /caminho/para/bacula-sd.conf -b /caminho/para/arquivo/bootstrap.bsr Nome_do_Device_ou_Caminho_do_Device
Executando o bls:
bls -c /etc/bacula/bacula-sd.conf -b /etc/bacula/working/bacula-dir.restore.1.bsr /mnt/disco01 bls: butil.c:293-0 Using device: "/mnt/disco01" for reading. 20-Feb 21:09 bls JobId 0: Ready to read from volume "Volume-Diario-0020" on file device "DiscoLocal1" (/mnt/disco01). 20-Feb 21:09 bls JobId 0: Forward spacing Volume "Volume-Diario-0020" to file:block 0:206. bls JobId 0: drwxr-xr-x 2 root root 4096 2016-02-10 10:53:37 /etc/vim/ bls JobId 0: -rw-r--r-- 1 root root 258 2016-02-10 11:16:21 /etc/hosts bls JobId 0: -rw-r--r-- 1 root root 1208 2016-02-07 20:17:08 /etc/w3m/config bls JobId 0: -rw-r--r-- 1 root root 44 2016-02-07 20:17:08 /etc/w3m/mailcap bls JobId 0: drwxr-xr-x 2 root root 4096 2016-02-07 20:17:08 /etc/w3m/ bls JobId 0: -rw-r--r-- 1 root root 144 2016-02-07 20:20:05 /etc/kernel-img.conf bls JobId 0: drwxr-xr-x 2 root root 4096 2016-02-07 19:53:40 /etc/rsyslog.d/ bls JobId 0: -rw-r--r-- 1 root root 177 2016-02-07 20:16:57 /etc/gss/mech.d/README bls JobId 0: drwxr-xr-x 2 root root 4096 2016-02-07 20:16:57 /etc/gss/mech.d/ bls JobId 0: drwxr-xr-x 3 root root 4096 2016-02-07 20:15:26 /etc/gss/ bls JobId 0: drwxr-xr-x 6 root root 4096 2016-02-20 14:05:25 /usr/src/ 20-Feb 21:09 bls JobId 0: End of Volume at file 0 on device "DiscoLocal1" (/mnt/disco01), Volume "Volume-Diario-0020" 20-Feb 21:09 bls JobId 0: End of all volumes.
O comando vai listar todos os arquivos/diretórios contidos no backup escolhido, sendo possível desta maneira, saber quais são os arquivos que podemos restaurar.
Ainda é possível usar o redirecionador “>” para direcionar a saída do comando para um arquivo texto e facilitar a seleção dos arquivos. Se a quantidade de arquivos é grande, sugiro usar esta opção.
bls -c /etc/bacula/bacula-sd.conf -b /etc/bacula/working/bacula-dir.restore.1.bsr /mnt/disco01 > /tmp/bls.txt
Após analisar o arquivo texto “/tmp/bls.txt” e verificar a relação de arquivos/diretórios, podemos criar um novo arquivo texto em “/tmp/arquivos.txt”, e incluir nele os arquivos/diretórios que gostaríamos de restaurar, lembrando que deve ser um por linha. Ainda é possível utilizar expressões regulares para filtrar os arquivos.
Exemplo de arquivo texto “/tmp/arquivos.txt”:
/etc/bacula/working/bacula.sql /etc/bacula/*.conf /etc/hosts /etc/apache2/sites-available
Executamos agora o bls com a opção -i, passando o caminho do arquivo criado “/tmp/arquivos.txt”. Você vai notar que o bls vai listar apenas os arquivos/diretórios que você escolheu.
bls -c /etc/bacula/bacula-sd.conf -b /etc/bacula/working/bacula-dir.restore.1.bsr -i /tmp/arquivos.txt /mnt/disco01 bls: butil.c:293-0 Using device: "/mnt/disco01" for reading. 20-Feb 21:37 bls JobId 0: Ready to read from volume "Volume-Diario-0020" on file device "DiscoLocal1" (/mnt/disco01). 20-Feb 21:37 bls JobId 0: Forward spacing Volume "Volume-Diario-0020" to file:block 0:206. bls JobId 0: -rw-r--r-- 1 root root 258 2016-02-10 11:16:21 /etc/hosts bls JobId 0: -rw-r--r-- 1 root root 3492 2016-02-20 14:05:03 /etc/bacula/pools.conf bls JobId 0: -rw-r--r-- 1 root root 1839 2016-02-10 11:17:48 /etc/bacula/schedules.conf bls JobId 0: -rw-r--r-- 1 root root 1086 2016-02-10 11:17:48 /etc/bacula/filesets.conf bls JobId 0: -rw-r--r-- 1 root root 2945 2016-02-20 14:01:42 /etc/bacula/clients-and-jobs/srv_bacula-fd.conf bls JobId 0: -rw-r--r-- 1 root root 1348 2016-02-10 11:23:45 /etc/bacula/clients-and-jobs/srv_firewall-fd.conf bls JobId 0: -rw-r----- 1 root root 266 2016-02-10 11:32:24 /etc/bacula/bconsole.conf bls JobId 0: -rw-r--r-- 1 root root 2118 2016-02-18 16:42:37 /etc/bacula/clients-and-jobs.conf bls JobId 0: -rw-r----- 1 root root 3699 2016-02-20 20:44:36 /etc/bacula/bacula-sd.conf bls JobId 0: -rw-r--r-- 1 root root 1347 2016-02-10 11:27:36 /etc/bacula/messages.conf bls JobId 0: -rwxr-x--- 1 root root 2323 2016-02-10 11:09:30 /etc/bacula/scripts/mtx-changer.conf bls JobId 0: -rw-r----- 1 root root 1575 2016-02-10 11:17:47 /etc/bacula/bacula-dir.conf bls JobId 0: -rw-r--r-- 1 root root 1389 2016-02-10 11:17:48 /etc/bacula/counters.conf bls JobId 0: -rw-r--r-- 1 root root 898 2016-02-20 20:47:14 /etc/bacula/storages.conf bls JobId 0: -rw-r----- 1 root root 1001 2016-02-10 11:17:47 /etc/bacula/bacula-fd.conf bls JobId 0: -rw-r--r-- 1 root root 1328 2016-02-14 02:12:07 /etc/apache2/sites-available/000-default.conf bls JobId 0: -rw-r--r-- 1 root root 6437 2016-02-07 20:16:59 /etc/apache2/sites-available/default-ssl.conf bls JobId 0: drwxr-xr-x 2 root root 4096 2016-02-14 02:12:07 /etc/apache2/sites-available/ 20-Feb 21:37 bls JobId 0: End of Volume at file 0 on device "DiscoLocal1" (/mnt/disco01), Volume "Volume-Diario-0020" 20-Feb 21:37 bls JobId 0: End of all volumes. 18 files found.
Como o comando bls apenas lista os arquivos/diretórios, é preciso utilizar o comando bextract para restaurar os dados do backup.
Sintaxe básica do comando bextract:
bextract -c /caminho/para/bacula-sd.conf -b /caminho/para/arquivo/bootstrap.bsr Nome_do_Device_ou_Caminho_do_Device Caminho_Para_Restaurar_Arquivo
O diretório onde os dados serão restaurados, precisa existir, caso contrário ocorrerá um um erro.
bextract -c /etc/bacula/bacula-sd.conf -b /etc/bacula/working/bacula-dir.restore.1.bsr -i /tmp/arquivos.txt /mnt/disco01 /tmp/bacula_restore bextract: butil.c:293-0 Using device: "/mnt/disco01" for reading. 20-Feb 21:58 bextract JobId 0: Ready to read from volume "Volume-Diario-0020" on file device "DiscoLocal1" (/mnt/disco01). 20-Feb 21:58 bextract JobId 0: Forward spacing Volume "Volume-Diario-0020" to file:block 0:206. bextract JobId 0: -rw-r--r-- 1 root root 258 2016-02-10 11:16:21 /tmp/bacula_restore/etc/hosts bextract JobId 0: -rw-r--r-- 1 root root 3492 2016-02-20 14:05:03 /tmp/bacula_restore/etc/bacula/pools.conf bextract JobId 0: -rw-r--r-- 1 root root 1839 2016-02-10 11:17:48 /tmp/bacula_restore/etc/bacula/schedules.conf bextract JobId 0: -rw-r--r-- 1 root root 1086 2016-02-10 11:17:48 /tmp/bacula_restore/etc/bacula/filesets.conf bextract JobId 0: -rw-r--r-- 1 root root 2945 2016-02-20 14:01:42 /tmp/bacula_restore/etc/bacula/clients-and-jobs/srv_bacula-fd.conf bextract JobId 0: -rw-r--r-- 1 root root 1348 2016-02-10 11:23:45 /tmp/bacula_restore/etc/bacula/clients-and-jobs/srv_firewall-fd.conf bextract JobId 0: -rw-r--r-- 1 root root 278 2016-02-10 11:17:48 /tmp/bacula_restore/etc/bacula/bconsole-wanderlei.conf bextract JobId 0: -rw-r----- 1 root root 266 2016-02-10 11:32:24 /tmp/bacula_restore/etc/bacula/bconsole.conf bextract JobId 0: -rw-r--r-- 1 root root 2118 2016-02-18 16:42:37 /tmp/bacula_restore/etc/bacula/clients-and-jobs.conf bextract JobId 0: -rw-r----- 1 root root 3699 2016-02-20 20:44:36 /tmp/bacula_restore/etc/bacula/bacula-sd.conf bextract JobId 0: -rw-r--r-- 1 root root 1347 2016-02-10 11:27:36 /tmp/bacula_restore/etc/bacula/messages.conf bextract JobId 0: -rwxr-x--- 1 root root 2323 2016-02-10 11:09:30 /tmp/bacula_restore/etc/bacula/scripts/mtx-changer.conf bextract JobId 0: -rw-r----- 1 root root 1575 2016-02-10 11:17:47 /tmp/bacula_restore/etc/bacula/bacula-dir.conf bextract JobId 0: -rw-r--r-- 1 root root 1389 2016-02-10 11:17:48 /tmp/bacula_restore/etc/bacula/counters.conf bextract JobId 0: -rw-r--r-- 1 root root 898 2016-02-20 20:47:14 /tmp/bacula_restore/etc/bacula/storages.conf bextract JobId 0: -rw-r----- 1 root root 1001 2016-02-10 11:17:47 /tmp/bacula_restore/etc/bacula/bacula-fd.conf bextract JobId 0: -rw-r--r-- 1 root root 1328 2016-02-14 02:12:07 /tmp/bacula_restore/etc/apache2/sites-available/000-default.conf bextract JobId 0: -rw-r--r-- 1 root root 6437 2016-02-07 20:16:59 /tmp/bacula_restore/etc/apache2/sites-available/default-ssl.conf bextract JobId 0: drwxr-xr-x 2 root root 4096 2016-02-14 02:12:07 *none* 20-Feb 21:58 bextract JobId 0: End of Volume at file 0 on device "DiscoLocal1" (/mnt/disco01), Volume "Volume-Diario-0020" 20-Feb 21:58 bextract JobId 0: End of all volumes. 18 files restored.
Se tudo ocorreu bem, seus arquivos foram restaurados com sucesso!
Excelente dica! Me ajudou a resolver um problema aqui.
Boa tarde,
Em um cenário de desastre, aonde meu bacula queimou porém tenho os volumes backapeados em um hd externo por exemplo, como consigo extrair os dados do volume nesse caso ?
Olá Rodrigo
Basta instalar o Bacula em uma nova máquina para que você tenha acesso aos utilitários BLS e BEXTRACT e executar os comandos:
bls /backup/disco01/Volume-Diario-0001
bextract /backup/disco01/Volume-Diario-0001 /tmp