Automatizando o Backup Oracle com RMAN

81 views 8:32 pm 0 Comments março 5, 2026

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 ArchivelogsCrosscheck (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 como EXPIRED.
  • 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!