quinta-feira, 25 de fevereiro de 2010

Recuperação completa / incompleta de um banco backupeado via RMAN em fita (via TSM) em outro servidor.

Cenário:

Tarefa muito comum de ser realizada tanto para recuperação de um banco de dados perdido, ou para criação de um novo ambiente em outro servidor através do backup do banco.

Sistema operacional LINUX;
Oracle : 10.2.0.4;
Banco de dados utilizando ASM;
Banco backupeado diariamente via RMAN, e com os archives backupeados de meia em meia hora.
Banco backupeado em FITA utilizando o TSM.

Contém parte da configuração do TSM (Ferramenta Tivole da IBM) que interessa para executar a tarefa.

Objetivo:

Retorno do banco em outro servidor , utilizando o TSM e retornando o banco em filesystem comum (sem ASM).

Utilização:

Teste de retorno de backup;
Criação de base de dados de teste/homologação;
Etc.

1º. passo:

Configurar o TSM para ler os dados backupeados do servidor de produção no servidor de destino.

É preciso configurar os arquivos do TSM utilizados pelo RMAN (cliente ORACLE) para que o TDP_NODE seja o nome do nó onde o backup é feito(no caso o servidor de produção).

Tivemos que configurar o arquivo: /oracle/app/product/10.2.0/rman/lib/tdpo.opt incluindo o NODE prodserver_tdp. Este nó é o que é feito o backup de produção. Só assim ele lê os arquivos backupeados pelo servidor prodserver no servidor de destino.

E reconfigurar a senha usando o comando:

tdpoconf password

Com este comando recadastramos a senha.


Verificar o DBID do banco que iremos retornar. Se o banco estiver sem acesso (caso de perda total do banco) este número pode ser obtido pelo rman.

Comando executado no banco de PRODUÇÃO. Mostra o DBID original do banco que está sendo backpeado e iremos retornar em outro servidor.


SQL> select * from rc_database;

DB_KEY DBINC_KEY DBID NAME RESETLOGS_CHANGE# RESETLOGS
---------- ---------- ---------- -------- ----------------- ---------
12864 12865 343099696 PROD 602821 30-NOV-09

IMPORTANTE: NãO CONECTAR NO CATÁLOGO DO RMAN. Se não as alterações serão feitas no catálogo perdendo as informações de backup do banco de produção.

connect target /
set dbid 343099696;
startup nomount;
run {

allocate channel t1 type 'sbt_tape' parms 'ENV=(TDPO_OPTFILE=/oracle/app/product/10.2.0/rman/lib/tdpo.opt)';
restore spfile to pfile '/oracle/app/product/10.2.0/db/dbs/initPROD.ora' from autobackup;
}
shutdown;








Editar o initora para colocar as informações corretas:






Mudar as localizações dos arquivos de dump, etc.
Após a edição, colocar o banco no ar sem montar (ainda não existe o controlfile).


startup nomount;


Restaurar o controlfile da fita do RMAN (do autobackup).

set dbid 343099696;
run {

allocate channel t1 type 'sbt_tape' parms 'ENV=(TDPO_OPTFILE=/oracle/app/product/10.2.0/rman/lib/tdpo.opt)';
restore controlfile from autobackup;
alter database mount;
}

O RMAN do banco de produção neste nosso exemplo está configurado para com o AUTOBACKUP. Ou seja, todos os backups feitos ele tira backup do CONTROLFILE e do SPFILE automaticamente.

Foi restaurado para o disco o controlfile do banco de produção para nosso novo servidor. É no controlfile que se encontram os nomes dos datafiles. O comando "alter database mount" indica para a instância ler o controlfile. Desta forma temos agora disponíveis na tabela V$DATAFILE as estruturas do banco. Neste caso a estrutura ainda antiga, com os datafiles indicando ainda os locais no ASM.

----


Montar o script de NEWNAME.


Através da v$datafile (pelo SQLPlus) neste banco novo que foi montado agora, pegar os nomes dos arquivos para gerar os scripts para renomear os arquivos

Tem que setar o novo nome para o RMAN (SET NEWNAME).
Neste momento muda o nome dos datafiles (que estavam no banco no ASM) para os nomes no filesystem da máquina de destino do backup.

Os nomes novos servem para o rman trazer os arquivos e jogar no filesystem sem ASM e já no path correto.

Com o script pronto (com os dados capturados da tabela v$datafile) executar os comandos:

No RMAN fazer o NEWNAME o RECOVER.

run {
allocate channel t1 type 'sbt_tape' parms 'ENV=(TDPO_OPTFILE=/oracle/app/product/10.2.0/rman/lib/tdpo.opt)';
set newname for datafile '+DATA01_DG/prod/system01.dbf'
to '/oracle/oradata/PROD/system01.dbf';
set newname for datafile '+DATA01_DG/prod/undotbs01.dbf'
to '/oracle/oradata/PROD/undotbs01.dbf';
set newname for datafile '+DATA01_DG/prod/sysaux01.dbf'
to '/oracle/oradata/PROD/sysaux01.dbf';
set newname for datafile '+DATA01_DG/prod/users01.dbf'
to '/oracle/oradata/PROD/users01.dbf';
set newname for datafile '+DATA01_DG/prod/undotbs02.dbf'
to '/oracle/oradata/PROD/undotbs02.dbf';
set newname for datafile '+DATA01_DG/prod/datafile/wprcomm_cei_ts_extended.288.704564499'
to '/oracle/oradata/PROD/wprcomm_cei_ts_01.dbf';
set newname for datafile '+DATA01_DG/prod/datafile/wprcomm_cei_ts_base.289.704564665'
to '/oracle/oradata/PROD/wprcomm_cei_ts_base_01.dbf';
set newname for datafile '+DATA01_DG/prod/datafile/wprcomm_cei_ts_catalog.290.704564753'
to '/oracle/oradata/PROD/wprcomm_cei_ts_catalog_01.dbf';
set newname for datafile '+DATA01_DG/prod/datafile/bspace.291.704564821'
to '/oracle/oradata/PROD/bspace_01.dbf';
set newname for datafile '+DATA01_DG/prod/datafile/integra_dados01.292.704570413'
to '/oracle/oradata/PROD/integra_dados.dbf';




restore database;

switch datafile all;
}

Neste script foram executas três tarefas:

Mudar o nome dos datafiles para o RMAN (somente para a restauração) com o comando SET NEWNAME.



Restaurar os arquivos (copiar da fita para o local novo agora).
Trocar os nomes dos datafiles no banco para os nomes novos. (switch datafile all).

NEWNAME do TEMP:



Fazer o newname dos arquivos temporários do banco.

Esta informação está na tabela V$tempfile.




run
{
set newname for tempfile '+DATA01_DG/prod/temp01.dbf'
to '/oracle/oradata/PROD/temp01.dbf';
set newname for tempfile '+DATA01_DG/prod/datafile/wprcomm_cei_ts_temp1'
to '/oracle/oradata/PROD/wprcomm_cei_ts_temp1';

}



Fazer o recover do banco:




run {
allocate channel t1 type 'sbt_tape' parms 'ENV=(TDPO_OPTFILE=/oracle/app/product/10.2.0/rman/lib/tdpo.opt)';
recover database;
}


Neste ponto o banco será recuperado. Caso ele precise dos archives, eles serão restaurados da fita e aplicado no banco automaticamente.
Após o recovery, é necessário renomear os arquivos de redo online para que no resetlogs o banco crie os arquivos no local desejado.
run
{
SQL "alter database rename file ''+DATA01_DG/prod/redo02.log''
to ''/oracle/oradata/PROD/redo02.log''";
SQL "alter database rename file ''+DATA01_DG/prod/redo01.log''
to ''/oracle/oradata/PROD/redo01.log''";
SQL "alter database rename file ''+DATA01_DG/prod/redo03.log''
to ''/oracle/oradata/PROD/redo03.log''";
SQL "alter database rename file ''+DATA01_DG/prod/redo04.log''
to ''/oracle/or data/PROD//redo04.log''";
}

E a seguir renomear os arquivos dos tablespaces temporários que não são backapeados pelo RMAN eles são recriados na abertura do banco. Mas têm que ter seu local correto informado.


RENAME dos TEMP:

run
{
SQL " alter database rename file ''+DATA01_DG/prod/temp01.dbf''
to ''/oracle/oradata/PROD/temp01.dbf''";
SQL " alter database rename file ''+DATA01_DG/prod/datafile/wprcomm_cei_ts_temp1''
to ''/oracle/oradata/PROD/wprcomm_cei_ts_temp1''";
}





Abrir o banco com resetlogs.


alter database open resetlogs;

Pronto. Banco recuperado.

Caso este novo banco necessite ser backupeado pelo RMAN no MESMO catálogo que o anterior(banco de produção), é preciso mudar seu DBID, já que eles dois têm o mesmo DBID.

Mudar o DBID do banco para um número qualquer diferente do banco original.

SQL>; SHUTDOWN IMMEDIATE
SQL>; STARTUP MOUNT
SQL>; exit;
$ export ORACLE_SID=PROD
$ nid TARGET= / DBNAME=PROD




Note que o comando nid (New Identification) é um comando de sistema operacional, e não um comando SQL.




Qualquer dúvida ou erro, por favor comentem que irei responder ou acertar no texto.




Ebert.