프린트 하기

OS 환경 : Oracle Linux 7.6 (64bit)

 

DB 환경 : Oracle Database 19.3.0.0

 

방법 : 오라클 19c session crash 시키기

오라클 환경에서 세션을 강제로 충돌을 발생시켜 종료시키는 방법을 설명함

방법은 간단함 이벤트명 뒤에 crash 를 붙여주면 됨

예시

1
SQL> alter session set events '<event name> crash';

 

 

테스트

1. 본인 세션 즉시 종료

2. parse 실패한 세션 강제 종료

3. 특정 에러 발생시 강제 종료

 

 

테스트

1. 본인 세션 즉시 종료

1
2
3
4
5
6
7
SQL> alter session set events 'immediate crash';
alter session set events 'immediate crash'
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 15951
Session ID: 20 Serial number: 8709

ORA-03113이 발생하며 세션이 종료됨

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
$ vi oracle19_ora_15951.trc
Trace file /ORA19/app/oracle/diag/rdbms/oracle19/oracle19/trace/oracle19_ora_15951.trc
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
Build label:    RDBMS_19.3.0.0.0DBRU_LINUX.X64_190417
ORACLE_HOME:    /ORA19/app/oracle/product/19.0.0/db_1
System name:    Linux
Node name:      ora19
Release:        4.18.0-147.el8.x86_64
Version:        #1 SMP Tue Nov 12 11:05:49 PST 2019
Machine:        x86_64
Instance name: oracle19
Redo thread mounted by this instance: 1
Oracle process number: 36
Unix process pid: 15951, image: oracle@ora19 (TNS V1-V3)
 
 
*** 2024-04-21T09:59:16.645058+09:00
*** SESSION ID:(20.87092024-04-21T09:59:16.645076+09:00
*** CLIENT ID:() 2024-04-21T09:59:16.645079+09:00
*** SERVICE NAME:(SYS$USERS) 2024-04-21T09:59:16.645082+09:00
*** MODULE NAME:(sqlplus@ora19 (TNS V1-V3)) 2024-04-21T09:59:16.645085+09:00
*** ACTION NAME:() 2024-04-21T09:59:16.645088+09:00
*** CLIENT DRIVER:(SQL*PLUS) 2024-04-21T09:59:16.645090+09:00
 
Shadow_Core_Dump = partial
ksdbgcra: writing core file to directory '/ORA19/app/oracle/diag/rdbms/oracle19/oracle19/cdump'

 

 

트레이스 파일에 나와있는 경로의 파일 확인

1
2
3
$ cd /ORA19/app/oracle/diag/rdbms/oracle19/oracle19/cdump/core_15951
$ ls
(파일 미존재)

세션이 강제로 종료되여 core dump 가 발생했다고 나오지만 

실제로 파일을 보면 아무것도 남지 않았음

 

 

2. parse 실패한 세션 강제 종료

이전게시글에서 설명한 parse 실패한 세션에 대해서도 crash 를 발생시켜 세션을 종료시킬 수 있음

참고 : 오라클 19c parse 실패에 대한 트레이스 걸기 ( https://positivemh.tistory.com/1084 )

 

 

트레이스 설정 후 존재하지 않는 테이블을 조회하는 sql 실행

1
2
3
4
5
6
7
8
9
10
11
SQL> alter session set events 'parse_sql_statement crash';
 
Session altered.
 
SQL> select abc from def;
select abc from def
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 19862
Session ID: 780 Serial number: 22025

parse가 실패한뒤 바로 세션이 종료됨

alert log 에는 따로 로그가 남지않음

 

 

3. 특정 에러 발생시 강제 종료

특정에러가 발생했을때 트레이스를 남길수 있음, 이 경우에도 동일하게 충동을 일으켜 강제 종료시킬 수 있음

참고 : 오라클 11gR2 특정에러 trace 확인, 에러스택 확인 ( https://positivemh.tistory.com/946 )

 

샘플 테이블 생성(number type 컬럼)

1
2
3
SQL> create table test1 (col1 number);
 
Table created.

 

 

데이터 삽입(문자형)

1
2
3
4
5
SQL> insert into test1 values ('a');
insert into test1 values ('a')
                          *
ERROR at line 1:
ORA-01722: invalid number

number 형의 컬럼에 문자를 넣으려고 하면 ORA-01722 에러가 발생함

 

 

1722 에러에 대해 트레이스 crash 설정

1
2
3
SQL> alter system set events '1722 crash';
 
System altered.

 

 

데이터 삽입(문자형)

1
2
3
4
5
6
7
SQL> insert into test1 values ('A');
insert into test1 values ('A')
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 20905
Session ID: 2 Serial number: 13200

쿼리 실행 시 바로 세션이 종료됨

alert log 에는 따로 로그가 남지않음

 

 

참조 : 

https://positivemh.tistory.com/946

https://positivemh.tistory.com/1084

https://oraclue.wordpress.com/2009/03/05/crash-and-debugger-events/