OS환경 : Oracle Linux 6.8 (64bit)
DB 환경 : Oracle Database 11.2.0.4
에러 : ORA-00600[1:dbktDefFileInit]
#11g 이상에서 사용할 수 있는 쿼리
1 2 3 4 5 6 7 8 | SQL> SELECT /* Alert log View */ ORIGINATING_TIMESTAMP , HOST_ID , MESSAGE_TEXT FROM X$DBGALERTEXT WHERE ORIGINATING_TIMESTAMP >= SYSDATE -7 / |
#해당 쿼리를 실행하면 alert log를 sqlplus 안에서 볼 수있다.
#하지만 oracle database 11.2.0.4 버전에서는 해당 쿼리를 실행 시킬 경우
1 2 3 4 5 6 7 8 9 10 11 | ERROR: ORA-03113: end-of-file on communication channel Process ID: 24979 Session ID: 43 Serial number: 447 2670 rows selected. ERROR: ORA-03114: not connected to ORACLE |
#마지막에 이렇게 에러를 뿜으며 커넥션이 끊긴다.
#그리고 alert log를 보면 ORA-00600 이 발견된다
1 2 3 4 5 6 7 8 9 10 11 12 | $ cat alert_orcl.log ==> alert_orcl.log <== ORA-49204: Recursive DDE invocation at Phase I ORA-00600: internal error code, arguments: [1:dbktDefFileInit], [48005], [], [], [], [], [], [], [], [], [], [] ORA-49204: Recursive DDE invocation at Phase I ORA-00600: internal error code, arguments: [1:dbktDefFileInit], [48005], [], [], [], [], [], [], [], [], [], [] ORA-49204: Recursive DDE invocation at Phase I ORA-00600: internal error code, arguments: [1:dbktDefFileInit], [48005], [], [], [], [], [], [], [], [], [], [] ORA-49204: Recursive DDE invocation at Phase I ORA-00600: internal error code, arguments: [1:dbktDefFileInit], [48005], [], [], [], [], [], [], [], [], [], [] ORA-07445: exception encountered: core dump [dbgtrRecNewestGet()+8] [SIGSEGV] [ADDR:0x0] [PC:0x9100398] [Address not mapped to object] [] ORA-48216: Field Len Exceeds Max Field Length [5] [30] [11357] [66] |
해결 방법 : 패치 18909196 적용 및 <ADR_HOME>/alert/log.xml 제거
해결방법은 두가지이다.
1. 패치 18909196 에서 관련 수정 사항이 있는지 확인후 적용하라. (11.2.0.4에만 해당).
패치가 제공되지 않는 플랫폼의 경우 Oracle Support에 지원요청을 하라.
2. <ADR_HOME> /alert/log.xml (및 log _ *. xml)에서
xml 파일로 된 alert 로그를 제거하는 하라.
2번 방법으로 log.xml 파일을 log.xmlbak 로 변경 후
위 쿼리를 실행 시켰더니 no rows가 나왔다.
1 2 3 4 5 6 7 8 9 10 11 | $ cd <ADR_HOME>/alert/log.xml $ mv log.xml log.xmlbak SYS@orcl> SELECT /* Alert log View */ ORIGINATING_TIMESTAMP , HOST_ID , MESSAGE_TEXT FROM X$DBGALERTEXT WHERE ORIGINATING_TIMESTAMP >= SYSDATE -7 / no rows selected |
즉 log.xml 파일을 읽어와서 X$DBGALERTEXT 뷰에서 결과를 보여주는데
log.xml 파일을 없애버려서 X$DBGALERTEXT 뷰를 봐도 아무것도 안나오는 것이다.
하지만 다시 여기에 로그가 쌓이게끔 명령어를 날리면(로그 스위치 등)
다시 log.xml파일이 새로 생성되고
위 쿼리를 입력하면 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 | SYS@orcl> alter system switch logfile; SYS@orcl> SELECT /* Alert log View */ ORIGINATING_TIMESTAMP , HOST_ID , MESSAGE_TEXT FROM X$DBGALERTEXT WHERE ORIGINATING_TIMESTAMP >= SYSDATE -7 / ORIGINATING_TIMESTAMP HOST_ID ---------------------------------- ------------------------ MESSAGE_TEXT -------------------------------------------------------------- 13-MAR-18 10.49.04.091 AM +09:00 oracle Current log# 3 seq# 30 mem# 0: /oracle/app/oracle/oradata/orcl/redo03.log 13-MAR-18 10.49.04.107 AM +09:00 oracle Archived Log entry 32 added for thread 1 sequence 29 ID 0x59477938 dest 1: 13-MAR-18 10.49.04.109 AM +09:00 oracle Thread 1 advanced to log sequence 31 (LGWR switch) 13-MAR-18 10.49.04.109 AM +09:00 oracle Current log# 1 seq# 31 mem# 0: /oracle/app/oracle/oradata/orcl/redo01.log 13-MAR-18 10.49.04.114 AM +09:00 oracle Archived Log entry 33 added for thread 1 sequence 30 ID 0x59477938 dest 1: 99 rows selected. |
원인 : log.xml 불러오는 부분에서 특정 문제 발생
이전에 ORA-600 에러가 발생한건 alert log 에 '어떤 내용'이 있어서 그런것 같은데
정확한 원인은 모르겠지만 예상할 수 있는 원인은 alert log에 특수문자나 이상한 문자들이 들어가서
위 쿼리에서 log.xml을 불러 올 때 구문 오류로 인해 에러가 나는 것같다.
참조 : (문서 ID 1679553.1)