GPO ( Grupo de Profissionais Oracle )
A maior comunidade Oracle do Brasil !

RESTORE PACKAGE RMAN

Caros colegas, abaixo umas das experiências com o RMAN.

Estava eu tranquilo e calmo, quando um usuário ligou pedindo que a equipe de banco, recuperasse o código de uma package, que ela sobrescreveu em testes..e ainda com data retroativa!!

Até aí td bem, como estava chegando na empresa, fui verificar, da pior maneira que não havia nenhuma rotina de exports de estrutura dos objetos, tanto no ambiente de testes, quanto no ambiente de desenvolvimento….!!!

Bom, depois de rezar o SALMO novamente rss, vi que havia um BACKUP FULL do RMAN, então coloquei mãos-a-obra, me recusando a fazer um DUPLICATE DATABASE apenas por causa de uma package…isso era o que os DBA´s daqui queriam que eu fizesse, ou achavam que esta era a única maneira, mas não era. Como se trata de uma package, ela fica armazenada em dicionário, então bastou voltar as tablespaces (datafiles) de UNDO, SYSAUX, TEMP E SYSTEM..

Obs. Atenção que o restore foi remoto, pois não havia espaço suficiente na máquina de origem do backup.

Passos:

Recuperar a estrutura de uma package, com data do dia 13-05-2009 ou mais próximo!

Identifiquei o DBID da BDOIDIG (Onde eu queria buscar a tal da package):

LOG_MODE DBID
----------- -----------
ARCHIVELOG 2571422232
  • Copiei o PFILE da base de dados BDOIDIG (BD target) e levei para a maquina onde será feito o restore.
  • A estrutura de diretorios foi criada exatamente a mesma que a da BD que se quer restaurar.
  • Alterei o DBname do INIT para BDOIDIG
  • Fiz os set´s de ambiente: oraenv…..ORACLE_SID=DUPIDIG (BD Destino)
  • Foi editado o TNSNAMES da máquina, para ver a máquina remota
  • Export do catalogo no repositório do rman, com o import e a criação de novo utilizador na máquina que eu vou utilizar para o restore:

Ps: Em alguns casos é interessante fazer o export/import do catálogo do RMAN para a máquina que vc deseja efetuar o restore, isso para que depois, o tamanho do backup não aumente desnecessariamente, pois esta operação de restore ficaria gravada no catálogo..!!

No banco de origem:

nohup exp rman/rman@dbBTORMAN file=rmancatalog.dmp owner=rman &

E no banco de destino:

nohup imp USERID=rman2/rman2009@dbBDOPOWER FILE=rmcatalog.dmp FROMUSER=rman TOUSER=rman2 &
CREATE USER RMAN2
IDENTIFIED BY rman2
DEFAULT TABLESPACE RMANREP
TEMPORARY TABLESPACE TEMP
PROFILE DEFAULT
ACCOUNT UNLOCK
/
-- 1 Role for RMAN
GRANT RECOVERY_CATALOG_OWNER TO RMAN
/
ALTER USER RMAN DEFAULT ROLE ALL
/
-- 1 Tablespace Quota for RMAN
ALTER USER RMAN QUOTA UNLIMITED ON RMANREP
/

PS: Verificar sempre o script de BACKUP (RMAN) da base de dados que se quer recuperar, para buscar informações de CHANNEL e POLICIES, no meu caso, NETBACKUP.

oradba@esu0012(BD10GR2:DUPIDIG)/u01/apps/oradba/product/10.2.0/dbs: rman

Recovery Manager: Release 10.2.0.3.0 - Production on Ter Mai 19 19:20:42 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.

connect target /

ligado à base de dados de destino: BDOIDIG (não montada)

set dbid=2571422232;

a executar comando: SET DBID

connect catalog rman2/rman2@BTORMAN (RMAN2 - Novo utilizador criado para receber o export do catálogo do rman)

ligado à base de dados do catálogo de recuperações

== Script de recover 01 (recupera o controlfile, as tablespaces de UNDO, SYSTEM e SYSAUX.

NB_ORA_CLIENT: deve apontar para a maquina da BD que se quer recuperar.
send NB_ORA_POLICY: policy local da máquina em que houve o problema.

run {
SET UNTIL TIME "to_date('13/05/2009 07:13:33','dd/mm/yyyy HH24:MI:SS')";
ALLOCATE CHANNEL ch00_BDOIDIG_bk TYPE 'SBT_TAPE'
parms="ENV=(NB_ORA_CLIENT=esu9994.ifap.local)";
send 'NB_ORA_POLICY=BDOIDIG_Rdia';
restore controlfile;
SQL 'alter database mount';
restore datafile 1,2,3,29;
recover datafile 1,2,3,29;
}

== Script de recover 02 (foi necessário para trazer a BD para mais próximo da data 13-05)

run {
ALLOCATE CHANNEL ch00_BDOIDIG_bk TYPE 'SBT_TAPE'
parms="ENV=(NB_ORA_CLIENT=esu9994.ifap.local)";
send 'NB_ORA_POLICY=BDOIDIG_Rdia';
restore archivelog from logseq 10580 until logseq 10583;
}

Script para verificar e dropar datafiles não necessários.

set pages 0
select 'alter database datafile '''||name||''' offline drop;' from v$datafile
where file# not in (1,2,3,29);

Constatei que se precisa de fato, dropar os datafiles não necessários ao processo de restore da base de dados.

Ainda me deparei com diferenças nos binários do Oracle nas máquinas, pois mesmo depois de aplicar todos os archives necessários, a base de dados não abria de jeito nenhum!!
Só foi possível “abrir” a BD no modo STARTUP UPGRADE.

SQL> startup upgrade;
database open

Depois disso consegui recuperar a estrutura da package que o usuário estava solicitando!! Ufa!!

Depois desse susto, completamente desnecessário, já implementei nos ambientes de DEV e Testes, exports FULL de estrutura dos objetos!!

Forte abraço a todos!!!

Share

You may also like...

1 Response

  1. Olá Marcelo,

    É exatamente pra esse tipo de “desastre” que normalmente os backups lógicos quebram um galho danado 😉

    Abraços

    Eduardo Legatti

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *