프린트 하기

OS 환경 : Oracle Linux 6.8 (64bit)

 

DB 환경 : Oracle Database 11.2.0.4

 

에러 : CORRUPTION DETECTED: thread 1 sequence 8 log 2 at block 42224. Arch found corrupt blocks

redo 커럽션
테스트를 하다가 redo log 가 corrupt 되는 일이 생김
근본 원인은 노트북의 ssd 와 램에 문제가 있어 가상머신 자체가 일부 손상된것이었는데,
이로 인해 디스크에 존재하는 일부 파일들이 깨진듯함
다행히도 dbf 파일은 깨지지 않았지만 redo log 가 깨지게 됨
본문에서는 이렇게 redo 가 깨지는 경우 어떻게 해결 해야하는지를 설명함

 

 

세션A에서 로그 스위치 실행

1
2
3
SQL> alter system switch logfile;
 
System altered.

로그 스위치가 정상적으로 이루어짐

 

 

세션B에서 alert log 확인

1
2
3
4
5
6
7
8
9
10
11
$ vi /app/oracle/diag/rdbms/oracle/oracle/trace/alert_oracle10.log
Stu Jul 20 12:32:58 2024
Archiver process freed from errors. No longer stopped
Stu Jul 20 12:32:58 2024
Thread 1 advanced to log sequence 11 (LGWR switch)
  Current log# 3 seq# 11 mem# 0: /oradata1/oracle/redo03.log
ORACLE Instance oracle - Cannot allocate log, archival required
Thread 1 cannot allocate new log, sequence 12
All online logs need archiving
Examine archive trace files for archiving errors
  Current log# 3 seq# 11 mem# 0: /oradata1/oracle/redo03.log

일부 메세지가 발생하긴 했지만 로그 스위치는 정상적으로 이루어짐

 

 

세션A에서 로그 스위치 재실행

1
2
SQL> alter system switch logfile;
(대기)

로그 스위치가 완료되지 못하고 대기하고 있음(행 상태)

 

 

세션B에서 alert log 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
$ vi /app/oracle/diag/rdbms/oracle/oracle/trace/alert_oracle10.log
Stu Jul 20 12:33:33 2024
Incomplete read from log member '/oradata1/oracle/redo02.log'. Trying next member.
ARC1: Log corruption near block 42224 change 1645475 time ?
CORRUPTION DETECTED: thread 1 sequence 8 log 2 at block 42224. Arch found corrupt blocks
Errors in file /app/oracle/diag/rdbms/oracle/oracle/trace/oracle_arc1_6086.trc  (incident=1372):
ORA-00353: log corruption near block 42224 change 1645475 time 07/18/2024 11:04:47
ORA-00312: online log 2 thread 1: '/oradata1/oracle/redo02.log'
Incident details in: /app/oracle/diag/rdbms/oracle/oracle/incident/incdir_1372/oracle_arc1_6086_i1372.trc
ARC1: All Archive destinations made inactive due to error 354
ARC1: Closing local archive destination LOG_ARCHIVE_DEST_1: '/app/oracle/arch/oracle_1_8_1174643807.arc' (error 354) (oracle)
Committing creation of archivelog '/app/oracle/arch/oracle_1_8_1174643807.arc' (error 354)
ARCH: Archival stopped, error occurred. Will continue retrying
ORACLE Instance oracle - Archival Error
ORA-16038: log 2 sequence# 8 cannot be archived
ORA-00354: corrupt redo log block header
ORA-00312: online log 2 thread 1: '/oradata1/oracle/redo02.log'
Stu Jul 20 12:33:33 2024
ARCH: Archival stopped, error occurred. Will continue retrying
ORACLE Instance oracle - Archival Error
ORA-16014: log 2 sequence# 8 not archived, no available destinations
ORA-00312: online log 2 thread 1: '/oradata1/oracle/redo02.log'
Stu Jul 20 12:33:33 2024
Sweep [inc][1372]: completed
Stu Jul 20 12:33:34 2024
Sweep [inc2][1372]: completed
Incomplete read from log member '/oradata1/oracle/redo02.log'. Trying next member.
Errors in file /app/oracle/diag/rdbms/oracle/oracle/trace/oracle_m000_6261.trc  (incident=1435):
ORA-00353: log corruption near block 42224 change 1645309 time 07/18/2024 11:04:55
ORA-00312: online log 2 thread 1: '/oradata1/oracle/redo02.log'
Incident details in: /app/oracle/diag/rdbms/oracle/oracle/incident/incdir_1435/oracle_m000_6261_i1435.trc
Stu Jul 20 12:33:34 2024
Dumping diagnostic data in directory=[cdmp_20240718123334], requested by (instance=1, osid=6086 (ARC1)), summary=[incident=1372].
Stu Jul 20 12:34:34 2024
Sweep [inc][1435]: completed
Sweep [inc2][1435]: completed

alert log 에 수많은 커럽트 에러 메세지가 남음

2번 redo 에 문제가 있는것으로 보임

 

 

해결 방법 : 리두 clear 후 재생성

세션A에서 로그 스위치 명령 취소(Ctrl+C 입력)

1
2
3
4
SQL> alter system switch logfile;
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation

 

 

리두 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL>
set lines 200
set pages 1000
col member for a60
select thread#, l.group#, member, archived, l.status, (bytes/1024/1024) MB
from v$log l, v$logfile f
where f.group# = l.group#
order by 1, 2
 
   THREAD#     GROUP# MEMBER                                                       ARC STATUS                   MB
---------- ---------- ------------------------------------------------------------ --- ---------------- ----------
         1          1 /oradata1/oracle/redo01.log                                  NO  ACTIVE                 1024
         1          2 /oradata1/oracle/redo02.log                                  NO  INACTIVE               1024
         1          3 /oradata1/oracle/redo03.log                                  NO  CURRENT                1024

에러 발생한 2번 리두 클리어, 삭제 및 재생성

 

 

1
2
3
4
5
SQL> 
alter database clear unarchived logfile group 2;
alter database drop logfile group 2;
!rm /oradata1/oracle/redo02.log
alter database add logfile group 2 '/oradata1/oracle/redo02.log' size 1024m;

 

 

로그 스위치 테스트

1
SQL> alter system switch logfile;

 

 

로그 스위치가 잘 되면 다행이지만
또 동일한 에러와 함께 행이 걸린다면 다른 redo에 대해서도 동일한 작업 수행

 

 

1번 리두에서 에러 발생한 경우 1번 리두 클리어, 삭제 및 재생성

1
2
3
4
5
SQL> 
alter database clear unarchived logfile group 1;
alter database drop logfile group 1;
!rm /oradata1/oracle/redo01.log
alter database add logfile group 1 '/oradata1/oracle/redo01.log' size 1024m;

 

 

3번 리두에서 에러 발생한 경우 3번 리두 클리어, 삭제 및 재생성

1
2
3
4
5
SQL> 
alter database clear unarchived logfile group 3;
alter database drop logfile group 3;
!rm /oradata1/oracle/redo03.log
alter database add logfile group 3 '/oradata1/oracle/redo03.log' size 1024m;

 

 

재생성 이후에도 로그 스위치가 안되고
커턴트 리두에 문제 발생시 아래 명령 수행

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SQL> alter system archive log current;
 
System altered.
 
SQL> alter system switch logfile;
 
System altered.
 
SQL> /
 
System altered.
 
SQL> /
 
System altered.
SQL> /
 
System altered.

잘 수행됨

 

 

이 작업들이 정상적으로 끝나면 이후 DB 풀백업을 진행해줘야함

 

원인 : 하드웨어 문제로 인한 redo 손상

하드웨어 문제로 인한 redo 손상

참고로 문제발생 초기에 ssd 를 교체했지만 문제가 재발생했고, pc의 램을 교체한 이후 더이상 문제가 발생하지 않았음

 

 

참조 : 

https://alexlima.com/2008/04/02/how-to-fix-online-redo-log-corruption/