> For the complete documentation index, see [llms.txt](https://docs.tibero.com/tmaxopensql/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tibero.com/tmaxopensql/tmax-o2-extensions/reference-guides/scheduler.md).

# 스케쥴러(Scheduler) 참조 안내서

## 개요

* o2scheduler는 dbms\_job, dbms\_scheduler가 내부에서 사용하는 job/schedule 프레임워크입니다.
* dbms\_job 및 dbms\_scheduler 패키지 사용 전, 반드시 o2scheduler 설치 및 활성화 되어 있어야 합니다.
* o2scheduler 설치 후 생성되는 테이블, 트리거 등 관련 객체는 직접 사용하지 않도록 합니다.
* 모든 o2scheduler 관련 객체들은 `o2scheduler` 라는 스키마를 사용하며 해당 스키마 내부에 만들어집니다.

## 설치 설정

o2scheduler는 다른 o2 extension처럼 설치 후, 활성화 하기 전에 추가적으로 postgresql.conf 파일을 수정합니다. 또한, 해당 작업 후에는 반드시 postgresql 서버를 재기동하여 수정한 값을 적용시켜줘야 합니다.

### shared\_preload\_libraries

postgresql.conf 파일 내용 중 `shared_preload_libraries` 항목의 값으로써 `o2scheduler` 를 추가하여, postgresql 기동될때 o2scheduler 구성파일이 같이 로드될 수 있도록 설정해줘야 합니다.

아래와 같이 postgresql.conf 파일을 수정합니다.

```
postgresql.conf 파일 내부 내용 중

...

#shared_preload_libraries = ''  # (change requires restart)  <= 이 라인을 아래와 같이 수정합니다.
shared_preload_libraries = 'o2scheduler'
(이때, 라인의 맨 앞 '#' 문자도 반드시 제거해줍니다.)
```

`shared_preload_libraries`는 사용자 환경에 따라 다른 extension들이 이미 추가되어 있을 수도 있습니다.

그러한 경우에는 `,` 를 활용하여 o2scheduler를 덧붙여줍니다.

```
shared_preload_libraries = 'a,b' <- 이미 a,b extension들이 추가되어있을 경우, 이어서 o2scheduler를 추가합니다.
=> shared_preload_libraries = 'a,b,o2scheduler'
```

### max\_worker\_processes

postgresql.conf 파일 내용 중 `max_worker_processes` 항목의 값 수치를 적절하게 증가시켜서, job 기능이 원활하게 수행될 수 있도록 합니다.

o2scheduler는 PostgreSQL가 관리하는 Background 프로세스 기능을 적극적으로 활용합니다.

o2scheduler를 사용하는 데이터베이스 및 job의 갯수가 많아질수록 더욱 많은 Background 프로세스를 생성하게 됩니다.

따라서, job을 많이 등록하고 활용해야하는 환경을 고려한다면, postgresql.conf 파일을 수정하여 `max_worker_processes` 수치를 적절하게 조정해줘야 합니다.

아래와 같이 postgresql.conf 파일을 수정합니다.

```
postgresql.conf 파일 내부 내용 중

...

#max_worker_processes = 8   # (change requires restart)  <= 이 라인을 아래와 같이 수정합니다.
max_worker_processes = {원하는 숫자}
(이때, 라인의 맨 앞 '#' 문자도 반드시 제거해줍니다)
```

#### max\_worker\_processes란?

* 이 값은 동시 다발적으로 실행될 수 있는 최대 백그라운드 작업의 총 개수를 의미합니다.
* 수치가 클수록 더 많은 컴퓨터 리소스를 소모하지만, 더 많은 작업을 동시에 처리할 수 있습니다.
* 기본값인 8은 간단한 환경에서 충분할 수 있으나, 동시에 많은 job을 스케줄링 및 실행해야 하는 경우 부족할 수 있고 job 수행에 차질이 생길 수도 있습니다.
* CPU 코어 수 이상으로 설정하는 것을 권장하며, `CPU 코어 수 + 약간의 여유`를 시작점으로서 조정 후 워크로드에 따라 모니터링 후 조정하는 것을 권장합니다.
* 예를 들어, 8코어 서버에서 스케줄러가 동시에 최소 10개의 작업을 처리되는 것을 보장하고 싶다면,\
  `8 (코어 개수) + 10 (스케줄러) + 2 (여유분) = 20` 과 같이 설정하는 것을 고려해볼 수 있습니다.
* 정확한 값은 시스템 환경과 워크로드 및 리소스 상태를 모니터링하며 조정하는 것이 필요합니다.

### 설치 설정 후 o2scheduler 활성화

postgresql에 접속하여 다음 명령어로 o2scheduler extension을 활성화를 합니다.

```
create extension o2scheduler;
```

단, o2scheduler는 create extension을 수행한 데이터베이스에 대해서만 job 기능을 수행할 수 있습니다.

예를 들어, job 기능을 필요로 하는 데이터베이스가 A, B 두개가 있다면, 각각 두개의 데이터베이스로 따로 접속하여 개별로 create extension 명령어로 o2scheduler를 활성화 해주어야 합니다.

`\dx` 명령어를 활용하면 현재 접속한 데이터베이스의 o2scheduler 적용 여부를 확인할 수 있습니다.

```
root=# create extension o2scheduler;
CREATE EXTENSION

root=# \dx
                                   List of installed extensions
    Name     | Version |   Schema   |                         Description                          
-------------+---------+------------+--------------------------------------------------------------
 o2scheduler | 1.0     | public     | Provides scheduler functions compatible with Oracle database
 plpgsql     | 1.0     | pg_catalog | PL/pgSQL procedural language
(2 rows)
```

### 메타 테이블

O2SCHEDULER를 설치하면, `o2scheduler` 라는 스키마가 생성되고 해당 스키마 내부에 실질적으로 JOB 데이터를 저장 및 관리하기 위한 메타 테이블을 생성합니다.

**해당 테이블들에 직접 값을 수정 하거나 추가/삭제하는 행위는 권장하지 않으며**, DBMS\_JOB/DBMS\_SCHEDULER 패키지를 통해 해당 테이블들에 값이 추가/변경되는 것을 확인 및 참고하는 용도로만 메타 테이블을 활용하도록 합니다.

#### O2SCHEDULER.JOB

JOB의 정보를 관리하는 메타 테이블입니다.

DBMS\_JOB/DBMS\_SCHEDULER 패키지에서 생성되는 JOB들이 해당 테이블에 저장되며,\
각 패키지의 성격에 따라 JOB에 대해 추가적인 메타 정보 관리가 필요한 경우에는 각각 패키지가 추가로 정의한 별도 테이블에 관리됩니다.

즉, 해당 테이블은 DBMS\_JOB/DBMS\_SCHEDULER가 공통적으로 사용하는 JOB의 최소한의 필수 메타 정보만 관리합니다.

| Column         | Type        | Nullable | Default Value    | Description                                        |
| -------------- | ----------- | -------- | ---------------- | -------------------------------------------------- |
| ID             | INTEGER     | X (PK)   | integer sequence | JOB의 식별번호이다.; 생성 시 1씩 증가합니다.                       |
| USERNAME       | TEXT        | O        |                  | JOB의 소유자입니다.                                       |
| COMMAND\_EXPR  | TEXT        | X        |                  | JOB이 수행할 작업의 내용입니다.                                |
| COMMAND\_TYPE  | TEXT        | X        |                  | JOB이 수행할 작업의 유형입니다.                                |
| SCHEDULE\_EXPR | TEXT        | O        |                  | JOB의 다음 수행시각 계산식입니다.                               |
| SCHEDULE\_TYPE | TEXT        | O        |                  | JOB의 다음 수행시각 계산 유형입니다.                             |
| SCHEDULE\_TIME | TEXT        | O        |                  | <p>JOB의 예정 수행시각이다;<br>null일 경우 job을 실행하지 않습니다.</p> |
| CREATED\_AT    | TIMESTAMPTZ | O        | now()            | JOB 생성 시각입니다.                                      |
| UPDATED\_AT    | TIMESTAMPTZ | O        | now()            | JOB 갱신 시각입니다.                                      |
| DELETED\_AT    | TIMESTAMPTZ | O        |                  | <p>JOB 삭제 시각입니다;<br>not null일 경우 실행하지 않습니다.</p>    |

#### O2SCHEDULER.JOB\_RUN\_DETAILS

JOB들의 수행 이력을 기록하는 히스토리 테이블입니다.

DBMS\_JOB/DBMS\_SCHEDULER 패키지에서 생성된 JOB들이 수행되었을때 JOB의 성공/실패가 기록됩니다.

| Column         | Type    | Nullable | Default value    | Description                                                                            |
| -------------- | ------- | -------- | ---------------- | -------------------------------------------------------------------------------------- |
| ID             | INTEGER | X (PK)   | integer sequence | JOB 수행의 식별번호이다; 생성 시 1씩 증가합니다.                                                         |
| JOB\_ID        | INTEGER | O        |                  | JOB의 식별번호이다.; JOB 테이블의 ID와 동일합니다.                                                      |
| WORKER\_PID    | INTEGER | O        |                  | JOB을 수행한 프로세스의 PID입니다.                                                                 |
| USERNAME       | TEXT    | O        |                  | JOB을 수행한 사용자입니다.                                                                       |
| STATUS         | TEXT    | O        |                  | <p>JOB 수행 상태입니다.;<br><code>success</code>/<code>failed</code>/<code>running</code></p> |
| MESSAGE        | TEXT    | O        |                  | JOB 수행 후 추가 메세지입니다.                                                                    |
| START\_TIME    | TEXT    | O        |                  | JOB의 실제 수행 시작 시각입니다.                                                                   |
| END\_TIME      | TEXT    | O        |                  | JOB의 실제 수행 종료 시각입니다.                                                                   |
| SCHEDULE\_TIME | TEXT    | O        |                  | JOB의 예정 되었었던 수행 시작 시각입니다.                                                              |

#### DBMS\_JOB.BROKEN\_JOB

JOB이 실패한 횟수와 실패한 시간을 담은 테이블입니다.

<table><thead><tr><th>Column</th><th width="130.8203125">Type</th><th width="69.28125">Nullable</th><th>Default value</th><th>Description</th></tr></thead><tbody><tr><td>JOB_ID</td><td>INTEGER</td><td>X</td><td></td><td>job의 id입니다.</td></tr><tr><td>FAILED_COUNT</td><td>INTEGER</td><td>X</td><td></td><td>JOB이 실패한 횟수입니다.</td></tr><tr><td>UPDATED_AT</td><td>TIMESTAMPTZ</td><td>X</td><td></td><td>마지막으로 작업이 실패한 시간입니다.</td></tr></tbody></table>

#### DBMS\_SCHEDULER.SCHEDULE\_JOB

DBMS\_SCHEDULER를 통해 생성한 JOB의 정보를 담는 메타테이블입니다.

| Column         | Type    | Nullable | Default value       | Description                                                      |
| -------------- | ------- | -------- | ------------------- | ---------------------------------------------------------------- |
| JOB\_ID        | INTEGER | X        |                     | JOB의 ID입니다.                                                      |
| JOB\_NAME      | TEXT    | X        |                     | JOB의 이름입니다.                                                      |
| SCHEDULE\_NAME | TEXT    | X        |                     | JOB의 SCHEDULE 이름입니다.                                             |
| JOB\_CLASS     | TEXT    | O        | DEFAULT\_JOB\_CLASS | <p>JOB\_CLASS의 이름입니다.</p><p>ORACLE과 호환성을 위해 존재하며 사용되지는 않습니다.</p> |
| ENABLED        | BOOLEAN | O        | FALSE               | JOB의 활성화 여부입니다.                                                  |
| AUTO\_DROP     | BOOLEAN | O        | TRUE                | AUTO\_DROP이 T RUE일 때, JOB이 완전히 종료되면 JOB이 삭제됩니다.                  |
| CASCADE        | BOOLEAN | O        | FALSE               | CASCADE가 TRUE이면, JOB이 삭제될 때 SCHEDULE도 삭제됩니다.                     |
| COMMENTS       | TEXT    | O        |                     | JOB에 대한 설명입니다.                                                   |

#### DBMS\_SCHEDULER.JOB\_ARGUMENT

JOB이 수행할 동작이 PROCEDURE일 때, PROCEDURE의 인자로 들어갈 기본 값으로 사용됩니다.

| Column             | Type    | Nullable | Default value | Description      |
| ------------------ | ------- | -------- | ------------- | ---------------- |
| JOB\_ID            | INTEGER | X        |               | JOB의 ID입니다.      |
| ARGUMENT\_POSITION | INTEGER | X        |               | ARGUMENT의 위치입니다. |
| ARGUMENT\_NAME     | TEXT    | O        |               | ARGUMENT의 이름입니다. |
| ARGUMENT\_VALUE    | TEXT    | X        |               | ARGUMENT의 값입니다.  |

#### DBMS\_SCHEDULER.PROGRAM

JOB이 수행할 동작인 PROGRAM이 저장되는 메타테이블입니다.

| Column          | Type    | Nullable | Default value | Description                                                                                                                                                           |
| --------------- | ------- | -------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ID              | INTEGER | X        |               | PROGRAM의 ID입니다.                                                                                                                                                       |
| OWNER           | OID     | O        | 현재 사용자의 OID   | PROGRAM을 생성한 사용자의 OID입니다.                                                                                                                                             |
| PROGRAM\_NAME   | TEXT    | X        |               | PROGRAM의 이름입니다.                                                                                                                                                       |
| PROGRAM\_TYPE   | TEXT    | X        |               | <p>PROGRAM의 타입입니다.</p><ul><li>PLSQL\_BLOCK</li><li>STORED\_PROCEDURE</li></ul>                                                                                        |
| PROGRAM\_ACTION | TEXT    | X        |               | <p>PROGRAM의 동작입니다.</p><ul><li>PROGRAM\_TYPE이 PLSQL\_BLOCK일 경우, PLSQL\_BLOCK의 내용이 들어갑니다.</li><li>PROGRAM\_TYPE이 STORED\_PROCEDURE인 경우, PROCEDURE의 이름이 들어갑니다.</li></ul> |
| NARGS           | INTEGER | O        | 0             | PROGRAM\_TYPE이 STORED\_PROCEDURE인 경우 PROCEDURE의 인자의 개수입니다.                                                                                                            |
| ENABLED         | BOOLEAN | O        | FALSE         | PROGRAM의 활성화 여부입니다.                                                                                                                                                   |
| COMMENTS        | TEXT    | O        |               | PROGRAM에 대한 설명입니다.                                                                                                                                                    |

#### DBMS\_SCHEDULER.PROGRAM\_ARGUMENT

JOB\_ARGUMENT에 정의했던 PROCEDURE의 인자값이 PROCEDURE의 인자로 덮어 씌워질 값에 대한 메타테이블입니다.

| Column             | Type    | Nullable | Default value | Description                                                               |
| ------------------ | ------- | -------- | ------------- | ------------------------------------------------------------------------- |
| PROGRAM\_ID        | INTEGER | X        |               | PROGRAM의 ID입니다.                                                           |
| ARGUMENT\_POSITION | INTEGER | X        |               | ARGUMENT의 위치입니다.                                                          |
| ARGUMENT\_NAME     | TEXT    | O        |               | ARGUMENT의 이름입니다.                                                          |
| ARGUMENT\_TYPE     | TEXT    | X        |               | ARGUMENT의 타입입니다.                                                          |
| DEFAULT\_VALUE     | TEXT    | O        |               | ARGUMENT의 기본값입니다.                                                         |
| OUT\_ARGUMENT      | BOOLEAN | O        | FALSE         | <p>인자의 OUT PARAMETER 여부입니다.</p><p>ORACLE과의 호환성을 위해 존재합니다. 사용되지는 않습니다.</p> |

#### DBMS\_SCHEDULER.SCEHDULE

<table><thead><tr><th width="166">Column</th><th width="141">Type</th><th width="117">Nullable</th><th width="110">Default value</th><th width="539">Description</th></tr></thead><tbody><tr><td>ID</td><td>INTEGER</td><td>X</td><td></td><td>SCHEDULE의 ID입니다.</td></tr><tr><td>SCHEDULE_NAME</td><td>TEXT</td><td>X</td><td></td><td>SCHEDULE의 이름입니다.</td></tr><tr><td>START_DATE</td><td>TIMESTAMP</td><td>O</td><td></td><td>SCHEDULE의 시작 일자입니다.</td></tr><tr><td>REPEAT_INTERVAL</td><td>TEXT</td><td>O</td><td></td><td><p>JOB이 실행되는 주기입니다.</p><ul><li>null일 경우한번만 실행됩니다.</li><li><p>regular_schedule이나 combined_schedule이 들어올 수 있습니다.</p><ul><li>regular_schedule : calendar_string으로 이루어진 문자열입니다.</li><li><p>combined_schedule : schedule의 이름입니다.</p><p><code>'schedule1' (', schedule2', ...)</code></p></li></ul></li></ul></td></tr><tr><td>END_DATE</td><td>TIMESTAMPTZ</td><td>O</td><td></td><td>SCHEDULE의 만료 일자입니다. null이 들어올 경우 종료되지 않습니다.</td></tr><tr><td>COMMENTS</td><td>TEXT</td><td>O</td><td></td><td>SCHEDULE에 대한 설명입니다.</td></tr></tbody></table>

### DBMS\_SCHEDULER의 repeating interval에 사용되는 Calendar Syntax

| Token type | Syntax                    | Description                                                                              |
| ---------- | ------------------------- | ---------------------------------------------------------------------------------------- |
| FREQ       | FREQ=predefined\_interval | 반복 주기입니다. 사용 가능한 값은 다음과 같습니다; YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, SECONDLY |
| BYMONTH    | BYMONTH=month(,month ...) | 월의 3글자 약어입니다.; JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC                |
| BYMONTH    | BYMONTH=month(,month ...) | 월의 숫자 표현입니다; 1,2,3,4,5,6,7,8,9,10,11,12                                                  |
| BYMONTHDAY | BYMONTHDAY=day\_of\_month | 1부터 31까지의 숫자입니다.                                                                         |
| BYDAY      | BYDAY=weekday             | <p>요일의 표현입니다. 3글자 약어나 요일의 숫자 표현으로도 사용 가능합니다.</p><p>Monday</p>                            |
| BYDATE     | BYDATE=date(, date ...)   | date의 형식이 `YYYYMMDD` 로 사용할 수 있습니다.                                                       |
| BYDATE     | BYDATE=date(, date ...)   | date의 형식이 `MMDD` 로 사용할 수 있습니다.                                                           |
| BYHOUR     | BYHOUR=hour               | 0부터 23까지의 숫자입니다.                                                                         |
| BYMINUTE   | BYMINUTE=minute           | 0부터 59까지의 숫자입니다.                                                                         |
| BYSECOND   | BYSECOND=second           | 0부터 59까지의 숫자입니다.                                                                         |


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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, and the optional `goal` query parameter:

```
GET https://docs.tibero.com/tmaxopensql/tmax-o2-extensions/reference-guides/scheduler.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
