No artigo anterior, vimos como o RMAN é a ferramenta oficial e mais poderosa para proteção de dados Oracle. Agora, vamos colocar a “mão na massa”. Em ambientes de produção, não executamos backups manualmente; nós criamos sistemas de automação que garantem o funcionamento automático evitando assim as falhas oriundas de execuções manuais.
1. A Estratégia de Backup
Para este cenário, utilizaremos uma política comum em grandes corporações:
- Domingo: Backup Incremental Level 0 (Base para a semana).
- Segunda a Sábado: Backup Incremental Level 1 (Apenas o que mudou).
- Diariamente: Backup dos Archivelogs, Crosscheck (validação física) e limpeza de backups obsoletos.
2. O Shell Script Mestre (backup_rman.sh)
Este script é desenhado para ser genérico. Você só precisa ajustar as variáveis de ambiente no topo.
Bash
#!/bin/bash
# ----------------------------------------------------------------------
# Nome: backup_rman.sh
# Descrição: Backup Automatizado (Level 0 no Domingo, Level 1 nos demais)
# ----------------------------------------------------------------------
# --- Variáveis de Ambiente ---
export ORACLE_HOME=/u01/app/oracle/product/26.0.0/db_1
export ORACLE_SID=ORCL
export PATH=$PATH:$ORACLE_HOME/bin
export DATE=$(date +%Y%m%d_%H%M)
export LOG_DIR=/u01/app/oracle/admin/common/logs
export BACKUP_DIR=/u02/backup/rman
# Criar diretório de log se não existir [cite: 543]
mkdir -p $LOG_DIR
# --- Lógica do Nível do Backup ---
# 0 = Domingo, 1-6 = Segunda a Sábado
DAY_WEEK=$(date +%u)
if [ $DAY_WEEK -eq 7 ]; then
LEVEL=0
TYPE="FULL_INC_L0"
else
LEVEL=1
TYPE="DIFF_INC_L1"
fi
LOG_FILE=$LOG_DIR/backup_${TYPE}_${ORACLE_SID}_${DATE}.log
# --- Execução do RMAN ---
rman target / msglog $LOG_FILE <<EOF
RUN {
# Configuração de canais para performance
ALLOCATE CHANNEL c1 DEVICE TYPE DISK;
ALLOCATE CHANNEL c2 DEVICE TYPE DISK;
# Validação física dos arquivos existentes [cite: 1334]
CROSSCHECK BACKUP;
CROSSCHECK ARCHIVELOG ALL;
# Execução do Backup Incremental [cite: 5465]
BACKUP INCREMENTAL LEVEL $LEVEL
TAG 'BACKUP_${TYPE}'
DATABASE PLUS ARCHIVELOG DELETE INPUT;
# Manutenção da Política de Retenção [cite: 6297]
DELETE NOPROMPT OBSOLETE;
DELETE NOPROMPT EXPIRED BACKUP;
RELEASE CHANNEL c1;
RELEASE CHANNEL c2;
}
EXIT;
EOF
# --- Verificação de Erro ---
if [ $? -ne 0 ]; then
echo "ERRO: Backup RMAN falhou. Verifique o log: $LOG_FILE"
# Aqui você poderia adicionar um envio de e-mail/alerta (mailx)
else
echo "Sucesso: Backup $TYPE concluído."
fi
3. Anatomia dos Comandos Utilizados
- CROSSCHECK: Compara os metadados do RMAN com os arquivos físicos no disco. Se um arquivo foi apagado via
rm -rf, o RMAN o marca comoEXPIRED. - DELETE OBSOLETE: Apaga backups que não são mais necessários para cumprir sua regra de retenção (ex: manter backups dos últimos 7 dias).
- DELETE INPUT: Após fazer o backup do Archivelog, ele remove o arquivo original da área de arquivamento para economizar espaço.
4. Agendando no Linux (Crontab)
Para que o backup rode sozinho todas as noites às 22h00, adicione a seguinte linha no crontab do usuário oracle:
Bash
# Acessar a crontab: crontab -e
00 22 * * * /home/oracle/scripts/backup_rman.sh > /dev/null 2>&1
5. Dica de Especialista: Otimização com Block Change Tracking
Se o seu banco for muito grande, o backup Level 1 pode demorar para ler os datafiles em busca de blocos alterados. Considere habilitar o Block Change Tracking:
SQL> ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE '/u01/app/oracle/oradata/ORCL/bct_file.trc';
Isso faz com que o RMAN vá direto nos blocos alterados, reduzindo o tempo de backup em até 90%.
Se você precisa implementar uma rotina automatizada de backup, esta é a receita, faça os devidos ajustes, teste, teste e teste… e tudo estando certo coloque em prática.
Te vejo no próximo post!