terça-feira, 7 de fevereiro de 2012

Backup & Recovery Parte 2 - Realizando o Backup e Restaurando o Banco de dados

No artigo anterior, foi mostrando as configurações para aumentar as chances do banco de dados ser recuperado, neste arquivo será mostrado o processo de backup e recuperação.


Backup Oracle pelo RMAN

Todo backup que o feito para o RMAN é catalogado, ou seja o Rman sabe onde estão os arquivos de backup, e no momento do Restore, o RMAN irá procurar pelos backup onde ele os criou. O catalogo do Rman é obrigatoriamente feito no ControlFile,e opcionalmente em outro banco, que seria um banco de catalogo, este artigo irar trabalhar somente com o catalogo no ControlFile.

O Rman executa uma variedade de backups, tais como Cópia de Imagem e backup Piece entre outros. O que será apresentado é backup incremental, que para poder funcionar o banco deve esta no modo archive log, como já apresentado.

Em resumo o backup incremental é composto por um backup completo do banco de dados, chamado de nível 0 e depois temos os backups incrementais, nível 1, que inclui tudo que ocorreu no banco após o último backup nível zero.

Primeiramente crie um arquivo Texto com o nome RmanLEVEL0.rman e inclua os comandos abaixo, adaptado para o local onde deseja realizar o backup, para realizar o backup nível Zero.

run { allocate channel discozero type disk format
'C:\bck_oracle\Fisico\Level0\LEV0dat%u.bkp',
' \\172.16.1.21\BCK_ORACLE\Fisico\Level0 \LEV0dat%u.bkp';
backup copies 2 incremental level = 0 (database include current controlfile);}

Depois crie outro arquivo com o nome RmanLEVEL1.rman e inclua o comando

run { allocate channel discozero type disk format
'C:\bck_oracle\Fisico\Level1\LEV1dat%u.bkp',
' \\172.16.1.21\BCK_ORACLE\Fisico\Level1 \LEV1dat%u.bkp';
backup copies 2 incremental level = 1 (database include current controlfile);}

É preciso criar outro script executável (.bat ou cmd no Windows) para chamar o Rman e invocar o arquivo de Backup. Crie no mesmo diretório onde encontra o arquivo o RmanLEVEL0.rman o arquivo “bck_fisico_Leval0.cmd”,dentro dele, coloque a instrução abaixo:

Rman target sys/@xe nocatalog @RmanLEVEL0.rman >> log_nivel_0.log

Através do agendador de tarefa do Sistema Operacional, configure o backup nível 0 a ser realizado pelo menos duas vezes na semana, e o nível 1 para fazer nos demais dias da semana.

Estes scripts instrui o Rman a criar um backup multiplexado, sendo um em disco local e outro no disco remote e sempre incluir o controlFile no backup.

NOTA: Caso ocorrá erros de privilegios ao executar o backup no disco remoto, configure o serviço do banco de dados com algum usuário de rede, conforme mostrado na 1º parte deste artigo.

Os backups multiplexado têm a grande vantagem de um ser exatamente igual ao outro, então caso tenhamos somente backups da maquina remota, por exemplo, os incrementais não dependerão de pedaços que encontra na maquina onde hospeda o banco de dados. Se os backups forem executados primeiro em um destino e depois no outros, os backups incrementais dependerão de todo o conjunto de backup.

Depois, criei mais dois arquivos para apagar os backup's obsoletos - que estão fora da janela de 7 dias, (como mostrado no artigo anterior) um para logar e chamar o arquivo que contem o comando rman que apaga e outro arquivo que contem a instrução, DELETE OBSOLETE.

run {
backup database plus archivelog;
crosscheck archivelog all;
crosscheck backup;
delete obsolete;
}
                                                Recuperação do Banco de Dados
Apesar da tarefa de restore & recover não ser uma tarefa trivial, se seguido os passos informado neste artigo a recuperação do banco de dados será perfeitamente possível e ainda em uma janela pequena de tempo.

Serão apresentadas algumas situações de falhas e quais ações são necessárias para a restauração do Banco.

Contudo, antes de apresentar é preciso especificar o que RESTARAÇÃO e RECUPERAÇÃO do banco de dados.

RESTAURAÇÃO: Consiste no processo da recriação de um ou mais arquivos que compõe o banco de dados, se for necessário a restauração de todos os arquivos, diz que se faz restauração do banco de dados. Existe situação, tal quando é preciso restaurar um backup do ControFile, é preciso restaurar o banco de dados inteiro.

RECUPERAÇÃO: Consiste no processo quando o arquivo existe, porém ele (ou mais de um arquivo) encontra-se inconsistente em relação ao ControlFile e demais arquivos que compõem o banco de dados. Dentro do ControlFile o e no cabeçalho de cada arquivo o guardo o valor SCN, um número seqüencial, que se comporta como um relógio de tempo do banco de dados. Antes de abrir o banco de dados checa se todos os arquivos têm o mesmo SCN, caso não o arquivo necessita de restauração.

Primeiramente, para realizar a recuperação do arquivo de dados, é preciso que o arquivo esteja inconsistente. Para isso desligue o banco, faça uma copia de qualquer arquivo de dados, inicie o banco de dados e desligue novamente, troque o arquivo de dados original pelo arquivo de dados copiado e inicie novamente.

Ocorrerá o erro ora-01113, dizendo que o arquivo de dados precisa de recuparação de midia ao tentar abrir o banco de dados.
ORA-01113: o arquivo 5 precisa da recuperação de mídia
ORA-01110: 5 do arquivo de dados:
'C:\ORACLEXE\APP\ORACLE\ORADATA\XE\DADOS01.DBF'

Neste caso o Oracle, informou que qual arquivo de dados esta com problema, então basta simplemente executar o comando RECOVER e depois abrir o banco de dados.




SQL> recover datafile 5;
Recuperaçãode mídia concluída.
SQL> alter database open;
Banco de dados alterado.

Pronto, seu banco de dados já está disponível, parece simples não? E é, quando você já preparou tudo antes da falha acontecer. Mas o que aconteceu aqui? É preciso entender o que ocorreu. Lembre o SCN que é um numero sequencial interno do Oracle que funciona como um relogio. Pois bem, o arquivo 5 do datafile estava dessincronizado com restante do banco de dados.

Para ilustração, suponha que o banco de dados esteja com valor igual a 10 o scn, quando foi desligado pela primeira fez foi para 11, neste instante o arquivo 5 foi copiado. Feito isso, o banco de dados foi iniciado, SCN foi para 12, então o banco foi desligado novamente, SCN foi para 13. O arquivo de dados 5 foi trocado pela cópia (que esta com SCN igual a 11) , ao tentar abrir o banco de dados checou o valor do SCN de todos os arquivos que compoem o banco de dados, e com isso conclui que o arquivo 5 precisa de recuperação de mídia.

Como toda operação que ocorre no banco de dados, o Oracle grava no Log de Redo Online e também em algum arquivo do S.O. O Oracle usou o conteúdo do Archive, caso necessario, e o conteúdo do Log de Redo Online para atualizar as operações no datafile 5 e como consequencia, colocar o SCN deste arquivo como 13, podendo então este banco ser aberto.

Agora, será feito a RESTAURAÇÃO de algum arquivo de dados, para isso, desligue o servidor e apague algum arquivo de dados do Oracle e tente iniciar o banco, irar aparecer uma mensagem de erro.

Banco de dados montado.
ORA-01157: não é possível identificar/bloquear arquivo de dados 5 - consulte arquivo de análise BWR
ORA-01110: 5 do arquivo de dados:
'C:\ORACLEXE\APP\ORACLE\ORADATA\XE\DADOS01.DBF'


Agora o Oracle após montar a instância, ele procurou todos os arquivos de dados que o controlfile disse que existe, e como o arquivo não existe, apareceu o erro. Este erro pode acontecer por exemplo se os datafiles estão em vários discos e ocorre algum crash em um dos disco.

Basta executar o banco RESTORE e depois RECOVER no RMAN e então abrir o banco de dados.

C:\>rman target sys/senha nocatalog
RMAN> restore datafile 5;
Iniciando restore em 06/02/12
......
RMAN> recover datafile 5;
RMAN> sql "alter database open";

Ao executar o Restore, o banco de dados usou o último backup físico nível zero para recriar o arquivo de dados, como este arquivo vai estar descincronizado com o banco, execute o restore, depois abrar o banco.

Note que o Oracle recriou arquivo no mesmo diretorio que ele espera que o arquivo existia, mas se este arquivo esta em algum disco que esta indisponivel?

Para simular isso, desligue o banco de dados e altere o arquivo para diretorio do S.O e depois tente iniciar.

SQL> shutdown immediate
Banco de dados fechado.
Banco de dados desmontado.
InstÔncia ORACLE desativada.

Copie algum arquivo de dados para outro diretorio e depois inicie o banco de dados no esta mount.

SQL> startup mount;
InstÔncia ORACLE iniciada.
Total System Global Area 795127808 bytes
Fixed Size 1386496 bytes
Variable Size 499124224 bytes
Database Buffers 289406976 bytes
Redo Buffers 5210112 bytes
Banco de dados montado.

Renome o arquivo, informando o novo local do datafile.

SQL> ALTER DATABASE RENAME FILE
to 'C:\Particular\DADOS01.DBF';
Banco de dados alterado.

Desligue o banco, depois apague o diretorio, ou renomei - o que acha melhor - e então tente abrir, a mesangem erro irar aparecer ORA-01157.

Ao simplesmente executar o comando restore irar aparecer um erro, sinalizando que o oracle não consegue criar o arquivo porque o diretorio que este esta tentando fazer a restauração não existe.

RMAN> restore datafile 5;
Iniciando restore em 06/02/12
.....
ORA-19504: falha ao criar arquivo "C:\PARTICULAR\DADOS01.DBF"
ORA-27040: erro ao criar arquivo, não foi possível criar o arquivo
OSD-04002: não foi possível abrir arquivo
O/S-Error: (OS 3) O sistema não pode encontrar o caminho especificado.

failover para backup anterior
.....

Como o diretorio onde estava o Data File não esta disponivel, será preciso dizer ao Oracle para usar algum diretorio disponivel. Para isso use o comando SET NEWNAME e depois o restore.

run {set newname for datafile 5 to 'C:\oraclexe\app\oracle\oradata\XE\dados01.dbf';
restore datafile 5;}

executando comando: SET NEWNAME
Iniciando restore em 06/02/12
....
Finalizado restore em 06/02/12

Depois informe ao CONTROLFILE o ludar onde esta o arquivo de Dados Restaurado.

SQL> ALTER DATABASE RENAME FILE 'C:\Particular\DADOS01.DBF' to 'C:\oraclexe\app\
oracle\oradata\XE\dados01.dbf';

Banco de dados alterado.

Faça a recuperação do arquivo recem criado.
SQL> recover datafile 5;
Recuperação de mídia concluída.


Então abra o Banco de dados.

SQL> alter database open;
Banco de dados alterado.

Agora, será feito o exercicio, onde precisaremos restaurar o banco de dados inteiro. Pode ser que alguem deliberadamente apagou todos os arquivos do banco de dados ou em um outro cenário, onde o Oracle foi instado no c:\ , mas todos os arquivos do banco esta em outro disco, unidade d:\, por exemplo.

Para simular o primeiro cenario desligue a base de dados, então exclua todos os datafile e o(s) controlfile(s) do banco de dados. Neste cenario ao tentar iniciar a instancia, será apresentado o erro: Ora-00205, o que significa que o banco nem consegui ser montado, porque o ControlFile não foi excluido.

SQL> startup
Instância ORACLE iniciada.

Total System Global Area  795127808 bytes
Fixed Size                  1386496 bytes
Variable Size             499124224 bytes
Database Buffers          289406976 bytes
Redo Buffers                5210112 bytes
ORA-00205: erro na identificação do arquivo de controle, verifique o log de
alertas para obter mais informações.


Como as informações dos backup's estão no controlfile, antes de executar o Restore/Recover, será preciso Restaurar o ControlFile. Será preciso saber onde estão o seus backup, para informar ao Oracle a sua localização.

Como todo script de backup tem a instrução de incluir o ControlFile em seus backup, existirá dois arquivos para cada backup executado, um com o Backup de todos o DataFile e outro do ControlFile. Como o ControlFile é pequeno, o backup dele também será pequeno em relação aos datafile.


RMAN> restore controlfile from 'C:\Backup\LEV0DATE06N2KN55.BKP';
Iniciando restore em 07/02/12
....
Finalizado restore em 07/02/12


Com o ControlFile resturado, monte o banco de dados e faça a restauração dos DataFiles do Banco de dados, depois a recuperação e abra o banco de dados.

RMAN> sql "alter database mount";

RMAN> restore database;
Iniciando restore em 07/02/12
...

Finalizado restore em 07/02/12

RMAN> recover database;
Iniciando recover em 07/02/12
....
Finalizado recover em 07/02/12


RMAN> sql "alter database open resetlogs";


Feito isso, o Banco de Dados já foi restaurado e pronto para uso. Neste cenario, os diretorios originais do ControlFile e DataFile existia, contudo se eles não estiverem disponiveis, por exemplo, o Oracle foi instado no c:\ , mas todos os arquivos do banco esta em outro disco, unidade d:\, e este disco perdeu.

Para simular isto, desligue novamente a base e depois apague todos os arquivos de dados e renomei a basta onde estão seus arquivos. No caso, foi excluidos todos os arquivos e depois a pasta XE, onde se encontrava todos os arquivos do banco de dados foi renomeado para XENEW.

C:\oraclexe\app\oracle\oradata\XE para C:\oraclexe\app\oracle\oradata\XENEW

No SQLPLUS tente iniciar a instância, ocorrerá o erro ORA-00205, então pelo Rman, tente restaurar o ControlFile. Então ocorrerá erro ORA-27040.

RMAN> restore controlfile from 'C:\Backup\LEV0DATE06N2KN55.BKP';
Iniciando restore em 07/02/12
....
ORA-27040: erro ao criar arquivo, não foi possível criar o arquivo
OSD-04002: não á possível abrir arquivo
O/S-Error: (OS 3) O sistema não pode encontrar o caminho especificado.

RMAN>

Este erro ocorreu, porque o Oracle tentou criar o ControlFile no diretorio de origem, onde o mesmo não esta disponivel, com isso será preciso intruir o Oracle há criar o ControlFile em outro diretorio, para crie um arquivo INIT.ORA a partir do SPFILE do Oracle, pois o SPFILE tem todos os parametros atualizado.

 SQL> create pfile='c:\backup\init.ora' from spfile;

Abra o arquivo e altere o parametro ControlFile para algum diretorio disponivel, desligue o banco de dados, inicie o banco no estado nomount com o pfile, crie um no spfile de depois execute o recover pelo Rman.

 SQL> shutdown immediate;
ORA-01507: banco de dados não montado

Instância ORACLE desativada.

SQL> startup nomount pfile='c:\backup\init.ora';
Instância ORACLE iniciada.

Total System Global Area  795127808 bytes
Fixed Size                  1386496 bytes
Variable Size             499124224 bytes
Database Buffers          289406976 bytes
Redo Buffers                5210112 bytes
SQL> create spfile from pfile='c:\backup\init.ora';


RMAN> restore controlfile from 'C:\Backup\LEV0DATE06N2KN55.BKP';
Iniciando restore em 07/02/12
...

nome do arquivo de saída=C:\ORACLEXE\APP\ORACLE\ORADATA\XENEW\CONTROL.DBF
Finalizado restore em 07/02/12

RMAN>

Neste momento pode alterar o local de arquivo por arquivo, como ilustado anteriormento, ou simplemente instruir o RMAN a restaurar todos os DataFile para um diretorio comum, para isso faça:

SQL> alter system set DB_CREATE_FILE_DEST='C:\oraclexe\app\oracle\oradata\XENEW'

RMAN> run {set newname for datafile 1 to NEW;
           set newname for datafile 2 to NEW;
           set newname for datafile 3 to NEW;
           set newname for datafile 4 to NEW;
           set newname for datafile 5 to NEW;
           restore database;
           switch datafile all;}

executando comando: SET NEWNAME
....
canal ORA_DISK_1: restaurando o arquivo de dados 00001 em C:\ORACLEXE\APP\ORACLE
\ORADATA\XENEW\XE\DATAFILE\O1_MF_SYSTEM_%U_.DBF
...
canal ORA_DISK_1: restaurando o arquivo de dados 00005 em C:\ORACLEXE\APP\ORACLE
\ORADATA\XENEW\XE\DATAFILE\O1_MF_DADOS_%U_.DBF
....
Finalizado restore em 07/02/12

arquivo de dados 1 alternado para a cópia do arquivo de dados
cópia do arquivo de dados de entrada RECID=6 STAMP=774622994 file name=C:\ORACLE
XE\APP\ORACLE\ORADATA\XENEW\XE\DATAFILE\O1_MF_SYSTEM_7M2H67KV_.DBF
.....
RMAN>


Com estes comandos o Rman criou novos DataFiles dentro do caminho indicado e o comando switch datafile all,  realiza a troca dos nomes antigos pelos novos criados, com isso não será necessário executar o comando ALTER DATABASE RENAME FILE.

Agora basta fazer a recuperação do banco de dados e depois abrir-lo com ResetLog's.

RMAN> recover database;
Iniciando recover em 07/02/12
...
Finalizado recover em 07/02/12

RMAN> sql "alter database open resetlogs";

Pronto, banco de dados disponivel para os usuarios.


                                                           Conciderações

Este artigo é apenas uma parte da vasta opções de Backup e Recover do banco de dados Oracle. Em demais artigos irei mostrar outras opções de Recover, como por exemplo a Recuperação Incompleta e a recuperação em outras maquinas, tanto util para situações de extrema necessidade como simplemente criar um banco de dados de teste.






2 comentários:

  1. O que o backup via RMAN copia exatamente? Ele copia o que se prioriza no backup manual (controlfile, datafile, redolog, init.ora e spfile)?

    ResponderExcluir
  2. Bom dia Yuri,

    O Rman faz backup de todo o banco de dados ou padaços dele, vai depender de como você instrui ele pra isso.

    Mas o Rman não faz backup do Init.Ora e do LogRedo Online e qualquer outro arquivo de texto.

    ResponderExcluir