앞서 포스팅 한 글 중에 다음과 같은 글이 있었습니다.

 

2020/10/22 - [Programming/Databse] - [ORACLE] ORA-12516 tns:리스너가 프로토콜 스택과 일치하는 처리기를 찾을 수 없습니다.

 

[ORACLE] ORA-12516 tns:리스너가 프로토콜 스택과 일치하는 처리기를 찾을 수 없습니다.

ORA-12516 tns:listener could not find available handler with matching protocol stack. ORA-12516  tns:리스너가 프로토콜 스택과 일치하는 처리기를 찾을 수 없습니다. 1. 현상 개발 환경에선 발생..

smoh.tistory.com

 

한동안 잠잠하더니 다시 문제가 생기기 시작해 확인하며 겪은 일을 포스팅합니다.

 

 

 

1. 다시 생긴 ORA-12516과 원인

 

똑같은 문제가 재차 발생했습니다. 과거의 기억을 끄집어 내 세션을 확인해보니 어느새 가득 찬 세션의 수를 볼 수 있었습니다.

 

문제 되는 세션을 확인하기 위해 다음 쿼리를 수행합니다.

 

SELECT S.machine,
       TO_CHAR (S.LOGON_TIME, 'YYYY/MM/DD HH24:MI:SS') LOGON_TIME,
       S.sid,
       S.serial#,
       P.PID ORACLE_PID,
       P.SPID OS_PID,
       S.STATUS,
       S.USERNAME ORACLE_USER,
       S.OSUSER OS_USER,
       S.TERMINAL,
       S.PROGRAM
FROM V$PROCESS P LEFT OUTER JOIN V$SESSION S ON P.ADDR = S.PADDR
WHERE P.BACKGROUND IS NULL AND P.PID > 1
ORDER BY S.machine, TO_CHAR (S.LOGON_TIME, 'YYYY/MM/DD HH24:MI:SS');

 

세션 리스트가 끝도 없이 쏟아져 나오는 상황입니다. 찬찬히 보니 뭔가 이상한 점이 있습니다. 대부분의 세션의 STATUS값은 이미 INACTIVE입니다.

 

 

 

2. Session Kill

 

INACTIVE 된 세션을 죽이고자 합니다. 다음 쿼리를 사용해서요.

 

--ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE
ALTER SYSTEM KILL SESSION '123,4' IMMEDIATE 

 

근데 세션이 수백 개가 넘어갑니다. 이 방법으로는 특정 세션을 죽일 순 있겠지만 해결책은 되지 못합니다.

 

 

 

3. 세션 타임 아웃 설정.

 

오라클 측에서 제공해주는 DCD(Dead Connection Detection) 기능 중에 EXPIRE_TIME이 있습니다. 

오라클 설치 경로로 이동해 sqlnet.ora 설정 파일에 설정해 줄 수 있습니다. 다음 경로로 이동해 sqlnet.ora 파일을 열어주세요.

 

%ORACLE_HOME%\NETWORK\ADMIN\sqlnet.ora

 

SQLNET.EXPIRE_TIME 항목을 설정해 줍시다. 전 SQLNET.EXPIRE_TIME= 60와 같이 설정해 두었습니다. 60분의 만료 시간을 두었습니다.

 

이후 리스너를 재시작하면 만료 시간이 적용됩니다. 다만, 이미 연결되어 있는 세션에는 적용되지 않음에 유의해 주세요.

 

 

 

 

 

반응형

+ Recent posts