Restore no RMAN falha com "ORA-01180: can not create datafile 1"

Depois de um tempo ausente, volto com este probleminha que já aconteceu comigo duas vezes.
Pediram-me para que eu restaurasse um banco de dados para criação de uma base de testes (ainda bem) e no momento da restauração algo assim aconteceu:

creating datafile No=1 name=/....../o1_mf_system_5n2w3nky_.dbf
released channel: t1
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 09/05/2010 09:34:12
ORA-01180: can not create datafile 1
ORA-01110: data file 1: '/....../o1_mf_system_5n2w3nky_.dbf'



Segundo o METALINK, isso acontece porque "O Rman acha que não tem backups pra restaurar, então ele recria os arquivos para aplicar os archives. No entanto isso não funciona para a tablespace SYSTEM". De fato é verdade. Quando tentamos restaurar os demais arquivos dá certo, só não para a SYSTEM.


Bom, no metalink ele diz que quando você executa um LIST BACKUP diz que existem backups disponíveis. O problema é que existem entradas duplicadas no controlfile, duas incarnações com o mesmo reset SCN:





DB KeyInc KeyDB Name DB IDSTATUS Reset SCNReset Time
11ORCL3441889539PARENT120-NOV-07
3 (*)3ORCL3441889539CURRENT2388963095 30-APR-08
2 (*)2ORCL3441889539PARENT238896309526-APR-08


A única forma de isso acontecer é se o controlfile foi restaurado de um backup frio via sistema operacional e então outro resetlogs foi executado, gerando o mesmo SCN.


Todos os backups pertencentes a ambas as incarnações (2 e 3) se tornam ao mesmo tempo backups órfãos e atuais.


O metalink informa que isso é um BUG (Bug 5844752).


Mas existe também outra condição que pode resultar neste problema (no meu caso). Quando há um RESETLOGS gerando uma nova incarnação (daí são criados alguns arquivos físicos, etc) e é executado um "RESET DATABASE TO INCARNATION X" para voltar a incarnação anterior (por motivos ainda desconhecidos). Então a incarnação nova (criada com o resetlogs) fica ORPHAN (órfã) gerando o mesmo problema.


Usando a mesma tabela acima como exemplo, o resultado fica mais ou menos assim:





DB KeyInc KeyDB Name DB IDSTATUS Reset SCNReset Time
11ORCL3441889539CURRENT120-NOV-07
22ORCL3441889539ORPHAN2388963095 30-APR-08



Desta forma o erro acontece na hora da restauração.




O problema é você precisar restaurar esse backup e ele estar nestas condições, por isso é importante saber se está tudo em ordem (incarnações anteriores PARENT e a última CURRENT) antes de realizar os backups para que não aconteçam problemas durante a restauração.


Para os dois casos similares a recriação do controlfile, recatalogação dos backups e restore pode funcionar. Isso para contornar o problema em caso de tentativa de restauração do backup.


O procedimento é:
1. Restaurar o controlfile primeiramente;
2. Gerar um script de recriação do controlfile (backup controlfile to trace;)
3. Recriar o controlfile;
4. Recatalogar os backups;
5. Executar a restauração;
6. Rezar.


Para corrigir o problema na base atual (para que os backups fiquem OK) você pode apenas executar um "RESET DATABASE TO INCARNATION X" voltando para última incarnação (que estava ORPHAN). Recriar o controlfile também deve solucionar o problema, mas é interessante analisar o caso e, preferencialmente, realizar um backup para executar um método ou o outro. Comigo, no caso da incarnação ORPHAN, corrigi o problema apenas executando um "RESET DATABASE TO INCARNATION". Após isso executei um backup e um restore sem problemas.


UPDATE 11/07/2011:


Passei por um problema desse aí galera, mais uma vez, semana passada. No entanto eu percebo que esse problema pode acontecer em situações diferentes e nem sempre vai ter uma explicação bem concreta sobre o caso.


Um amigo que trabalha comigo estava tentando restaurar uma base em outro servidor. Copiou o backup e na hora de restaurar o erro era diferente.
O RMAN dizia que não existia backups daqueles datafiles, apesar de estar listando no RMAN normalmente:


RMAN-06023: no backup or copy of datafile 1 found to restore


Achávamos que era por causa do NFS (estávamos testando restaurar pelo NFS por conta do pouco espaço em disco local), mas mesmo copiando dava o mesmo erro.


Decidi então listar as incarnações novamente no servidor onde o backup estava sendo restaurado pra ver o que tinha lá. Apareceram 3 incarnações:


PARENT         12-FEV-2008
PARENT         23-OUT-2010
CURRENT      01-JUL-2011


Em produção apareciam só as duas primeiras:


PARENT ...
CURRENT ...


Ninguém realizou resetlogs algum no servidor antes de ser tentado restaurar essa base de dados e muito menos em produção.


Restauramos o controlfile novamente e listamos as incarnações. Apareceu igual como produção. Após recatalogarmos os arquivos de backup, para registrar inclusive os backups de archives, e apareceu a bendita incarnação fantasma de 01-JUL-2011. Sem explicação resolvemos executando um RESET DATABASE TO INCARNATION X (anterior a de 01-JUL) e o backup foi restaurado sem problemas. Alguma coisinha errada tava informando ao banco de dados esse suposto "resetlogs" mesmo sem ter sido executado em produção.


Até mais.

Comentários

  1. Ola Eduardo, tudo certo?

    Estou com um problema parecido.
    Se tiver alguma dica, seria de grande valia...

    Comigo acontece o mesmo erro. Mas quando listo as incarnações só aparece uma.

    RMAN> list incarnation;


    List of Database Incarnations
    DB Key Inc Key DB Name DB ID STATUS Reset SCN Reset Time
    ------- ------- -------- ---------------- --- ---------- ----------
    1 1 RCAT 600379919 CURRENT 1 07-OCT-13

    RMAN>

    Quanto tento recriar o controlfile:
    ORA-01503: CREATE CONTROLFILE failed
    ORA-01565: error in identifying file '/u01/app/oracle/oradata/rcat/system.dbf'
    ORA-27037: unable to obtain file status

    Sabe se tenho como recriar o controlfile mesmo sem o system.dbf? Ou quem sabe alguma outra saída :)

    Obrigado

    ResponderExcluir
  2. Adriano, nesse caso parece que você perdeu o datafile 1 que corresponde ao tablespace System. Não tem muito a ver com a solução apresentada no post, pois nele assume-se que você possui o backup pronto para ser restaurado, mas na hora do restore dá o erro 01180.

    Infelizmente se você não tiver o datafile 1 o seu banco de dados está perdido, pois no System é onde se encontra o dicionário de dados e todas as referências de onde se encontram os objetos do banco de dados também.

    Você possui backup desse datafile? Mais atual que puder?

    ResponderExcluir
    Respostas
    1. Ola Eduardo,
      Desculpe a demora em responder. Achei que seria alertado por e-mail... rs
      Eu tentei tudo de novo e tive o mesmo problema.
      Meu cenário é assim:
      catdb > catalog em noarchivelog. O origem rodava em OL6 x64.
      bacrec > target em archivelog. O origem também rodava em OL6 x64.

      O catdb eu restaurei em OL6, mas de 32 bits. Deu alguns problemas, mas segui alguns posts na internet:
      ORA-06553: PLS-801: internal error [56327]
      1- shutdown immediate
      2- startup migrate
      3- @ $ ORACLE_HOME / rdbms / admin / utlirp.sql;
      4- shutdown immediate
      5- startup
      6- @ $ ORACLE_HOME / rdbms / admin / utlrp.sql;
      7- shutdown immediate
      8- startup

      O banco catalog subiu e parece nao haver problemas.
      E quando vou tentar restautar o bacrec (target):
      1 - controlfile e spfile; OK
      2 - restore archivelog all; OK
      2 - restore database:
      ***************************************************************
      connected to target database: BACREC (DBID=2045346895, not open)
      connected to recovery catalog database

      RMAN> restore database;

      Starting restore at 04-NOV-13
      allocated channel: ORA_DISK_1
      channel ORA_DISK_1: SID=18 device type=DISK

      creating datafile file number=1 name=/u02/oradata/bacrec/system01.dbf
      RMAN-00571: ===========================================================
      RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
      RMAN-00571: ===========================================================
      RMAN-03002: failure of restore command at 11/04/2013 18:01:34
      ORA-01180: can not create datafile 1
      ORA-01110: data file 1: '/u02/oradata/bacrec/system01.dbf'
      **************************************

      Com banco em MOUNT:
      SQL> select name from v$datafile;

      NAME
      --------------------------------------------------------------------------------
      /u02/oradata/bacrec/system01.dbf

      Tentei ver se tenho permissao de escrita:
      [oracle@macol6 bacrec]$ touch system01.dbf
      [oracle@macol6 bacrec]$ ll
      total 9584
      -rw-r-----. 1 oracle oinstall 9814016 Nov 4 12:34 control01.ctl
      -rw-r--r--. 1 oracle oinstall 0 Nov 4 12:34 system01.dbf
      [oracle@macol6 bacrec]$ pwd
      /u02/oradata/bacrec
      [oracle@macol6 bacrec]$ rm system01.dbf

      Eu fiz:
      backup database plus archivelog delete input;

      No trace do rman sai:
      creating datafile file number=1 name=/u02/oradata/bacrec/system01.dbf
      Calling krmmpem from krmmexe
      RMAN-00571: ===========================================================
      RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
      RMAN-00571: ===========================================================
      RMAN-03002: failure of restore command at 11/04/2013 18:01:34
      RMAN-06003: ORACLE error from target database:
      ORA-01180: can not create datafile 1
      ORA-01110: data file 1: '/u02/oradata/bacrec/system01.dbf'
      ORA-06512: at "SYS.X$DBMS_BACKUP_RESTORE", line 6950

      Alguma ideia?

      Excluir
    2. Fala Adriano! Acho que notifica por email sim, mas eu havia te enviado um email direto também...
      Bom, pra eu ter mais informações faz assim. Executa o seguinte comando usando o catálogo e sem o catálogo pra eu ver a diferença:

      RMAN> list incarnation;

      Excluir
    3. Olá Eduardo, obrigado mais uma vez... Veja que estranho...

      SEM CATALOGO:
      connected to target database: BACREC (DBID=2045346895, not open)

      RMAN> list incarnation;

      using target database control file instead of recovery catalog

      List of Database Incarnations
      DB Key Inc Key DB Name DB ID STATUS Reset SCN Reset Time
      ------- ------- -------- ---------------- --- ---------- ----------
      1 1 BACREC 2045346895 CURRENT 1 26-OCT-13

      COM CATALOGO:
      connected to target database: BACREC (DBID=2045346895, not open)
      connected to recovery catalog database

      RMAN> list incarnation;


      List of Database Incarnations
      DB Key Inc Key DB Name DB ID STATUS Reset SCN Reset Time
      ------- ------- -------- ---------------- --- ---------- ----------
      2844 2845 TUNING 555462811 CURRENT 1 22-OCT-13
      2 4 BACREC 2045346895 CURRENT 1 26-OCT-13

      Mas agora fiquei "mais" sem entender... rs

      Nao tinha pensado em nao usar o catalogo. E sem catalogo:
      connected to target database: BACREC (DBID=2045346895, not open)

      RMAN> restore datafile 1;

      Starting restore at 05-NOV-13
      using target database control file instead of recovery catalog
      allocated channel: ORA_DISK_1
      channel ORA_DISK_1: SID=18 device type=DISK

      channel ORA_DISK_1: starting datafile backup set restore
      channel ORA_DISK_1: specifying datafile(s) to restore from backup set
      channel ORA_DISK_1: restoring datafile 00001 to /u02/oradata/bacrec/system01.dbf
      channel ORA_DISK_1: reading from backup piece /u02/backup/bacrec/bkp_BACREC_149_1_4loo1r8d_1_1.bkp
      channel ORA_DISK_1: piece handle=/u02/backup/bacrec/bkp_BACREC_149_1_4loo1r8d_1_1.bkp tag=TAG20131103T153437
      channel ORA_DISK_1: restored backup piece 1
      channel ORA_DISK_1: restore complete, elapsed time: 00:00:26
      Finished restore at 05-NOV-13

      Removo o system01.dbf e Com catalog:
      connected to target database: BACREC (DBID=2045346895, not open)
      connected to recovery catalog database

      RMAN> restore datafile 1;

      Starting restore at 05-NOV-13
      allocated channel: ORA_DISK_1
      channel ORA_DISK_1: SID=1 device type=DISK

      creating datafile file number=1 name=/u02/oradata/bacrec/system01.dbf
      RMAN-00571: ===========================================================
      RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
      RMAN-00571: ===========================================================
      RMAN-03002: failure of restore command at 11/05/2013 18:33:53
      ORA-01180: can not create datafile 1
      ORA-01110: data file 1: '/u02/oradata/bacrec/system01.dbf'

      Nao entendi o porquê, mas dá para voltar sem o catalogo.

      Excluir
  3. Poisé, tava suspeitando disso. Esse caso realmente é como o post em questão, ou seja, bagunça de incarnações (o pai de santo fica louco). Se você fizer pelo catálogo o RMAN vai encontrar duas incarnações CURRENT e dará o erro de datafile. Já sem o catálogo, lendo apenas do controlfile, ele irá encontrar apenas uma e o restore funcionará sem problemas.
    Se você precisar realmente do catálogo é necessário fazer outro procedimento pra deixar apenas uma incarnação CURRENT, ou seja, deixar como está o controlfile que é como deveria estar. No entanto, no seu caso, creio que já deve ter resolvido seu problema sem o catálogo, correto? Qualquer coisa pode falar!

    ResponderExcluir
  4. Inclusive isso já aconteceu comigo. Isso acontece quando você faz um clone (BACREC > TUNING no seu caso) da base de dados de produção para homologação e registra a base de dados clonada no catálogo com o mesmo dbid. Aí você executa um resetlogs na base clonada causando esse registro de duas incarnações CURRENT. Inclusive isso pode até causar problemas no backup de produção. Nesse processo de clone, o melhor a fazer é antes de executar um resetlogs você alterar o dbid do banco de dados usando o utilitário NID. Já corrigi esse problema no catálogo e tenho o procedimento anotado. Talvez eu até coloque no blog como post novo em breve.

    ResponderExcluir
  5. No meu caso não eram clones. E se você olhar meu primeiro comentario, de 21 de outubro de 2013 22:43, só havia uma incarnação e eu não estava usando catalogo (na verdade estava tentando restaurar o catalogo). Vou tentar novamente fazer o backup no 64bits e restaurar no 32bits. As duas vezes ocorreram com o db em archivelog. A primeira sem o catalogo e a segunda com.

    ResponderExcluir
    Respostas
    1. Adriano,
      No seu primeiro POST o erro era completamente diferente. Dizia que não existia o datafile SYSTEM e não que não podia restaurar. Também não é possível saber se você estava usando catálogo ou não. Daí eu respondi e você mostrou um erro diferente conforme o problema informado no POST, daí eu pude começar a te ajudar.

      De qualquer forma, resumindo o que aconteceu é que duas bases com o mesmo DBID foram registradas no mesmo catálogo, concorda? Por isso aparecem duas quando você executa um LIST INCARNATION quando usa o catálogo. Você já viu que o problema está em seu catálogo e se precisar restaurar emergencialmente use sem catálogo que funcionará.

      Excluir
  6. Não era diferente (motivo pelo qual cheguei neste post :p)... Eu não copiei a parte do erro. Copiei este trecho porque uma saída era:
    O procedimento é:
    1. Restaurar o controlfile primeiramente;
    2. Gerar um script de recriação do controlfile (backup controlfile to trace;)
    3. Recriar o controlfile;
    ...


    E eu não estava usando o catalogo e sim tentando restaurá-lo.

    Neste segundo caso deve ser esta confusão com as incarnations, porque eu tinha mais um banco catalogado (o que não justifica o problema).

    ResponderExcluir
  7. Ok Adriano. O importante é que identificamos o problema e conseguimos resolvê-lo. Parabéns!

    ResponderExcluir
  8. Sim, isso é o importante... :)
    Obrigado pela ajuda.

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

ALTER USER IDENTIFIED BY VALUES

Evitando FULL TABLE SCANS quando usar IS NULL em cláusulas WHERE