반응형

그냥 허전해서 주워온 이미지..사진 사용에 문제가 될시...죄송합니다.

현재 DB서버가 폭주중이라면, 먼저 장시간 수행중인 쿼리들이 없는지 1차적으로 체크해야 할 필요가있다.

때에 따라 확인하는 것 뿐만 아니라, 강제로 KILL하여 자원의 안정적인 확보가 필요하다.

아래 쿼리는 현재 수행시간이 10초 이상인 것들의 대한 SQL과 프로세스 정보를 확인하는 쿼리이다.

이는 오라클에서 제공하는 Dynamic Performance View로 부터 실시간으로 확인하는 정보다.

 

바로 kill할수 있도록 SELECT 절 가장 끝 컬럼에

ALTER SYSTEM KILL ~구문을 추가했으니, 바로 복사해서 사용하면 된다.

--당일 실시간으로 10초이상 걸리는 쿼리를 조회
SELECT
  A.SID,       -- SID
  A.SERIAL#,   -- 시리얼번호
  A.STATUS,    -- 상태정보
  A.MODULE,
  A.MACHINE,
  A.USERNAME,  -- 유저
  A.OSUSER,    -- 접속자의 OS 사용자 정보
  A.LOGON_TIME, --세션 로그온 시간
  B.LAST_ACTIVE_TIME, --마지막 활성화 시간
  ROUND(ELAPSED_TIME/(DECODE(EXECUTIONS,0,1,NULL,1,EXECUTIONS)*1000000),1)AS ELAPSED_T, --평균수행시간(초)
  SUBSTR (TO_CHAR (LAST_CALL_ET), 1, 6) AS  EXECUTESECONDS, --실제 수행중시간 (초)
  A.PROCESS,   -- 프로세스정보
  B.SQL_TEXT,  -- sql
  'ALTER SYSTEM KILL SESSION'''||A.SID||', '||A.SERIAL#||''';' AS qry
FROM
  V$SESSION A,
  V$SQLAREA B,
  V$PROCESS C
WHERE
  A.SQL_HASH_VALUE=B.HASH_VALUE
  AND A.SQL_ADDRESS=B.ADDRESS
  AND A.PADDR=C.ADDR  
  AND A.MODULE IS NOT NULL
  AND TO_CHAR(A.LOGON_TIME,'YYYY') >= SUBSTR(TO_CHAR(SYSDATE,'YYYYMMDD'),0,4)
  AND TO_CHAR(LAST_ACTIVE_TIME,'YYYYMMDD') = TO_CHAR(SYSDATE,'YYYYMMDD')
  AND (B.ELAPSED_TIME/B.EXECUTIONS/1000000) > 1 /* 평균수행시간이 ?초 이상인것 */
  AND SUBSTR (TO_CHAR (LAST_CALL_ET), 1, 6) > 1 /* 현재 실제수행중인 쿼리가 ? 초 이상인것 */
  AND A.STATUS='ACTIVE'
ORDER BY A.LAST_CALL_ET DESC

해당 쿼리를 이용하여, 자동으로 체크하는 로직을 만들수 있고, 그에따라 가장 끝 컬럼에 있는

값들인 (ALTER SYSTEM KILL~~) 구문을 실행하여 부하걸린 프로세스를 바로 종료시킬수도 있다.

개별모듈로써 활용가능성이 있음..

※오라클에서만 됩니다.

반응형

+ Recent posts