Backup Recover Full
Wagner Pinheiro (e-mail) é OCP DBA Oracle 9i 10g, com atuação pela IFactory.
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 Dec 25 20:01:03 2006 Copyright (c) 1982, 2005, Oracle. All rights reserved. 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 on Mon Dec 25 19:55:07 2006 Copyright (c) 1982, 2005, Oracle. All rights reserved. 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 AUTOBACKUP ON; 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 AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO 'C:\BACKUP 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) from estudo.insert_time 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 on Tue Dec 26 19:06:02 2006 Copyright (c) 1982, 2005, Oracle. All rights reserved. connected to target database: ORCL (DBID=1125663715) RMAN> shutdown immediate; using target database control file instead of recovery catalog RMAN> |
Em seguida, inicie o banco no modo nomount:
RMAN> startup nomount; connected to target database (not started) Total System Global Area 293601280 bytes Fixed Size 1248624 bytes RMAN> |
Execute a recuperação do controlfile:
RMAN> restore controlfile from 'c:\Backup\C-1125663715-20061224-00'; 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 mount; Oracle instance started Total System Global Area 293601280 bytes Fixed Size 1248624 bytes 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 e agora iremos fazer o recover, que nada mais é do que a aplicação dos archivelog RMAN> RECOVER DATABASE until time "TO_DATE('24-12-2006 18:30:00','DD-MM-YYYY HH24:MI:SS')"; Starting recover at 26-DEC-06 starting media recovery archive log thread 1 sequence 3 is already on disk as file C:\ORACLE\ARCHIVE\ARC 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 open resetlogs; database opened RMAN> select to_char(max(data_insercao),'DD-MM-YYYY HH24:MI:SS') 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 bytes Fixed Size 1248624 bytes RMAN> |
Restaure o controlfile mais próximo.
RMAN> restore controlfile from 'c:\Backup\C-1125663715-20061224-00'; Starting restore at 26-DEC-06 channel ORA_DISK_1: restoring control file RMAN> |
Inicie o banco no modo mount.
RMAN> startup force mount; Oracle instance started Total System Global Area 293601280 bytes Fixed Size 1248624 bytes 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 18:45:00','DD-MM-YYYY HH24:MI:SS')"; Starting recover at 26-DEC-06 starting media recovery archive log thread 1 sequence 3 is already on disk as file C:\ORACLE\ARCHIVE\ARC |
Abra o banco com resetlogs.
RMAN> alter database open resetlogs; database opened RMAN> |
Fazendo o mesmo select feito anterior, teremos:
select to_char(max(data_insercao),'DD-MM-YYYY HH24:MI:SS') 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.