# 자동 세션 제거

## 자동 세션 제거

오라클에서 자체적으로 일정 간격으로 오래된 세션을 제거하는 Job을 생성해본다.

### 사용 중인 세션 조회

다음 SQL 구문을 이용하여 현재 사용 중인 세션 정보를 조회할 수 있다.

관리자 권한을 가지고 있어야 조회할 수 있다.

```sql
select sid, serial# from v$session;
```

일정 시간이 지난 세션에 대해 조회하고 싶을 경우 logon\_time 항목을 조건으로 걸어서 조회할 수 있다.

```sql
select sid, serial#, logon_time from v$session;
```

조회한 값이 다음과 같다고 가정했을 때, 궁극적으로 실행해야 하는 구문은 다음과 같다.

| sid | serial# |
| :-: | :-----: |
|  1  |    1    |
|  5  |    23   |
| 100 |   152   |

```sql
alter system kill session '1, 1';
alter system kill session '5, 23';
alter system kill session '100, 152';
```

일일이 작업할 수는 없기 때문에 다음과 같이 생성 구문을 만든 뒤 `Procedure`를 사용하여 실행하는 방법으로 진행한다.

```sql
select 'alter system kill session ''' || sid || ',' || serial# || '''' as ddl from v$session;
```

실행해보면 세션 종료 구문이 ddl이라는 이름으로 생성되는 것을 알 수 있다.

우리는 열린지 1시간이 지난 세션을 제거할 예정이므로 조건을 추가하여 다음과 같이 작성한다.

```sql
select 'alter system kill session ''' || sid || ',' || serial# || '''' as ddl from v$session
where logon_time < sysdate - (1/24);
```

### SQL 구문 자동 실행

`PL/SQL` 을 이용하여 여러 개의 세션을 자동으로 종료할 수 있다. 단, 세션이 여러 이유로 종료되지 않을 수 있는데, 이 때는 아무런 작업을 하지 않도록 작성하였다.

```plsql
-- session auto kill using PL/SQL
BEGIN
    -- 결과만큼 반복할 SQL 구문을 작성하고 별칭을 CUR로 부여
    FOR CUR IN (
        SELECT 
            'ALTER SYSTEM KILL SESSION ''' || SID || ',' || SERIAL# || '''' 
                AS DDL 
            FROM V$SESSION
            WHERE LOGON_TIME < SYSDATE - (1/24)
    )
    LOOP
        BEGIN
            -- 조회된 구문 실행
            EXECUTE IMMEDIATE CUR.DDL;
        EXCEPTION
            -- 예외 발생 시 아무작업을 하지 않음
            WHEN OTHERS THEN
                NULL;
        END;  
    END LOOP;  
END;
/
```

실행했을 때 `PL/SQL procedure successfully completed` 라고 나오면 구문에 오류가 없는 것이다. 실행 완료된 구문을 프로시저(Procedure)로 만들기 위해 다음의 접두사를 추가한다.

```sql
CREATE OR REPLACE PROCEDURE AUTO_CLEAR_SESSION AS
--(작성한 PL/SQL 구문)
```

### 생성된 프로시저

생성된 프로시저 코드는 다음과 같다.

```plsql
-- session auto kill procedure
CREATE OR REPLACE PROCEDURE AUTO_CLEAR_SESSION AS
BEGIN
    -- 결과만큼 반복할 SQL 구문을 작성하고 별칭을 CUR로 부여
    FOR CUR IN (
        SELECT 
            'ALTER SYSTEM KILL SESSION ''' || SID || ',' || SERIAL# || '''' 
                AS DDL 
            FROM V$SESSION
            WHERE LOGON_TIME < SYSDATE - (1/24)
    )
    LOOP
        BEGIN
            -- 조회된 구문 실행
            EXECUTE IMMEDIATE CUR.DDL;
        EXCEPTION
            -- 예외 발생 시 아무작업을 하지 않
            WHEN OTHERS THEN
                NULL;
        END;  
    END LOOP;  
END;
/
```

### 자동 실행 설정

`Oracle Job`을 이용하여 주기적으로 실행되도록 처리할 수 있다.

```plsql
BEGIN
    DBMS_SCHEDULER.create_job(
        job_name => 'auto_clear_session_job',
        comments => 'kill old session longer than 1 hour',
        job_type => 'PLSQL_BLOCK',
        job_action => 'BEGIN AUTO_CLEAR_SESSION; END;',
        start_date => SYSTIMESTAMP,
        repeat_interval => 'freq=hourly; byminute=0; bysecond=0;',
        enabled => TRUE
    );
END;
/
```

* `job_name` - job 이름
* `comments` - job 설명
* `job_type` - job 유형
* `job_action` - job이 실행할 코드
* `start_date` - 시작 시간
* `repeat_interval` - 반복 간격
* `enabled` - 사용 여부


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.sysout.co.kr/database/oracle/etc/auto-clear-session.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
