Recovery de Redo Log sem multiplexação

19 ago

Recovery de Redo Log sem multiplexação

Design sem nome (2)

Introdução

Este artigo discute como restaurar o redo log do banco de dados Oracle. Caso o arquivo de redo não esteja acessível por alguma razão, o banco de dados não irá funcionar corretamente.

Redo Logs

Redo logs registra todas as alterações feitas nos datafiles. Cada vez que os dados são alterados no banco de dados, essa alteração é gravada primeiro no registro de redo log online, antes de ser aplicada nos datafiles.

Se um backup de um datafile em algum ponto do tempo e um conjunto completo de redo logs a partir de um ponto para frente estiverem disponíveis, o banco de dados pode reaplicar as alterações registradas nos redo logs, para reconstruir o conteúdo do datafile em qualquer ponto entre o último backup e o final do último registro do redo log. No entanto isto só é possível se o banco estiver com o modo de archive log habilitado.

Os arquivos de redo possui os seguinte status:

UNUSED - Redo log on-line nunca foi gravado. Este é o estado de um redo log que acabou de ser adicionado, ou apenas depois de um RESETLOGS, quando não é o redo log atual.

CURRENT - Log de redo atual. Isto implica que o redo log está ativo. O redo log pode estar aberto ou fechado.

ACTIVE - Log está ativo, mas não é o log atual. É necessário para recuperação de falhas. Pode estar em uso para recuperação de bloco. Pode ou não ser arquivado.

CLEARING - O log está sendo recriado como um log vazio após uma instrução ALTER DATABASE CLEAR LOGFILE. Depois que o log é limpo, o status muda para UNUSED.

CLEARING_CURRENT - O log atual está sendo limpo de um encadeamento fechado. O log pode permanecer nesse status se houver alguma falha no switch, como um erro de E / S que esteja gravando o novo cabeçalho de log.

INACTIVE - O log não é mais necessário para a recuperação da instância. Pode estar em uso para recuperação de mídia. Pode ou não ser arquivado.

Cenário

Banco de dados versão 12.1.0.2 em modo archive log, com redo log sem multiplexação. Foi realizado a deleção de um arquivo de redo não arquivado e inativo com o objetivo de simular uma corrupção.

Analisando o ambiente

tail -n 20 $ORACLE_BASE/diag/rdbms/orcl/ORCL/trace/alert_ORCL.log 

Additional information: 3  
Master background archival failure: 313  
  
Mon Jul 29 16:35:58 2019  
Errors in file /u01/app/oracle/diag/rdbms/orcl/ORCL/trace/ORCL_m000_7142.trc:  
ORA-00313: a abertura falhou para os membros do grupo 2 de log do thread 1  
ORA-00312: thread 2 do log 1 on-line: '/u01/app/oracle/oradata/ORCL/redo02.log'  
ORA-27037: não é possével obter status do arquivo  
Linux-x86_64 Error: 2: No such file or directory  
Additional information: 3  
Mon Jul 29 16:36:58 2019  
Errors in file /u01/app/oracle/diag/rdbms/orcl/ORCL/trace/ORCL_arc2_3190.trc:  
ORA-00313: a abertura falhou para os membros do grupo 2 de log do thread 1  
ORA-00312: thread 2 do log 1 on-line: '/u01/app/oracle/oradata/ORCL/redo02.log'  
ORA-27041: não é possével abrir arquivo  
Linux-x86_64 Error: 2: No such file or directory  
Additional information: 3  
  
ls -1 /u01/app/oracle/oradata/ORCL/redo*.log  
redo01.log  
redo03.log  
  
SQL> set lines 210 pages 1000;  
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        118   52428800        512          1 NO  CURRENT                1560045 29/07/19   2,8147E+14                   0  
         2          1        116   52428800        512          1 NO  INACTIVE               1559806 29/07/19      1560041 29/07/19          0  
         3          1        117   52428800        512          1 NO  INACTIVE               1560041 29/07/19      1560045 29/07/19          0  

Como o redo log está com status inativo e ainda não foi gerado o archive log, não será possível um recover completo (Media recover) até a sequence 118. Neste caso será realizado uma operação de recover incompleto (também conhecida como Point-in-Time) que é voltar à base a um SCN que não seja último para consertar um erro de usuário ou na falta de um archive.

Recuperação

sqlplus / as sysdba
SQL> shutdown immediate;  
Banco de dados fechado.  
Banco de dados desmontado.  
Instância ORACLE desativada.  
  
SQL> startup mount;  
Instância ORACLE iniciada.  
  
Total System Global Area 1157627904 bytes  
Fixed Size                  2923632 bytes  
Variable Size             436208528 bytes  
Database Buffers          704643072 bytes  
Redo Buffers               13852672 bytes  
Banco de dados montado.  
  
SQL> recover database until cancel;  
Recuperação de mídia concluída.  
SQL> alter database open resetlogs;  
  
Banco de dados alterado.  
  
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          1   52428800        512          1 NO  CURRENT                1561077 29/07/19   2,8147E+14                   0  
         2          1          0   52428800        512          1 YES UNUSED                       0                     0                   0  
         3          1          0   52428800        512          1 YES UNUSED                       0                     0                   0  
  
SQL> select status, open_mode from v$instance,v$database;  
  
STATUS       OPEN_MODE  
------------ --------------------  
OPEN         READ WRITE  

ls -1 /u01/app/oracle/oradata/ORCL/redo*.log  
redo01.log  
redo02.log
redo03.log  

Para evitar este tipo de situação é recomendo que os arquivos de redo logs estejam multiplexados, preferencialmente em discos diferentes. Para garantir que não haja perda de informação em caso de corrupção de um dos arquivos de redo log.

ALTER DATABASE ADD LOGFILE MEMBER '/u01/app/oracle/oradata/ORCL/redo01b.log' TO GROUP 1;  
ALTER DATABASE ADD LOGFILE MEMBER '/u01/app/oracle/oradata/ORCL/redo02b.log' TO GROUP 2;  
ALTER DATABASE ADD LOGFILE MEMBER '/u01/app/oracle/oradata/ORCL/redo03b.log' TO GROUP 3;