Backup DB2 com bpipe e Bacula Community

O bpipe é um plugin genérico do Bacula Community que permite configurar um script de backup de praticamente qualquer aplicação enviando os dados diretamente para o Bacula através de um Named Pipe (FIFO), sem a necessidade de salvar nenhum dado na máquina do cliente.

Temos um curso no Udemy apenas sobre o bpipe, com vários exemplos, tais como backup de bancos de dados MySQL, PostgreSQL, Firebird, LDAP; Máquinas Virtuais do Xen, KVM, Proxmox; Caixas de Correio do Zimbra, dentro outros.

O bpipe também está presente no Bacula Enterprise, mas o mesmo já contém o plugins para mais de 20 aplicações específicas, com recursos mais automatizados e técnicas mais avançads na redução no tamanho destes backups.

Todos os procedimentos de backup e restauração do bpipe devem ser testados antes de serem implementados em ambientes de produção. Qualquer feedback é apreciado.

Configuração

Ativando o Backup Incremental do DB2

Para especificar se o backup incremental está ativado para um banco de dados, use o parâmetro de configuração TRACKMOD. Esse parâmetro especifica se o gerenciador do banco de dados rastreará as modificações do banco de dados para que o utilitário de backup possa detectar quais subconjuntos do banco de dados devem ser examinados por um backup incremental e possivelmente incluídos na imagem de backup.

O parâmetro de configuração TRACKMOD pode ter um dos dois valores a seguir:

  • NÃO – O backup incremental não é permitido. As atualizações da página do banco de dados não são rastreadas ou registradas de qualquer forma. Este é o valor padrão.
  • SIM – o backup incremental é permitido. Quando o rastreamento de atualização está ativado, a alteração se torna efetiva quando a primeira conexão bem-sucedida ao banco de dados é feita. Esteja ciente de que, antes que um backup incremental possa ser feito em um espaço de tabela específico, é necessário um backup completo desse espaço de tabela (mais detalhes sobre isso seguem o exemplo abaixo).

O exemplo a seguir mostra como você ativaria o backup incremental:

DB2 UPDATE DATABASE CONFIGURATION FOR DBNAME USING TRACKMOD YES

É possível usar algo como o script a seguir para ativar o TRACKMOD igual a YES para todos os bancos de dados DB2:

db2user=db2inst1
for dbname in $(su - $db2user -c "db2 list database directory" | grep Indirect -B 5 |grep "Database alias"| awk {'print $4'} |sort -u | uniq); do
su - $db2user -c "db2 UPDATE DATABASE CONFIGURATION FOR $dbname USING TRACKMOD YES"
done

Se ainda não estiver configurado, também é necessário ativar o modo de log de archive para cada banco de dados. Por exemplo.

su - db2inst1 -c "db2 update db configuration for DBNAME using logarchmeth1 disk:/var/db2"

Agora é possível executar diferencial (a IBM chama de incremental) e incremental (backup delta).

Configuração bpipe

O script de shell a seguir é usado para informar o Bacula sobre quais configurações de bpipe usarão para a tarefa de backup durante a execução.

Ele recebe o nível do Job de backup, obtém todos os bancos de dados existentes do DB2, cria pipes nomeados para cada base e imprime as configurações do FileSet do bpipe para o Bacula Job.

#!/bin/bash
#
# /opt/bacula/etc/db2_bacula.txt
#
# Script to generate Bacula FileSet bpipe syntax configuration in order to backup
# all db2 databases from an instance 
#
# Autorship: Heitor Faria (Copyleft: all rights reversed).
# Advisor: Julio Neves Shell Script Teacher - julio.neves@gmail.com
# Tested by: Heitor Faria
# 
# It must be called at the FileSet INCLUDE Sub-resource, used by the job that 
# backups DB2 machine and contains a Bacula Client, like this (e.g.):
#
# Plugin = "\|/opt/bacula/etc/db2_bacula.txt %l"
#
# The following example shows how you would enable DB2 incremental backup and archive log, required by this script:
# 
# su - db2inst1 -c "db2 UPDATE DATABASE CONFIGURATION FOR DBNAME USING TRACKMOD YES"
# su - db2inst1 -c "db2 update db configuration for DBNAME using logarchmeth1 disk:/var/db2"
#

level=$1
db2user=db2inst1
pipedir=/mnt/pipe

# test if pipedir exists or create it
[[ -d "$pipedir" ]] || mkdir -p $pipedir

# verify backup level and set db2 backup command options
if [ $level == Differential ] 
then
options="INCREMENTAL"
fi

if [ $level == Incremental ] 
then
options="INCREMENTAL DELTA"
fi

# creates named pipes, calls db2 backup and configures Bacula bpipe
for dbname in $(su - $db2user -c "db2 list database directory" | grep Indirect -B 5 |grep "Database alias"| awk {'print $4'} |sort -u)
do
[ -p $pipedir/$dbname ] || {
mkfifo $pipedir/$dbname
chown $db2user $pipedir/$dbname
}
su - $db2user -c "db2 -r /tmp/db2bkp.log +o BACKUP DATABASE $dbname ONLINE $options TO $pipedir/$dbname WITHOUT PROMPTING" & 2>&- 
echo "bpipe:$pipedir/$dbname.db2.$level:cat $pipedir/$dbname && rm -f $pipedir/$dbname:dd of=/tmp/$dbname.db2.$level"
done

Depois de salvar um script em uma pasta (por exemplo: /opt/bacula/etc/db2_bacula.txt), crie um novo Bacula FileSet com a seguinte linha Include:

Plugin = "\|/opt/bacula/etc/db2_bacula.txt %l"

É importante testar todos os comandos de script no shell. Execute Jobs de testes de backup e restauração, e inicie o bacula-fd no modo de depuração se aparecer algum erro.

Se desejar restaurar o backup do banco diretamente para o db2, substitua o comando de restauração do bpipe pelo seguinte:

dd of=/tmp/$dbname.db2.$level && su - $db2user -c 'db2 restore db $dbname from /tmp/$dbname.db2.$level replace existing' && rm -f /tmp/$dbname.db2.$level

Referências

Using DB2 incremental backup – https://www.ibm.com/developerworks/data/library/techarticle/dm-0910db2incrementalbackup/index.html

Disponível em: pt-brPortuguêsenEnglish (Inglês)esEspañol (Espanhol)

Deixe uma resposta