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:
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 ! ?
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 !!!!
É 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
- Solving ORA-00742 Log read detects lost write in Oracle
- How to Fix ORA-00743-Log Read detects lost write in thread
- ORA-00742 Log read detects lost write on standby (Doc ID 2762519.1)
- Código de erro do banco de dados Oracle ORA-00742 Descrição