프린트 하기

OS 환경 : Oracle Linux 7.6 (64bit)

 

DB 환경 : Oracle Database 19.3.0.0

 

방법 : 오라클 19c parse 실패에 대한 트레이스 걸기

오라클에서 일반적으로 sql 을 실행하면 parsing(Syntax Check, Semantic Check, Shared Pool Check) 과정 그리고 SQL Optimization, SQL Row Source Generation 과정을 거쳐 sql이 최종적으로 실행됨

 

 

제일 초기 파싱 과정에서 문제가 발견되면 sql을 실행한 세션창에만 에러가 발생하면서 sql이 실행되지 않음

파싱 과정에서 문제가 발생했을때 alert log에 에러가 남게 할 수 있는 트레이스를 걸수있음

아래와 같이 parse_sql_statement debugger 이벤트를 걸거나 10035 트레이스를 걸면됨

 

 

테스트

존재하지 않는 테이블을 조회하는 sql 실행

1
2
3
4
5
SQL> select col1 from ttt;
select col1 from ttt
                 *
ERROR at line 1:
ORA-00942table or view does not exist

sql을 실행한 세션에서만 에러가 발생함

alert log에는 어떤 에러도 발생하지 않음

 

 

트레이스 설정

1
2
3
4
5
6
7
8
9
SQL> alter session set events 'parse_sql_statement debugger';
 
Session altered.
 
or
 
SQL> alter session set events '10035 trace name context level 12, forever';
 
Session altered.

 

 

존재하지 않는 테이블을 조회하는 sql 재실행

1
2
3
4
5
SQL> select col1 from ttt;
select col1 from ttt
                 *
ERROR at line 1:
ORA-00942table or view does not exist

sql을 실행한 세션에서 에러가 발생함

 

 

alert log 확인

1
2
3
4
5
6
7
2024-04-21T09:47:20.252198+09:00
PARSE ERROR: ospid=9505, error=942 for statement:
2024-04-21T09:47:20.252268+09:00
select col1 from ttt
Additional information: hd=0xb850e868 phd=0xb854b698 flg=0x20 cisid=0 sid=0 ciuid=0 uid=0 sqlid=9rmtjd8dnrnyy
...Current username=SYS
...Application: sqlplus@ora19 (TNS V1-V3) Action:

alert log 에 parse 정보를 포함한 내용이 저장됨

2번 째 줄 : ospid 및 에러번호

4번 째 줄 : parse 에러가 발생한 sql

5번 째 줄 : 추가 정보 sqlid 등

6번 째 줄 : sql을 실행한 유저 정보

7번 째 줄 : client 접속 정보

 

 

참조 : 

https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/sql-processing.html

https://tanelpoder.com/2009/03/03/the-full-power-of-oracles-diagnostic-events-part-1-syntax-for-ksd-debug-event-handling/