..
오라클 세션 확인하고 Kill
개요
오라클 DB에서 세션 상태를 확인하고 Lock이 발생한 비정상적인 DB 세션을 강제종료(Kill)할 수 있다.
작성배경
가끔씩 운영중인 DB서버에서 Application 에러로 Query가 비정상적으로 반복실행되면서 시스템 부하가 급증하는 상황이 발생한다.
어느날 개발자로부터 세션 강제종료(Kill) 조치 요청이 들어와 조치한 기록이다.
환경
- OS : HP-UX B.11.31
- ID : oracle
- Shell : sh
- Database : Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
작업절차
1. oracle 계정 접속
oracle 계정으로 먼저 로그인해야 한다.
$ su - oracle
2. DB 접속
sysdba 권한으로 Oracle DB에 접속한다.
$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Wed Sep 8 15:46:26 2021
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
SQL>
3. DB 세션 상태확인
Oracle Session
Client Device Database Server
┌───────────────────┐ ┌────────────────────────────────────────┐
│ │ Acess │ │
│ ┌───────────────┐ │ Request │ ┌───────────────┐ ┌───────────────┐ │
│ │ Client ├─┼───(1)───────┼──► Oracle │ │ Client │ │
│ │ Application │ │ │ │ Listener │ │ Application │ │
│ └─────────────▲─┘ │ │ └───────┬───────┘ └───────▲───────┘ │
│ │ │ │ │ │ Session │
└───────────────┼───┘ │ (2) Create (1) established
│ Session │ │ Process │ Local Connection
│ established │ ┌───────▼───────┐ ┌───────▼───────┐ │
└───────(3)───────┼──► Server │ │ Server │ │
Remote │ │ Process │..│ Process │ │
Connection │ └───────────────┘ └───────────────┘ │
│ │
└────────────────────────────────────────┘
- Oracle 데이터베이스는 사용자와 데이터베이스 접속이 이루어지면 세션을 생성한다.
- 세션은 사용자가 데이터베이스에 연결되어 있는 동안 계속 유지되고, 각 세션에는 Session ID(
SID
)와 Serial 번호(Serial#
)가 부여된다. - Session ID(
SID
)와 Serial 번호(Serial#
)가 같이 부여되는 이유는 Session이 종료되었으나, 다른 세션이 동일한 SID를 갖고 시작되었을 때 세션 명령들이 정확한 세션에 적용될 수 있도록 하기 위해서이다. - 세션이 사용자에 의해 작업중이라면
ACTIVE
상태로 작업을 하게된다.INACTIVE
상태는 세션은 연결되어있지만 작업을 하고있지 않는 상태를 의미한다.
명령어 형식
SELECT SID, SERIAL#, USERNAME, PROGRAM, STATUS
FROM V$SESSION
WHERE SID='<SID>';
실행 명령어
SQL> SELECT SID, SERIAL#, USERNAME, PROGRAM, STATUS
2 FROM V$SESSION
3 WHERE SID='657';
SID SERIAL# USERNAME PROGRAM STATUS
---------- ---------- ------------------------------ ------------------------------------------------ --------
657 13469 DEV SQL Developer ACTIVE
Elapsed: 00:00:00.01
4. DB 세션 강제종료(Kill)
세션을 강제로 끊어버리기 위해서는 Session ID(SID
)와 Serial 번호(SERIAL#
) 정보가 필요하다.
명령어 형식
ALTER SYSTEM KILL SESSION '<SID>, <SERIAL#>';
실행 명령어
SQL> ALTER SYSTEM KILL SESSION '657, 13469';
System altered.
Elapsed: 00:00:01.01
세션 강제종료(Kill)가 정상적으로 실행되었다.
5. DB 세션 재확인
13469번 Serial Number(SERIAL#
)를 가진 세션이 사라진 걸 확인할 수 있다.
SQL> SELECT SID, SERIAL#, USERNAME, PROGRAM, STATUS
2 FROM V$SESSION
3 WHERE SID='657';
SID SERIAL# USERNAME PROGRAM STATUS
---------- ---------- ------------------------------ ------------------------------------------------ --------
657 13478 DEV oracle@devdb1 (TNS V1-V3) INACTIVE
Elapsed: 00:00:00.00
조치 완료.