접속자가 몰려 서버가 느려지는 상황에서 주로 발생할 수 있는 문제 중 하나가 데이터베이스에 Lock이 걸리거나,

쿼리가 비효율적으로 실행되는 경우이다. 아래에  Lock 관련 문제를 확인하고 해결할 수 있는 쿼리를 정리하였다.


<MySQL>

-- 현재 활성화된 프로세스와 상태 확인
SHOW PROCESSLIST;

실행 중인 쿼리와 그 상태를 확인할 수 있다. 여기에서 State 값이 Locked 상태로 표시된 세션이

Lock을 유발하고 있을 가능성이 크다.

-- 특정 세션 종료
KILL [SESSION_ID];

Lock을 유발한 세션을 종료하기 위해 KILL 명령어를 사용한다.

[SESSION_ID] 자리에 SHOW PROCESSLIST; 쿼리에서 조회된 Id 값을 적는다.


<Oracle>

-- Lock이 걸린 테이블 조회
SELECT DO.OBJECT_NAME
     , DO.OWNER
     , DO.OBJECT_TYPE
     , VO.XIDUSN
     , VO.SESSION_ID
     , VO.LOCKED_MODE
  FROM V$LOCKED_OBJECT VO
     , DBA_OBJECTS DO
 WHERE VO.OBJECT_ID = DO.OBJECT_ID;

OBJECT_NAME이 테이블명

-- Lock이 걸린 테이블의 SID와 SERIAL# 조회(테이블별 확인)
SELECT A.SID, A.SERIAL#
  FROM V$SESSION A
     , V$LOCK B
     , DBA_OBJECTS C
 WHERE A.SID = B.SID
   AND B.ID1 = C.OBJECT_ID
   AND B.TYPE = 'TM'
   AND C.OBJECT_NAME = '테이블명';

v$ 뷰는 관리자 권한 필요

-- 조회된 SID와 SERIAL# 값으로 세션 종료
ALTER SYSTEM KILL SESSION '[SID], [SERIAL#]';

+ Recent posts