(Parte 1 de 3)

script no Linux

Gerando backups físicos de banco de dados com o RMAN através de um shell

Olá,

No artigo anterior eu disponibilizei um script feito em "perl" para geração de backup lógico (FULL export) do banco de dados através dos utilitários de exportação (exp/expdp). Neste artigo irei disponibilizar um shell script para geração de backup físico através do utilitário RMAN (Recovery Manager). Para quem já conhece o RMAN, não precisa nem dizer que o mesmo é um utilitário usado no gerenciamento de operações de backup e na restauração e recuperação de bancos de dados Oracle.

Apesar do OEM Database Console (10g/11g) disponibilizar de forma simples e fácil uma interface para gerenciamento, configuração e agendamento de backups físicos do banco de dados, um script para geração de backups, em alguns casos, poderá ser bem útil.

No mais, o shell script (ou script em shell) demonstrado logo mais abaixo, tem como base o mesmo script fornecido pela instalação do Oracle Express Edition para Linux, mas com algumas alterações realizadas por mim de forma que sejam realizadas algumas operações tais como, backup completo do banco de dados juntamente com os arquivos de redo log arquivados (caso o banco esteja no modo ARCHIVELOG), deleção destes mesmos arquivos de redo log arquivados (após a realização do backup, deleção de backups obsoletos (dependendo da política de retenção utilizada), remoção de arquivos de backup expirados, geração do arquivo de inicialização em modo texto (pfile), geração de arquivo de log com o resultado dos comandos realizados pelo RMAN, entre outros.

Vale a pena salientar que este script foi testado nas versões do Oracle 10g e 11g e funcionará supondo que apenas uma instância de banco de dados esteja em execução tendo o arquivo de controle (control file) como repositório do RMAN, e que a Flash Recovery Area (FRA) esteja habilitada. O script também detecta o modo de operação do banco de dados alvo (ARCHIVELOG ou NOARCHIVELOG), pois para bancos de dados operando no modo NOARCHIVELOG, é necessário que seja realizado o shutdown do mesmo antes da realização do backup. Após a realização do backup, o banco de dados será reaberto. Para bancos de dados operando no modo ARCHIVELOG, o backup será realizado de forma online.

Dependendo da política de retenção utilizada, os backups dos arquivos de banco de dados serão armazenados na Flash Recovery Area e dois arquivos textos de log serão criados para armazenar os procedimentos realizados. Os arquivos de log serão criados em $HOME/log_rman_ultimo.log e $HOME/log_rman_anterior.log conforme demonstração logo mais abaixo. O script deverá ser executado com algum usuário de sistema operacional membro do grupo "dba", de preferência o usuário "oracle" e, poderá também quando necessário, ser agendado a sua execução através do utilitário de sistema operacional "cron".

-- Script de backup para uso do utilitário RMAN #!/bin/sh

# Este script assume que o usuário pode se conectar no banco de dados usando a sintaxe

# "/ as sysdba" e que a Flash Recovery Area esteja habilitada.

# Procedimento de Backup - RMAN

# Para bancos de dados operando no modo NOARCHIVELOG, será realizado o shutdown do banco

# de dados antes da realização do backup. Após a realização do backup, o banco de dados

# será reaberto.

#

# Para bancos de dados operando no modo ARCHIVELOG, o backup será realizado de forma

# online. Dependendo da política de retenção utilizada, os backups serão armazenados na

# Flash Recovery Area e dois arquivos textos de log serão criados para armazenar os

# procedimentos realizados. Os arquivos de log serão criados em

# $HOME/log_rman_ultimo.log e $HOME/log_rman_anterior.log user=/usr/bin/whoami group=/usr/bin/groups $user | grep dba if test -z "$group"; then echo A operação falhou. $user não é membro do grupo \'dba\'. exit 0 fi

TMPDIR=/tmp rman_backup_current=$HOME/log_rman_ultimo.log rman_backup_prev=$HOME/log_rman_anterior.log

#Criando um log temporário para a execução rman_backup=${TMPDIR}/rman_backup$$.log echo 'Log de Backup do RMAN' > $rman_backup

#Verificando se a flash recovery area está habilitada rman_fra=${TMPDIR}/rman_fra$$.log sqlplus /nolog > $rman_fra <<> connect / as sysdba; set head off; set echo off; set trimspool on; set linesize 512; select '$' || count(*) || '$' from v\$parameter where upper(name)='DB_RECOVERY_FILE_DEST' and value is not null; EOF fra=grep "$.*$" $rman_fra rm -f $rman_fra if [ X$fra = X\$1\$ ]; then failed=false; else failed=true errstr="A área de recuperação flash não está habilitada" fi;

#Verificando a localização da flash recovery area rman_fralocation=${TMPDIR}/rman_fralocation$$.log sqlplus /nolog > $rman_fralocation <<> connect / as sysdba; set head off; set echo off; set trimspool on; set linesize 512; select '$' || value || '$' from v\$parameter where upper(name)='DB_RECOVERY_FILE_DEST' and value is not null; EOF fralocation=grep "$.*$" $rman_fralocation fralocation=${fralocation#*$} fralocation=${fralocation%"$"*} rm -f $rman_fralocation

#Verificando o nome da instância do banco de dados rman_instancename=${TMPDIR}/rman_instancename$$.log sqlplus /nolog > $rman_instancename <<> connect / as sysdba; set head off; set echo off; set trimspool on; set linesize 512; select '$' || instance_name || '$' from v\$instance;

EOF instancename=grep "$.*$" $rman_instancename instancename=${instancename#*$} instancename=${instancename%"$"*} rm -f $rman_instancename if [ $failed = 'false' ] ; then

#Verificando o modo de operação do banco de dados rman_log_mode=${TMPDIR}/rman_log_mode$$.log sqlplus /nolog > $rman_log_mode <<> connect / as sysdba; set head off; set echo off; set trimspool on; set linesize 512; select '$' || log_mode || '$' from v\$database; EOF mode=grep "$.*$" $rman_log_mode rm -f $rman_log_mode case $mode in \$ARCHIVELOG\$) echo "Realizando Backup Online (ARCHIVELOG) do Banco de Dados..." rman target / >> $rman_backup <<> set echo on; show all; report schema; sql "create pfile=''$fralocation/init$instancename.ora'' from spfile"; crosscheck archivelog all; sql 'alter system archive log current'; backup full database plus archivelog delete all input; crosscheck backup; delete noprompt expired backup; delete noprompt obsolete; EOF if [ $? = 0 ]; then failed=false; else failed=true errstr="RMAN error: Veja o arquivo de log para mais detalhes" fi; ;;

\$NOARCHIVELOG\$) echo "Realizando Backup Offline (NOARCHIVELOG) do Banco de Dados..." rman target / >> $rman_backup <<> set echo on; show all; report schema; sql "create pfile=''$fralocation/init$instancename.ora'' from spfile"; shutdown immediate; startup mount; backup as backupset device type disk database; alter database open; crosscheck backup; delete noprompt expired backup; delete noprompt obsolete; EOF if [ $? = 0 ]; then failed=false; else failed=true errstr="RMAN error: Veja o arquivo de log para mais detalhes"

*) errstr="Modo de Banco de dados desconhecido: $mode" failed=true; ;; esac; fi;

#Gravando o erro no arquivo de log if [ $failed = 'true' ]; then echo ${errstr}. >> $rman_backup fi;

#Renomeando o último arquivo de log como anterior if [ -f $rman_backup_current ]; then mv -f $rman_backup_current $rman_backup_prev fi;

#Gravando o arquivo de log mv -f $rman_backup $rman_backup_current

echo 'Falha de backup de banco de dados '

#Mostrando o resultado para o usuário em caso de erro if [ $failed = 'true' ] ; then echo '===================== ERRO =========================' echo '===================== ERRO =========================' echo ${errstr}. echo O arquivo de log está em $rman_backup_current else echo Backup do banco de dados realizado com sucesso. echo O arquivo de log está em $rman_backup_current fi

O arquivo bkpora_rman criado abaixo contém o shell script acima que realizará o backup físico do banco de dados.

[oracle@linux u01]$ ls -l total 4 drwxrwx--- 3 oracle dba 4096 Set 30 15:14 app drwxr-xr-x 2 oracle dba 20480 Set 30 15:46 archive drwxr-xr-x 2 oracle dba 4096 Out 3 14:14 export drwxr-xr-x 3 oracle dba 4096 Out 5 14:2 flash -rwxr--r-- 1 oracle dba 5406 Out 6 08:12 bkpora_rman

Como já dito anteriormente, caso o usuário que esteja executando o script não for membro do grupo "dba", então o erro abaixo será emitido:

[oracle@linux u01]$ su -

[root@linux u01]# ./bkpora_rman

A operação falhou. root não é membro do grupo 'dba'.

Bom, voltando ao usário "oracle", irei realizar a execução do script shell como demonstrado abaixo. A propósito, caso a Flash Recovery Area não esteja habilitada, então o erro abaixo será emitido:

A área de recuperação flash não está habilitada O arquivo de log está em /home/oracle/log_rman_ultimo.log

No mais, irei checar algumas informações do banco de dados alvo antes de executar o script de backup:

[oracle@linux ~]$ sqlplus / as sysdba

Conectado a: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options

-- Verificando se a FRA está habilitada SQL> show parameter db_recovery

NAMETYPE VALUE
db_recovery_file_deststring /u01/flash
db_recovery_file_dest_sizebig integer 30G
Modo log de banco de dadosModo de Arquivamento
Arquivamento automáticoAtivado
Destino de arquivamento/u01/archive/
Próxima seqüência de log a arquivar9
Seqüência de log atual9

-- Verificando o modo de operação do banco de dados SQL> archive log list A seqüência de log on-line mais antiga 7

Após finalizada a verificação de algumas das informações acima, irei executar o script de backup como demonstrado abaixo:

Realizando Backup Online (ARCHIVELOG) do Banco de Dados

[oracle@linux u01]$ ./bkpora_rman Backup do banco de dados realizado com sucesso. O arquivo de log está em /home/oracle/log_rman_ultimo.log

Após a execução do backup, irei checar as informações do arquivo de log criado.

[oracle@linux ~]$ ls -l $HOME/*.log -rw-r--r-- 1 oracle oinstall 6755 Out 6 08:32 /home/oracle/log_rman_ultimo.log

[oracle@linux u01]$ cat /home/oracle/log_rman_ultimo.log Log de Backup do RMAN

(Parte 1 de 3)

Comentários