Pular para o conteúdo

ORA-00742 Log read detects lost write in Oracle

ORA-00742 Log read detects lost write in Oracle

Ao levantar a instância do meu banco de dados Oracle 19c XE para começar a brincar um pouco com ORDS, me deparei com o seguinte erro:

ORA-00742 Log read detects lost write in Oracle

Ao pesquisar o erro, encontrei a seguinte descrição:

Código do erro: ORA-00742

Descrição: A leitura de log detecta uma gravação perdida no thread %s sequência %s bloco %s

Causa: Uma gravação emitida pela Oracle foi perdida pelo sistema operacional ou sistema de armazenamento subjacente ou ocorreu um erro interno da Oracle.

Ação: O arquivo de rastreamento mostra o local de gravação perdido. Despejar o arquivo de log problemático para ver se é uma gravação perdida real. Entre em contato com o Oracle Support Services.

É fato de que em algum momento eu devo ter interrompido o banco de maneira pouco ortodoxa. Isso com certeza foi um dos motivos de ter tomado esse erro.

Para ajudar a resolver esse problema, encontrei várias soluções (descritas na referência). Fiz então um compilado daquilo que realmente resolveu o meu problema.

Depois de pensar “ferrou”, eu fui fazer a primeira coisa que um desenvolvedor faz quando tem o seu próprio banco de dados instalado. Conectar com o SYS via SQL*PLUS ! ?

image 8
image 9

Vamos dar uma olhada no status da instância. Se estiver montada, será a hora do bom e velho alter database open;

SQL> select status from v$instance;

STATUS
------------
MOUNTED

SQL> alter database open;
alter database open
*
ERRO na linha 1:
ORA-00742: A leitura de log detecta uma gravaþÒo perdida no thread 1 sequÛncia
53 bloco 9771
ORA-00312: thread 2 do log 1 on-line: 'D:\ORACLE\ORADATA\GPO\REDO02.LOG'

Já de cara tomei um erro de redolog. Bora consultar a v$logfile e a v$log.

SQL> select * from v$logfile;

    GROUP# STATUS  TYPE
---------- ------- -------
MEMBER
--------------------------------------------------------------------------------
IS_     CON_ID
--- ----------
         3         ONLINE
D:\ORACLE\ORADATA\GPO\REDO03.LOG
NO           0

         2         ONLINE
D:\ORACLE\ORADATA\GPO\REDO02.LOG
NO           0

    GROUP# STATUS  TYPE
---------- ------- -------
MEMBER
--------------------------------------------------------------------------------
IS_     CON_ID
--- ----------

         1         ONLINE
D:\ORACLE\ORADATA\GPO\REDO01.LOG
NO           0


SQL>
SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC
---------- ---------- ---------- ---------- ---------- ---------- ---
STATUS           FIRST_CHANGE# FIRST_TI NEXT_CHANGE# NEXT_TIM     CON_ID
---------------- ------------- -------- ------------ -------- ----------
         1          1         52  209715200        512          1 NO
INACTIVE               6292206 19/09/21      6398503 20/09/21          0

         3          1         51  209715200        512          1 NO
INACTIVE               6150403 13/09/21      6292206 19/09/21          0

         2          1         53  209715200        512          1 NO
CURRENT                6398503 20/09/21   1,8447E+19                   0


SQL>

Já tomei 2 log groups inativos… ☹

Bora limpar os logfiles dos grupos com problemas.

SQL> alter database clear unarchived logfile group 1;

Banco de dados alterado.

SQL> alter database clear unarchived logfile group 3;

Banco de dados alterado.

SQL>

Vamos ver agora…

SQL>  select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC
---------- ---------- ---------- ---------- ---------- ---------- ---
STATUS           FIRST_CHANGE# FIRST_TI NEXT_CHANGE# NEXT_TIM     CON_ID
---------------- ------------- -------- ------------ -------- ----------
         1          1          0  209715200        512          1 NO
UNUSED                 6292206 19/09/21      6398503 20/09/21          0

         3          1          0  209715200        512          1 NO
UNUSED                 6150403 13/09/21      6292206 19/09/21          0

         2          1         53  209715200        512          1 NO
CURRENT                6398503 20/09/21   1,8447E+19                   0

Agora só para garantir, vamos para um RECOVER do banco.

SQL> recover database until cancel
ORA-00279: alterar 6398504 gerado em 09/20/2021 18:22:36 necessßrio para o
thread 1
ORA-00289: sugestÒo : D:\TEMP\ORACLE\RDBMS\ARC0000000053_1070204338.0001
ORA-00280: alterar 6398504 para o thread 1 estß na sequÛncia  #53
Especificar log: {<RET>=nome de arquivo | sugerido | AUTO | CANCEL}
D:\ORACLE\ORADATA\GPO\REDO02.LOG
Log aplicado.
RecuperaþÒo de mÝdia concluÝda.
SQL>

Agora uma fake recovery (descrito no MOS Doc ID 2026541.1)

SQL> recover database using backup controlfile until cancel;
ORA-00279: alterar 6401762 gerado em 09/20/2021 18:22:36 necessßrio para o
thread 1
ORA-00289: sugestÒo : D:\TEMP\ORACLE\RDBMS\ARC0000000053_1070204338.0001
ORA-00280: alterar 6401762 para o thread 1 estß na sequÛncia  #53

Especificar log: {<RET>=nome de arquivo | sugerido | AUTO | CANCEL}
CANCEL
RecuperaþÒo de mÝdia cancelada.
SQL>

E agora a hora da verdade

SQL> alter database open resetlogs;

Banco de dados alterado.

SQL>
SQL> select status from v$instance;

STATUS
------------
OPEN

SQL>

Funcionou !!!!

image 10

É isso aí pessoal. Não sou DBA mas consigo me virar bem com a ajuda do Mr. Google e de tantos outros bons profissionais que compartilham o seu conhecimento. Espero que toda essa informação seja bem útil a vocês, como foi para mim.

Referência

Quão útil foi este post ?

Clique em uma estrela para classificar o post

nota média 4.8 / 5. Contagem de votos: 16

Sem votos ! Seja o primeiro a classificar !

Deixe um comentário

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

plugins premium WordPress