quarta-feira, 24 de novembro de 2010

Oracle - Solucionando erro ORA-00257

Problema: ORA-00257: archiver error. Connect internal only, until freed.

Sintoma: Aceita apenas conexões internas e rejeita externas, o banco está aberto, mas não aceita transações em razão de um redo log travado.

Passo 1 - Baixe a database.

SQL> SHUTDOWN IMMEDIATE;
ORACLE instance shut down.

Passo 2 - Inicie em modo de manutenção.

SQL> STARTUP MOUNT
ORACLE instance started.
Total System Global Area 1191182336 bytes
Fixed Size 2020320 bytes
Variable Size 318770208 bytes
Database Buffers 855638016 bytes
Redo Buffers 14753792 bytes
Database mounted.


Passo 3 (não execute) - Ocorre erro ao tentar "abrir" a database, mencionando que não
pode gravar o arquivo de redo.


SQL> ALTER DATABASE OPEN;
ALTER DATABASE OPEN
*
ERROR at line 1:
ORA-16038: log 1 sequence# 53 cannot be archived
ORA-19809: limit exceeded for recovery files
ORA-00312: online log 1 thread 1:
'/u01/app/oracle/product/10.2.0/oradata/orcl/redo01.log'


Passo 4 - Validando o destino e se está em modo archive, veja que o espaço da Flash
Recovery Area está lotado, causa do problema. 


SQL > SELECT * FROM V$RECOVERY_FILE_DEST;
NAME
--------------------------------------------------------------------------------
SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
----------- ---------- ----------------- ---------------
/u01/app/oracle/product/10.2.0/flash_recovery_area/ 2147483648 2141670912 0 50

Passo 5 - Mova os archives antigo da Flash Recovery Area para outro local. E inicie o
RMAN.

$ rman target sys/senha@SID

Passo 6 - No RMAN valide os archives e apague os antigos.

RMAN > CROSSCHECK ARCHIVELOG ALL;
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=151 devtype=DISK
RMAN > DELETE EXPIRED ARCHIVELOG ALL;


Passo 7 - Saia do RMAN e conectado na instância localmente altere o tamanho da Flash
Recovery Area.


RMAN > exit;
SQL> ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=4294967296 SCOPE=BOTH;

Passo 8 - Suba a database, alterando o estado para 'OPEN'.
SQL> ALTER DATABASE OPEN;
Database altered..

17 comentários:

  1. Olá Gabriel!

    Hoje me dei de cara com o ORA-00257.

    Segui o seu artigo e deu certo, consegui subir o banco, ainda bem que era um banco de teste.

    Pergunta, movi alguns archives, executei o passo 6 e 7. Agora com o flash recovery area maior, posso voltar os archives para localização original? Quais comando no RMAN para informar que os archives movidos voltaram?

    Att,

    Sakamoto

    MyTraceLog - Registro de um DBA
    http://mytracelog.blogspot.com

    ResponderExcluir
  2. Olha, eu sugiro realizar um novo backup que não requisite os archives antigos.

    P: Posso voltar os archives para localização original?
    R: Boa pergunta, se não puder por alguma razão desconhecida fazer um novo backup full, tente o alterar o status dos archives da seguinte forma:


    RMAN> CROSSCHECK ARCHIVELOG ALL;
    RMAN> CHANGE ARCHIVELOG LIKE '' AVAILABLE;

    Eu nunca testei isso, homologue antes.

    P: Quais comando no RMAN para informar que os archives movidos voltaram?

    R: Respondido acima. Mas novamente menciono que o ideal é fazer um novo backup já que conseguiu subir o banco.

    ResponderExcluir
  3. Olá Gabriel!

    Excelente seu post, e aproveit para perguntar se em um ambiente de testes(banco de desenvolvimento) tem esta necessidade?
    Ou é uma questão meramente oragnizacional?
    Abraços,
    Ary Gasineo

    ResponderExcluir
  4. Se for em ambiente de teste, basta liberar espaço da flash_recovery_area.

    ResponderExcluir
  5. Olá Gabriel, funcionou perfeitamente aqui, muito obrigado!

    Jefferson Moreira

    ResponderExcluir
  6. Funcionou pra mim também! Muito obrigado pelas dicas. No meu caso, creio que o problema foi em função da quantidade muito grande de archivelogs criados (5.1 GB de 5.2 GB disponíveis) durante um IMPDP de um dump de 15 GB. Aumentei o valor do meu DB_RECOVERY_FILE_DEST_SIZE para 15 GB para ver se resolve.

    Alguém já passou por isso? É minha primeira vez utilizando EXPDP/IMPDP para uma base com archivelog habilitado.

    Existe uma maneira de não gerar os archivelogs durante o IMPDP? Talvez algum parâmetro para EXPDP?

    Obrigado!

    ResponderExcluir
  7. Para impdp não, pois são realizados DMLs, o que obrigatoriamente gerarão archives. Minha sugestão é passar a database para noarchivelog(requer restart) e depois da importação reativar. Caso a importação seja algo comum e diário então minha sugestão é aumentar o limite de tamanho do destino de archives e após a importação realizar uma limpeza dos archives com o RMAN, mas é fato que removendo archives tu perdes o point time recovery. Espero ter ajudado, abraços!

    ResponderExcluir
  8. Gabriel venho pedir sua ajuda, li seu post executei os passos mas esbarrei com os erros: ORA-554 no passo 5.

    ResponderExcluir
  9. Opa. Deu certinho. Excelente post.
    No meu caso deu o erro quando estava importando uma base teste.
    Agora posso fazer o impdp novamente.

    Muito obrigado.

    Vanderson

    ResponderExcluir
  10. Olá Gabriel, tudo bem?

    Post Excelente, acabei de ter o mesmo problema em meu ORACLE, segui os passos de seu post e deu tudo certo, muito obrigado!

    Abraços,
    Thyago

    ResponderExcluir
    Respostas
    1. Opa Thyago! Tudo 110% e contigo? Excelente, sempre as ordens. Abraços.

      Excluir
  11. Excelente postagem, ajudou muito, obrigado!

    ResponderExcluir