잠 깐 상 식
서버의 리스너에게 클라이언트으로부터 요청(Connection)이 오면, 리스너는 서버 프로세스를 생성(fork)하고 클라이언트와 세션정보를 주고 받은 뒤, 오라클에 세션을 생성한다. 커넥션 된 클라이언트의 세션은, 어떤 작업을 요청하고 서버 프로세스가 해당 작업을 수행한 뒤 Return한다. 클라이언트 --> 리스너 --> 서버프로세스 생성 --> 세션 생성 --> 작업 요청 --> 서버프로세스 작업 --> 클라이언트 |
모든 문제는 이 사이에 일어난다. 가장 먼저 리스너로부터 다음과 같이 서버프로세스 생성에 실패했다는 오류를 받을 수 있다.
ORA-12500: TNS:listener failed to start a dedicated server process
사실 해당 에러는 메모리가 부족하거나 리스너 로그가 너무 많이 쌓여도 발생할 수 있다. 그러나 DBA로서 가장 먼저 확인해야 할 것은 현재 접속한 프로세스와 세션 limit이 한계치인지 확인하는 것이다.
1. 현재 Process, Session 수 확인과 limit 확인
서버의 리스너에게 클라이언트으로부터 요청(Connection)이 오면, 리스너는 서버 프로세스를 생성(fork)하고 클라이언트와 세션정보를 주고 받은 뒤, 오라클에 세션을 생성한다.
커넥션 된 클라이언트의 세션은, 어떤 작업을 요청하고 서버 프로세스가 해당 작업을 수행한 뒤 Return한다.
※ 최대 Session 수는 Sessions = (Process x 1.5) + 30 임으로 Processes 값만 변경하면 Sessions 값은 자동으로 변경됨
ora-12516 과 같이 할당 된 모든 세션 풀을 사용할 경우 process와 session 파라미터를 늘려줘야 하고, 이는 재기동을 의미한다. 그 전에 세션 수를 관리하기 위해 쓸 수 있는 방법들.
2.유저 당 세션 제어
유저 Profile에 sessions_per_user 파라미터를 주면 해당 프로파일을 사용하는 유저의 최대 세션수를 제한 할 수 있다.
ORA-02391: exceeded simultaneous SESSIONS_PER_USER limit
오류로 막히게 된다.
3. idle 세션 제어 (INACTIVE Session)
리스너를 통해 접속한 세션들이 해당 시간만큼 휴지 상태일 경우 타임아웃 시키도록 한다
리스너를 재시작해야하며, 기존 접속 세션에는 적용 되지 않으니 기존 세션은 메뉴얼하게 끊어줘야한다.
$ORACLE_HOME/network/admin/sqlnet.ora
sqlnet.expire_time = 3 (0~1440 min)
해당 파라미터는 keepalive와 같은 기능으로, 설정한 분마다 클라이언트와 정상 접속 상태를 확인한다. 따라서 모든 세션에 대해 수행되므로 미량이나마 추가 패킷이 발생한다. 방화벽 정책에 의해 정상 작업 중에도 세션이 종료될 경우 해당 파라미터가 KeepAlive 역할로서 방화벽에 의한 Timeout을 방지할 수 도 있다.
4. Manual kill
쿼리 수행 없이 INACTIVE 상태로 오랜 접속시간을 유지하고 있는 세션을 솎아내 죽인다.
'DB > Oracle' 카테고리의 다른 글
[INS-32826] The software home is already registered in the central inventory (0) | 2025.02.04 |
---|---|
[Oracle/Linux] Oracle linux 7.X gdb CPU 100 (top cpu consume 100) (3) | 2024.10.08 |
[오라클] Index 인덱스란 (0) | 2023.07.31 |
[오라클] DEADLOCK과 ITL슬롯 그리고 INITRANS/MAXTRANS (0) | 2023.01.05 |
[오라클] Listener 동적 등록과 정적 등록 (0) | 2022.07.25 |