Caros usuários, saudações! Nesse artigo iremos abordar uma recuperação
full do banco de dados. Para isso, utilizaremos o RMAN no procedimento
de backup e restore.
É INADMISSÌVEL a um profissional Oracle desconhecer
essa ferramenta. Se você desconhece, minha sugestão é que
você procure obter informações a respeito
do funcionamento dela.
É possível acessá-la de duas maneiras:
. Com
catálogo
. Sem catálogo
Esse artigo se restringe ao acesso SEM USO DO CATÁLOGO,
mas, sempre que possível, faça uso do catálogo
ro RMAN. Para isso é necessário que, em outra máquina
você possua um banco de dados para armazenar o catalogo.
O colunista Rodrigo Almeida está disponibilizando um
excelente material sobre o catálogo do RMAN.
Mãos a obra…
Preparação do Ambiente
A primeira coisa a fazer, é confirmar a utilização
do banco de dados no modo archivelog. Para isso, utilizando o
SQLPLUS, siga conforme abaixo:
C:\>sqlplus /nolog SQL*Plus: Release 10.2.0.1.0 – Production on Mon Copyright (c) 1982, 2005, SQL> conn / as sysdba |
Caso não esteja, é necessário ativá-lo,
para isso, consulte o artigo publicado anteriormente.
De forma a melhor mostrar a utilização da restauração
do banco de dados, iremos criar uma tabela com a seguinte estrutura:
SQL> desc estudo.insert_time; SQL> select count(1) from estudo.insert_time COUNT(1) 1 row selected. |
Essa tabela será utilizada para a geração
de registros a cada minuto, de forma a melhor exemplificar o recover
database until time.
Iremos utilizar o script abaixo para fazer a inserção
do registro no banco de dados.
insert_time.sql insert into estudo.insert_time(data_insercao) values (sysdate); commit; exit; |
O script abaixo, é apenas uma forma de facilitar a chamada
para a inserção dos registros.
script_insert.bat sqlplus "/ as sysdba" @c:\imasters\insert_time.sql |
É preciso fazer um backup full de um momento anterior
ao do provável problema.
Ex: Você precisa voltar o banco de dados da empresa para
o estado em que ele se encontrava no dia 21/12/2006 às
08:00. Imaginando que seus backups são realizados todos
os dias às 19:00, significa dizer que é necessário
voltar o backup que foi disparado no dia 20/12/2006 às
19:00 e aplicar os archivelogs até o dia 21/12/2006 às
08:00.
Nesse momento, iremos precisar do RMAN para realizar o backup.
Para acessar o utilitário, através da console,
execute:
C:\>rman target / Recovery Manager: Release 10.2.0.1.0 – Production Copyright (c) 1982, 2005, connected to target database: ORCL (DBID=1125663715) RMAN> |
O comando SHOW ALL, revela informações
interessantes.
RMAN> show all; RMAN configuration parameters are: RMAN> |
Existem alguns pontos a serem observados na configuração
do RMAN. É de muita importância o backup do controlfle
e do spfile. Para isso você deve configurar o autobackup
do controlfile.
RMAN> CONFIGURE CONTROLFILE old RMAN configuration parameters: RMAN> |
Isso automatiza o backup do controlfile, é recomendado
que esteja ON.
Outra configuração importante é a localização
do backup do controlfile. Para isso configure a localização
do backup do controlfile.
RMAN> CONFIGURE CONTROLFILE old RMAN configuration parameters: |
Conforme a configuração realizada no RMAN, o backup
do arquivo de controlfile é composto por quatro informações:
C – Significa que o arquivo armazena o backup do controlfile
e spfile
9999999999 – É o DBID da instância,
muito utilizado quando é preciso recuperar o spfile.
YYYYMMDD – Ano,
mês e dia de geração
do arquivo.
99 – Seqüência de geração
do arquivo, inicia em 00. A seqüência é zerada
a cada dia.
Confirmando as modificações no RMAN.
RMAN> SHOW ALL; RMAN configuration parameters are: |
Realizando o backup full
RUN { ALLOCATE CHANNEL c1 DEVICE TYPE DISK; ALLOCATE CHANNEL c2 DEVICE TYPE DISK; BACKUP AS COMPRESSED BACKUPSET DATABASE TAG ‘DB_LEVEL0_WHOLE’ FORMAT ‘c:\backup\%d_%I_level0_%s_%p_%u.bkp’ PLUS ARCHIVELOG TAG ‘ARCHIVEDLOGS’ FORMAT ‘c:\backup\%d_%I_arch_%s_%p_%u.bkp’; RELEASE CHANNEL c1; RELEASE CHANNEL c2; } |
No exemplo acima, são utilizados dois canais C1 e C2.
Percebam que, dependendo das características do hardware
pode ser utilizado um número maior de canais, mas isso
deve ser avaliado com cuidado para não gerar uma carga
excessiva no ambiente.
Após alocar os canais, foi utilizado o comando para a
realização do backup, perceba também a utilização
do comando COMPRESSED, é de se imaginar que esse comando
irá compactar o backup. Isso irá gerar uma carga
a mais no momento da recuperação, uma vez que será necessário
descompactar o backup.
Ao backup dos datafiles foi data uma TAG DB_LEVEL0_WHOLE, essa é uma
forma de localizar o backup utilizando comandos do RMAN. A cláusula
format determina onde os backups dos datafiles devem ser armazenados.
O comando PLUS ARCHIVELOG executa o switch logfile de forma
automática ao final do backup, e dessa forma armazenar
os archives gerados após o início do backup.
Perceba uma ligeira diferença na cláusula format
dos archivelogs, isso foi feito de forma a facilitar a identificação
do tipo de arquivo armazenado.
allocated channel: c1 allocated channel: c2 Starting backup at 25-DEC-06 |
Foi criada uma tarefa no windows de forma a executar o arquivo script_insert.bat a
cada minuto, durante 1 hora. Isso irá gerar 60 registros
na tabela INSERT_TIME.
SQL> select count(1) COUNT(1) 1 row selected. |
Agora que estamos com o ambiente preparado, vamos iniciar o
processo de recuperação.
A primeira coisa a fazer é restaurar o controlfile do último
backup full, ou seja, o que foi realizado algumas linhas acima.
C:\>cd \backup C:\backup>dir Directory of C:\backup 25/12/2006 20:55 <DIR> . |
Fazendo o Restore do Controlfile
O controlfile possui principalmente informações
referentes ao caminho dos datafiles, além de outras informações
necessárias a recuperação. A primeira coisa
a fazer é realizar o shutdown do banco
de dados:
C:\>rman target / Recovery Manager: Release 10.2.0.1.0 – Production Copyright (c) 1982, 2005, connected to target database: ORCL (DBID=1125663715) RMAN> shutdown immediate; using target database control file instead of RMAN> |
Em seguida, inicie o banco no modo nomount:
RMAN> startup nomount; connected to target database (not started) Total System Global Area 293601280 Fixed Size 1248624 RMAN> |
Execute a recuperação do controlfile:
RMAN> restore controlfile Starting restore at 26-DEC-06 channel ORA_DISK_1: restoring control file RMAN> |
Vale lembrar que, o controlfile recuperado deve ter sido gerado
em um backup anterior ao problema. Quanto mais distante do momento
que se deseja recuperar o banco de dados, mais arquivos de logs
precisaram ser aplicados.
Agora vamos iniciar o banco no modo mount:
RMAN> startup force Oracle instance started Total System Global Area 293601280 Fixed Size 1248624 RMAN> |
Ainda no RMAN, vamos recuperar o banco de dados até o
seu estado no dia 24/12/2006 às 18:30:00.
run allocated channel: c1 allocated channel: c2 executing command: SET until clause Starting restore at 26-DEC-06 channel c1: starting datafile backupset restore released channel: c1 released channel: c2 RMAN> Restauramos os datafiles RMAN> RECOVER DATABASE until time "TO_DATE(’24-12-2006 Starting recover at 26-DEC-06 starting media recovery archive log thread 1 sequence 3 is already on RMAN> |
Agora iremos abrir o banco com RESET LOGS.
O comando ALTER DATABASE OPEN RESETLOGS, irá criar
os arquivos de redologs, de acordo com a configuração
armazenada no controlfile.
RMAN> alter database database opened RMAN> select to_char(max(data_insercao),’DD-MM-YYYY TO_CHAR(MAX(DATA_IN 1 row selected. |
Caso você deseje se aproximar um pouco mais do momento
do problema, precisará restaurar o controlfile novamente,
restaurar os datafiles, e recuperar o banco informando uma hora
mais próxima.
Vamos voltar o banco ao estado em que ele se encontrava as 18:45
do dia 24/12/2006.
RMAN> shutdown immediate; database closed RMAN> RMAN> startup nomount; connected to target database (not started) Total System Global Area 293601280 Fixed Size 1248624 RMAN> |
Restaure o controlfile mais próximo.
RMAN> restore controlfile Starting restore at 26-DEC-06 channel ORA_DISK_1: restoring control file RMAN> |
Inicie o banco no modo mount.
RMAN> startup force Oracle instance started Total System Global Area 293601280 Fixed Size 1248624 RMAN> |
Faça o restore dos datafiles.
run allocated channel: c1 allocated channel: c2 executing command: SET until clause Starting restore at 26-DEC-06 channel c1: starting datafile backupset restore released channel: c1 released channel: c2 RMAN> |
Faça o recover até o momento desejado.
RMAN> RECOVER DATABASE until time "TO_DATE(’24-12-2006 Starting recover at 26-DEC-06 starting media recovery archive log thread 1 sequence 3 is already on |
Abra o banco com resetlogs.
RMAN> alter database database opened RMAN> |
Fazendo o mesmo select feito anterior, teremos:
select to_char(max(data_insercao),’DD-MM-YYYY TO_CHAR(MAX(DATA_IN 1 row selected. |
Acredito que demonstramos uma boa utilização do
RMAN em processos de recover point in time.
Vale lembrar que em bases relativamente grandes é preciso
ter um certo cuidado em relação ao tempo informado
para a recuperação. Imagine você restaurar
300GB de datafiles, e depois de 2, 3 ou 4 horas executar o comando
recover com uma hora posterior ao momento desejado, você terá que
fazer todo o processo novamente e talvez a empresa não
possua mais janela para realizar a operação.
Espero ter ajudado um pouco na descoberta do RMAN, uma ferramenta
excelente, e muito útil.