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.
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 << EOF
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 << EOF
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 << EOF
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 << EOF
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 << EOF
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 << EOF
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"
fi;
;;
*)
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
#Mostrando o resultado para o usuário em caso de erro
if [ $failed = 'true' ] ; then
echo '===================== ERRO ========================='
echo ' Falha de backup de banco de dados '
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.
Após a execução do backup, irei checar as informações do arquivo de log criado.
[oracle@linux u01]$ ls -l
total 44
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:22 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 -
Senha: ******
[root@linux ~]# cd /u01
[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:
[oracle@linux u01]$ ./bkpora_rman
===================== ERRO =========================
Falha de backup de banco de dados
===================== ERRO =========================
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
SQL*Plus: Release 10.2.0.4.0 - Production on Ter Out 6 08:29:12 2009
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
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
NAME TYPE VALUE
------------------------------ ----------- -------------------
db_recovery_file_dest string /u01/flash
db_recovery_file_dest_size big integer 30G
-- Verificando o modo de operação do banco de dados
SQL> archive log list
Modo log de banco de dados Modo de Arquivamento
Arquivamento automático Ativado
Destino de arquivamento /u01/archive/
A seqüência de log on-line mais antiga 7
Próxima seqüência de log a arquivar 9
Seqüência de log atual 9
Após finalizada a verificação de algumas das informações acima, irei executar o script de backup como demonstrado abaixo:
[oracle@linux u01]$ ./bkpora_rman
Realizando Backup Online (ARCHIVELOG) do Banco de Dados...
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
Gerenciador de Recuperação: Release 10.2.0.4.0 - Production on Ter Out 6 08:36:59 2009
Copyright (c) 1982, 2007, Oracle. All rights reserved.
conectado ao banco de dados de destino: BD01 (DBID=2949935972)
RMAN>
eco ativado
RMAN> show all;
usar o arquivo de controle do banco de dados de destino em vez do catálogo de recuperação
os parâmetros de configuração RMAN são:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE ENCRYPTION FOR DATABASE OFF; # default
CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '$ORACLE_HOME/dbs/snapcf_BD01.f'; # default
RMAN> report schema;
Relatório do esquema do banco de dados
Lista de Arquivos de Dados Permanentes
======================================
File Size(MB) Tablespace RB segs Datafile Name
---- -------- -------------------- ------- ------------------------------------------
1 300 SYSTEM *** /u01/app/oracle/oradata/BD01/system01.dbf
2 200 UNDOTBS1 *** /u01/app/oracle/oradata/BD01/undotbs01.dbf
3 120 SYSAUX *** /u01/app/oracle/oradata/BD01/sysaux01.dbf
4 21 USERS *** /u01/app/oracle/oradata/BD01/users01.dbf
Lista de Arquivos Temporários
=============================
File Size(MB) Tablespace Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- ---------------------------------------
1 20 TEMP 32767 /u01/app/oracle/oradata/BD01/temp01.dbf
RMAN> sql "create pfile=''/u01/flash/initBD01.ora'' from spfile";
instrução sql: create pfile=''/u01/flash/initBD01.ora'' from spfile
RMAN> crosscheck archivelog all;
canal alocado: ORA_DISK_1
canal ORA_DISK_1: sid=147 devtype=DISK
validação bem-sucedida no log arquivado
nome do arquivo de log de arquivamento=/u01/archive/1_4_686230057.dbf id reg.=111 marc...
validação bem-sucedida no log arquivado
nome do arquivo de log de arquivamento=/u01/archive/1_5_686230057.dbf id reg.=112 marc...
validação bem-sucedida no log arquivado
nome do arquivo de log de arquivamento=/u01/archive/1_6_686230057.dbf id reg.=113 marc...
validação bem-sucedida no log arquivado
nome do arquivo de log de arquivamento=/u01/archive/1_7_686230057.dbf id reg.=114 marc...
validação bem-sucedida no log arquivado
nome do arquivo de log de arquivamento=/u01/archive/1_8_686230057.dbf id reg.=115 marc...
validação bem-sucedida no log arquivado
nome do arquivo de log de arquivamento=/u01/archive/1_9_686230057.dbf id reg.=116 marc...
Fez a verificação cruzada de 6 objetos
RMAN> sql 'alter system archive log current';
instrução sql: alter system archive log current
RMAN> backup full database plus archivelog delete all input;
Iniciando backup em 06/10/2009
log atual arquivado
utilizando o canal ORA_DISK_1
canal ORA_DISK_1: iniciando conjunto de backups de log de arquivamento
canal ORA_DISK_1: especificando log(s) de arquivamento no conjunto de backups
log de arquivamento thread de entrada=1 seqüência=4 id reg.=111 marcação=698859945
log de arquivamento thread de entrada=1 seqüência=5 id reg.=112 marcação=698859947
log de arquivamento thread de entrada=1 seqüência=6 id reg.=113 marcação=698859951
log de arquivamento thread de entrada=1 seqüência=7 id reg.=114 marcação=698859957
log de arquivamento thread de entrada=1 seqüência=8 id reg.=115 marcação=698859963
log de arquivamento thread de entrada=1 seqüência=9 id reg.=116 marcação=698927352
log de arquivamento thread de entrada=1 seqüência=10 id reg.=117 marcação=698929025
log de arquivamento thread de entrada=1 seqüência=11 id reg.=118 marcação=698929025
canal ORA_DISK_1: iniciando o componente 1 em 06/10/2009
canal ORA_DISK_1: componente 1 finalizado em 06/10/2009
handle de componente=/u01/flash/BD01/backupset/2009_10_06/o1_mf_annnn_TAG20091006T1057...
canal ORA_DISK_1: conjunto de backups concluído, tempo decorrido: 00:00:16
canal ORA_DISK_1: deletando log(s) de arquivamento
nome do arquivo de log de arquivamento=/u01/archive/1_4_686230057.dbf id reg.=111 marc...
nome do arquivo de log de arquivamento=/u01/archive/1_5_686230057.dbf id reg.=112 marc...
nome do arquivo de log de arquivamento=/u01/archive/1_6_686230057.dbf id reg.=113 marc...
nome do arquivo de log de arquivamento=/u01/archive/1_7_686230057.dbf id reg.=114 marc...
nome do arquivo de log de arquivamento=/u01/archive/1_8_686230057.dbf id reg.=115 marc...
nome do arquivo de log de arquivamento=/u01/archive/1_9_686230057.dbf id reg.=116 marc...
nome do arquivo de log de arquivamento=/u01/archive/1_10_686230057.dbf id reg.=117 mar...
nome do arquivo de log de arquivamento=/u01/archive/1_11_686230057.dbf id reg.=118 mar...
Finalizado backup em 06/10/2009
Iniciando backup em 06/10/2009
utilizando o canal ORA_DISK_1
canal ORA_DISK_1: iniciando conjunto de backup completo de arquivo de dados
canal ORA_DISK_1: especificando arquivo(s) de dados no conjunto de backups
fno=00001 name=/u01/app/oracle/oradata/BD01/system01.dbf do arquivo de dados de entrada
fno=00002 name=/u01/app/oracle/oradata/BD01/undotbs01.dbf do arquivo de dados de entrada
fno=00003 name=/u01/app/oracle/oradata/BD01/sysaux01.dbf do arquivo de dados de entrada
fno=00004 name=/u01/app/oracle/oradata/BD01/users01.dbf do arquivo de dados de entrada
canal ORA_DISK_1: iniciando o componente 1 em 06/10/2009
canal ORA_DISK_1: componente 1 finalizado em 06/10/2009
handle de componente=/u01/flash/BD01/backupset/2009_10_06/o1_mf_nnndf_TAG20091006T1057...
canal ORA_DISK_1: conjunto de backups concluído, tempo decorrido: 00:04:05
Finalizado backup em 06/10/2009
Iniciando backup em 06/10/2009
log atual arquivado
utilizando o canal ORA_DISK_1
canal ORA_DISK_1: iniciando conjunto de backups de log de arquivamento
canal ORA_DISK_1: especificando log(s) de arquivamento no conjunto de backups
log de arquivamento thread de entrada=1 seqüência=12 id reg.=119 marcação=698929289
canal ORA_DISK_1: iniciando o componente 1 em 06/10/2009
canal ORA_DISK_1: componente 1 finalizado em 06/10/2009
handle de componente=/u01/flash/BD01/backupset/2009_10_06/o1_mf_annnn_TAG20091006T1101...
canal ORA_DISK_1: conjunto de backups concluído, tempo decorrido: 00:00:05
canal ORA_DISK_1: deletando log(s) de arquivamento
nome do arquivo de log de arquivamento=/u01/archive/1_12_686230057.dbf id reg.=119 mar...
Finalizado backup em 06/10/2009
Iniciando Control File and SPFILE Autobackup em 06/10/2009
handle de componente=/u01/flash/BD01/autobackup/2009_10_06/o1_mf_s_698929294_5d6s61ws_...
Finalizado Control File and SPFILE Autobackup em 06/10/2009
RMAN> crosscheck backup;
utilizando o canal ORA_DISK_1
componente de backup submetido a verificação cruzada: localizado como 'AVAILABLE'
handle de componente de backup=/u01/flash/BD01/backupset/2009_10_06/o1_mf_annnn_TAG200...
componente de backup submetido a verificação cruzada: localizado como 'AVAILABLE'
handle de componente de backup=/u01/flash/BD01/backupset/2009_10_06/o1_mf_nnndf_TAG200...
componente de backup submetido a verificação cruzada: localizado como 'AVAILABLE'
handle de componente de backup=/u01/flash/BD01/backupset/2009_10_06/o1_mf_annnn_TAG200...
componente de backup submetido a verificação cruzada: localizado como 'AVAILABLE'
handle de componente de backup=/u01/flash/BD01/autobackup/2009_10_06/o1_mf_s_698929294...
Fez a verificação cruzada de 4 objetos
RMAN> delete noprompt expired backup;
utilizando o canal ORA_DISK_1
RMAN> delete noprompt obsolete;
a política de retenção RMAN será aplicada ao comando
a política de retenção RMAN está definida para a redundância 1
utilizando o canal ORA_DISK_1
Deletando os seguintes backups e cópias obsoletas:
Type Key Completion Time Filename/Handle
-------------------- ------ ------------------ ------------------------------------------
Conjunto de Backups 61 06/10/2009
Parte de Backup 61 06/10/2009 /u01/flash/BD01/backupset/2009_10_06/o1...
componente de backup deletado
handle de componente de backup=/u01/flash/BD01/backupset/2009_10_06/o1_mf_annnn_TAG200...
Deletou 1 objetos
RMAN>
Recovery Manager completo.
Irei realizar outro teste só que, agora, alterando o modo de operação do banco de dados para NOARCHIVELOG.
[oracle@linux u01]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.4.0 - Production on Ter Out 6 08:45:12 2009
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
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
SQL> shutdown immediate
Banco de dados fechado.
Banco de dados desmontado.
Instância ORACLE desativada.
SQL> startup mount
Instância ORACLE iniciada.
Total System Global Area 155189248 bytes
Fixed Size 1266320 bytes
Variable Size 113249648 bytes
Database Buffers 37748736 bytes
Redo Buffers 2924544 bytes
Banco de dados montado.
SQL> alter database noarchivelog;
Banco de dados alterado.
SQL> alter database open;
Banco de dados alterado.
SQL> archive log list
Modo log de banco de dados Modo Sem Arquivamento
Arquivamento automático Desativado
Destino de arquivamento /u01/archive/
A seqüência de log on-line mais antiga 11
Seqüência de log atual 13
SQL> exit
Desconectado de Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Apenas para fins de demonstração, caso eu tente realizar o backup do banco de dados sem antes realizar o shutdown do mesmo, o RMAN irá emitir um erro como demonstrado abaixo:
[oracle@linux ~]$ rman target /
Gerenciador de Recuperação: Release 10.2.0.4.0 - Production on Ter Out 6 09:10:49 2009
Copyright (c) 1982, 2007, Oracle. All rights reserved.
conectado ao banco de dados de destino: BD01 (DBID=2949935972)
RMAN> backup database;
Iniciando backup em 06/10/2009
usar o arquivo de controle do banco de dados de destino em vez do catálogo de recuperação
canal alocado: ORA_DISK_1
canal ORA_DISK_1: sid=147 devtype=DISK
canal ORA_DISK_1: iniciando conjunto de backup completo de arquivo de dados
canal ORA_DISK_1: especificando arquivo(s) de dados no conjunto de backups
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: falha do comando backup no canal de ORA_DISK_1 em 06/10/2009 09:11:12
ORA-19602: não pode copiar ou fazer backup de arquivo ativo no modo NOARCHIVELOG
RMAN> exit
Recovery Manager completo.
Como mencionado anteriormente, o script de backup irá detectar o modo de operação do banco de dados, então o mesmo automaticamente irá realizar o shutdown da instância caso o banco de dados esteja configurado para operar no modo NOARCHIVELOG e, após a realização do backup, o script irá realizar o startup da instância e abertura do banco de dados.
[oracle@linux u01]$ ./bkpora_rman
Realizando Backup Offline (NOARCHIVELOG) do Banco de Dados...
Backup do banco de dados realizado com sucesso.
O arquivo de log está em /home/oracle/log_rman_ultimo.log
-- Verificando o arquivo de log gerado
[oracle@linux u01]$ cat /home/oracle/log_rman_ultimo.log
Log de Backup do RMAN
Gerenciador de Recuperação: Release 10.2.0.4.0 - Production on Ter Out 6 09:23:56 2009
Copyright (c) 1982, 2007, Oracle. All rights reserved.
conectado ao banco de dados de destino: BD01 (DBID=2949935972)
RMAN>
eco ativado
RMAN> show all;
usar o arquivo de controle do banco de dados de destino em vez do catálogo de recuperação
os parâmetros de configuração RMAN são:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE ENCRYPTION FOR DATABASE OFF; # default
CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '$ORACLE_HOME/dbs/snapcf_BD01.f'; # default
RMAN> report schema;
Relatório do esquema do banco de dados
Lista de Arquivos de Dados Permanentes
======================================
File Size(MB) Tablespace RB segs Datafile Name
---- -------- -------------------- ------- ------------------------------------------
1 300 SYSTEM *** /u01/app/oracle/oradata/BD01/system01.dbf
2 200 UNDOTBS1 *** /u01/app/oracle/oradata/BD01/undotbs01.dbf
3 120 SYSAUX *** /u01/app/oracle/oradata/BD01/sysaux01.dbf
4 21 USERS *** /u01/app/oracle/oradata/BD01/users01.dbf
Lista de Arquivos Temporários
=============================
File Size(MB) Tablespace Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- ---------------------------------------
1 20 TEMP 32767 /u01/app/oracle/oradata/BD01/temp01.dbf
RMAN> sql "create pfile=''/u01/flash/initBD01.ora'' from spfile";
instrução sql: create pfile=''/u01/flash/initBD01.ora'' from spfile
RMAN> shutdown immediate;
banco de dados fechado
banco de dados desmontado
encerramento de instância Oracle
RMAN> startup mount;
conectado ao banco de dados de destino (não iniciado)
instância Oracle iniciada
banco de dados montado
Total da Área Global do Sistema 155189248 bytes
Fixed Size 1266320 bytes
Variable Size 113249648 bytes
Database Buffers 37748736 bytes
Redo Buffers 2924544 bytes
RMAN> backup as backupset device type disk database;
Iniciando backup em 06/10/2009
canal alocado: ORA_DISK_1
canal ORA_DISK_1: sid=157 devtype=DISK
canal ORA_DISK_1: iniciando conjunto de backup completo de arquivo de dados
canal ORA_DISK_1: especificando arquivo(s) de dados no conjunto de backups
fno=00001 name=/u01/app/oracle/oradata/BD01/system01.dbf do arquivo de dados de entrada
fno=00002 name=/u01/app/oracle/oradata/BD01/undotbs01.dbf do arquivo de dados de entrada
fno=00003 name=/u01/app/oracle/oradata/BD01/sysaux01.dbf do arquivo de dados de entrada
fno=00004 name=/u01/app/oracle/oradata/BD01/users01.dbf do arquivo de dados de entrada
canal ORA_DISK_1: iniciando o componente 1 em 06/10/2009
canal ORA_DISK_1: componente 1 finalizado em 06/10/2009
handle de componente=/u01/flash/BD01/backupset/2009_10_06/o1_mf_nnndf_TAG20091006T1118...
canal ORA_DISK_1: conjunto de backups concluído, tempo decorrido: 00:04:29
Finalizado backup em 06/10/2009
Iniciando Control File and SPFILE Autobackup em 06/10/2009
handle de componente=/u01/flash/BD01/autobackup/2009_10_06/o1_mf_s_698930288_5d6tfssw_...
Finalizado Control File and SPFILE Autobackup em 06/10/2009
RMAN> alter database open;
banco de dados aberto
RMAN> crosscheck backup;
utilizando o canal ORA_DISK_1
componente de backup submetido a verificação cruzada: localizado como 'AVAILABLE'
handle de componente de backup=/u01/flash/BD01/backupset/2009_10_06/o1_mf_nnndf_TAG200...
componente de backup submetido a verificação cruzada: localizado como 'AVAILABLE'
handle de componente de backup=/u01/flash/BD01/backupset/2009_10_06/o1_mf_annnn_TAG200...
componente de backup submetido a verificação cruzada: localizado como 'AVAILABLE'
handle de componente de backup=/u01/flash/BD01/autobackup/2009_10_06/o1_mf_s_698929294...
componente de backup submetido a verificação cruzada: localizado como 'AVAILABLE'
handle de componente de backup=/u01/flash/BD01/backupset/2009_10_06/o1_mf_nnndf_TAG200...
componente de backup submetido a verificação cruzada: localizado como 'AVAILABLE'
handle de componente de backup=/u01/flash/BD01/autobackup/2009_10_06/o1_mf_s_698930288...
Fez a verificação cruzada de 5 objetos
RMAN> delete noprompt expired backup;
utilizando o canal ORA_DISK_1
RMAN> delete noprompt obsolete;
a política de retenção RMAN será aplicada ao comando
a política de retenção RMAN está definida para a redundância 1
utilizando o canal ORA_DISK_1
Deletando os seguintes backups e cópias obsoletas:
Type Key Completion Time Filename/Handle
-------------------- ------ ------------------ ------------------------------------------
Conjunto de Backups 62 06/10/2009
Parte de Backup 62 06/10/2009 /u01/flash/BD01/backupset/2009_10_06/o1...
Conjunto de Backups 63 06/10/2009
Parte de Backup 63 06/10/2009 /u01/flash/BD01/backupset/2009_10_06/o1...
Conjunto de Backups 64 06/10/2009
Parte de Backup 64 06/10/2009 /u01/flash/BD01/autobackup/2009_10_06/o...
componente de backup deletado
handle de componente de backup=/u01/flash/BD01/backupset/2009_10_06/o1_mf_nnndf_TAG200...
componente de backup deletado
handle de componente de backup=/u01/flash/BD01/backupset/2009_10_06/o1_mf_annnn_TAG200...
componente de backup deletado
handle de componente de backup=/u01/flash/BD01/autobackup/2009_10_06/o1_mf_s_698929294...
Deletou 3 objetos
RMAN>
Recovery Manager completo.
Após finalizado o backup físico, poderemos checar através do RMAN as informações sobre o backup que foi realizado.
[oracle@linux flash]$ rman target /
Gerenciador de Recuperação: Release 10.2.0.4.0 - Production on Ter Out 6 09:35:16 2009
Copyright (c) 1982, 2007, Oracle. All rights reserved.
conectado ao banco de dados de destino: BD01 (DBID=2949935972)
RMAN> list backup of database;
usar o arquivo de controle do banco de dados de destino em vez do catálogo de recuperação
Lista de Conjuntos de Backup
============================
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ -------------------------------------
67 Full 289.28M DISK 00:03:01 06/10/2009
Chave BP: 67 Status: AVAILABLE Compactado: NO Tag: TAG20091006T112920
Nome do Componente: /u01/flash/BD01/backupset/2009_10_06/o1_mf_nnndf_TAG200910...
Lista de Arquivos de Dados no conjunto de backup 67
File LV Type Ckp SCN Tempo de Verif. Name
---- -- ---- ---------- --------------- ------------------------------------------
1 Full 258379 06/10/2009 /u01/app/oracle/oradata/BD01/system01.dbf
2 Full 258379 06/10/2009 /u01/app/oracle/oradata/BD01/undotbs01.dbf
3 Full 258379 06/10/2009 /u01/app/oracle/oradata/BD01/sysaux01.dbf
4 Full 258379 06/10/2009 /u01/app/oracle/oradata/BD01/users01.dbf
RMAN> list backup summary;
Lista de Backups
================
Key TY LV S Device Type Completion Time #Pieces #Copies Compressed Tag
------- -- -- - ----------- --------------- ------- ------- ---------- ------------------
67 B F A DISK 06/10/2009 1 1 NO TAG20091006T112920
68 B F A DISK 06/10/2009 1 1 NO TAG20091006T113229
-- Verificando o conteúdo do diretório /u01/flash/
[oracle@linux /]$ cd /u01/flash/
[oracle@linux flash]$ ls -l
total 8
drwxr-x--- 4 oracle dba 4096 Out 6 08:37 BD01
-rw-r--r-- 1 oracle oinstall 1043 Out 6 08:38 initBD01.ora
Por fim, é altamente recomendável copiar os arquivos de backup para um local seguro, logo assim que o procedimento de backup for finalizado.
16 comentários:
Oi Eduardo, boa noite...
Não conseguí resolver um erro conforme abaixo:
line 40: syntax error near unexpected token `>'
line 40: `sqlplus /nolog > $rman_fra <<> '
#Verificando se a flash recovery area está habilitada
rman_fra=${TMPDIR}/rman_fra$$.log
sqlplus /nolog > $rman_fra <<>
Grato
Enchaves
Olá Enchaves,
São essas malditas tags ... O blogger acha que isso é uma tag HTML e acaba estragando o script ...
Seguem abaixo os códigos corretos:
sqlplus /nolog > $rman_fra << EOF
sqlplus /nolog > $rman_fralocation << EOF
Abraços e até mais ...
Olá Enchaves,
Após uma re-publicação do artigo, me parece que o problema das tags foram solucionadas.
Abraços e até mais ...
Prezado Eduardo Bom Dia!
quando rodo ( ./bkpora_rman) o seu script para gerar backups físicos com o rman, ele funciona perfeitamente.
Entretanto, o mesmo está agendado no cron (00 2 * * * /bin/sh /u01/bkpora_rman) e não é executado, dizendo no log que: "A Area de recuperacao flash nao esta habilitada."
No entanto:
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
Alguma dica para este mistério!
Agradecido antecipadamente por sua gentileza,
Allan
Olá Allan,
Humm ... se executando manualmente funciona. Veja se você consegue encontar alguma mensagem em /var/mail/oracle;
if [ X$fra = X\$1\$ ]; then
failed=false;
else
failed=true
errstr="A área de recuperação flash não está habilitada"
fi;
De acordo com o código acima, a variável $fra por algum motivo está vindo vazia. Tente trocar
de
00 2 * * * /bin/sh /u01/bkpora_rman
para
00 2 * * * /u01/bkpora_rman
Qualquer coisa, fique à vontade para alterar o código do jeito que quiser ;-)
Abraços e até mais
Olá Eduardo,
problema com o script resolvido!
Acrescentei as variáveis do meu .bash_profile no início do script.
O que creio poderia também ser resolvido colocando as variáveis do caminho no início do próprio cron.
Mais uma vez agradecido por sua atenção.
Allan
Olá Eduardo
Trabalho com banco de dados Oracle 11gr2(RAC) todos em archivelog mode. Estou começando ainda não entendo muito bem, de vez enquando tenho problemas na execução de backups por não ter espaço suficiente em disco ou fita, gostaria de saber se posso utilizar os comandos:Crosscheck, Delete expired backup, Delete obsolete sem correr o risco de perder dados importantes.
Agradeço desde já pela sua atenção
Olá Magnun,
Problemas de espaço em disco em rotinas de backup usando o RMAN podem estar diretamente ligados a alguns fatores como: Tamanho insuficiente especificado na FRA (Flah recovery area) caso ela esteja sendo utilizada para acomodar os backups, política de retenção alta sendo que o espaço para armazená-los é insuficiente, retenção de backups antigos sem necessidade, entre outros. Você tem que avaliar quais desses problemas estão acontecendo. O comando DELETE OBSOLETE vai apagar os backups que não fazem mais parte da sua política de retenção (RECOVERY WINDOW, por exemplo) e poderão ser excluídos. o CROSSCHECK apenas verifica se os arquivos de backup realmente existem no local. Caso eles não existam o DELETE EXPIRED vai removê-los do controlfile. As rotinas de backup FULL que eu utilizo costumam ter os seguintes comandos na sequência abaixo:
1-crosscheck archivelog all;
2-delete noprompt expired archivelog all;
3-backup full database include current controlfile tag = 'FULL' plus archivelog delete all input tag = 'ARCHIVES';
4-crosscheck backup;
5-delete noprompt expired backup;
6-delete noprompt obsolete;
Abraços
Legatti
Eduardo Bom Dia!
quando rodo ( ./bkpora_rman) dentro da pasta /usr/bin o seu script para gerar backups físicos com o rman, ele funciona perfeitamente.
Entretanto, o mesmo está agendado no cron (00 1 * * * bkpora_rman) e não é executado
deixo esse script dentro da pasta /usr/bin, igual ao script que vc fez para backup logico em perl.
Alguma dica para rodar automaticamente??
ate mais..
Olá Manoel,
Talvez tenha alguma relação com variável de ambiente do usuário oracle. Tente forçar a execução do arquivo .profile ou .bash_profile do usuário oracle. Coloque no início do script a linha abaixo.
. ~/.bash_profile
Abraços,
Legatti
Eduardo. Consegui colocar assim no cron:
00 1 * * * su - Oracle - c bkpora_rman. Mais vc fala para colocar essa linha . ~/.bash_profile sem o # ??
O seu usuário oracle está começando com O maiúsculo. É isso? No caso do meu comentário anterior é sem # mesmo. Apenas para forçar a execução do profile.
Pode por o caminho completo também.
/home/oracle/.bash_profile
No mais, tente achar algum logo do crontab que mostre o que está dando errado.
Vc está executando com root em vez do oracle? Tente colocar no crontab do próprio Oracle.
No caso do usuário Oracle foi na digitação.rrsrsrs
No meu contrab está assim:
00 1 * * * su - orcale - c bkpora_rman
E funcionou perfeitamente.
Retificando:
00 1 * * * su - oracle - c bkpora_rman
E meu usuário que está executando e oracle.
Se o crontab já é do usuário oracle, apesar de não atrapalhar, acredito que não precisaria executar usando a opção -c.
bastaria apenas:
00 1 * * * /usr/bin/bkpora_rman
Não Eduardo, o meu crontab e do root, o meu Script bpkora_rman que e do usuário oracle:dba. Todos regras são executados no crontab do root. Por isso testei o su - oracle -c e acabou dando certo. Vou testar linha que vc me passou também.
Postar um comentário