

# PostgreSQL pg\$1cron 확장을 사용하여 유지 관리 예약
<a name="PostgreSQL_pg_cron"></a>

PostgreSQL `pg_cron` 확장을 사용하여 PostgreSQL 데이터베이스 내에서 유지 관리 명령을 예약할 수 있습니다. 확장에 대한 자세한 내용은 pg\$1cron 설명서의 [pg\$1cron이란 무엇입니까?](https://github.com/citusdata/pg_cron) 섹션을 참조하십시오.

`pg_cron` 확장은 RDS for PostgreSQL 엔진 버전 12.5 이상에서 지원됩니다.

`pg_cron` 사용에 대한 자세한 내용은 [RDS for PostgreSQL 또는 Aurora PostgreSQL 호환 에디션 데이터베이스에서 pg\$1cron을 사용하여 작업 예약](https://aws.amazon.com/blogs/database/schedule-jobs-with-pg_cron-on-your-amazon-rds-for-postgresql-or-amazon-aurora-for-postgresql-databases/)을 참조하세요.

**참고**  
`pg_cron` 확장 버전은 pg\$1available\$1extensions 보기에 1.6과 같은 2자리 버전으로 표시됩니다. 일부 컨텍스트에 나열된 1.6.4 또는 1.6.5와 같은 세 자리 버전이 표시될 수 있지만, 확장 업그레이드를 수행할 때 두 자리 버전을 지정해야 합니다.

**Topics**
+ [pg\$1cron 확장 설정](#PostgreSQL_pg_cron.enable)
+ [데이터베이스 사용자에게 pg\$1cron 사용 권한 부여](#PostgreSQL_pg_cron.permissions)
+ [pg\$1cron 작업 예약](#PostgreSQL_pg_cron.examples)
+ [pg\$1cron 확장에 대한 참조](#PostgreSQL_pg_cron.reference)

## pg\$1cron 확장 설정
<a name="PostgreSQL_pg_cron.enable"></a>

다음과 같이 `pg_cron` 확장을 설정합니다.

1. `shared_preload_libraries` 파라미터 값에 `pg_cron` 을 추가하여 PostgreSQL DB 인스턴스와 연결된 사용자 지정 파라미터 그룹을 수정합니다.
   + RDS for PostgreSQL DB 인스턴스가 `rds.allowed_extensions` 파라미터를 사용하여 설치할 수 있는 확장을 명시적으로 나열하는 경우 목록에 `pg_cron` 확장을 추가해야 합니다. RDS for PostgreSQL의 특정 버전에서만 `rds.allowed_extensions` 파라미터를 지원합니다. 기본적으로 사용 가능한 모든 확장이 허용됩니다. 자세한 내용은 [PostgreSQL 확장의 설치 제한](PostgreSQL.Concepts.General.FeatureSupport.Extensions.md#PostgreSQL.Concepts.General.FeatureSupport.Extensions.Restriction) 섹션을 참조하십시오.

   파라미터 그룹에 대한 변경 사항을 적용하려면 PostgreSQL DB 인스턴스를 다시 시작합니다. 파라미터 그룹 사용에 대한 자세한 내용은 [Amazon RDS에서 DB 파라미터 그룹의 파라미터 수정](USER_WorkingWithParamGroups.Modifying.md). 섹션을 참조하십시오.

1. PostgreSQL DB 인스턴스가 다시 시작된 후 `rds_superuser` 권한이 있는 계정을 사용하여 다음 명령을 수행합니다. 예를 들어 RDS for PostgreSQL DB 인스턴스를 생성할 때 기본 설정을 사용한 경우 사용자 `postgres`로 연결하고 확장을 생성합니다.

   ```
   CREATE EXTENSION pg_cron;
   ```

   `pg_cron` 스케줄러는 `postgres`라는 기본 PostgreSQL 데이터베이스에 설정됩니다. `pg_cron` 객체가 이 `postgres` 데이터베이스에 생성되고 모든 예약 작업이 이 데이터베이스에서 실행됩니다.

1. 기본 설정을 사용하거나 PostgreSQL DB 인스턴스 내의 다른 데이터베이스에서 실행되도록 작업을 예약할 수 있습니다. PostgreSQL DB 인스턴스 내의 다른 데이터베이스에 대한 작업을 예약하려면 [기본 데이터베이스 이외의 데이터베이스에 대한 cron 작업 예약](#PostgreSQL_pg_cron.otherDB)의 예제를 참조하세요.

## 데이터베이스 사용자에게 pg\$1cron 사용 권한 부여
<a name="PostgreSQL_pg_cron.permissions"></a>

`pg_cron` 확장을 설치하려면 `rds_superuser` 권한이 필요합니다. 그러나 `pg_cron` 사용 권한은 (`rds_superuser` 그룹/역할의 구성원에 의해) 다른 데이터베이스 사용자에게 부여되어 자신의 작업을 예약할 수 있습니다. 프로덕션 환경에서 작업을 개선하는 경우 필요한 경우에만 `cron` 스키마에 권한을 부여하는 것이 좋습니다.

`cron` 스키마에서 데이터베이스 사용자 권한을 부여하려면 다음 명령을 실행합니다.

```
postgres=> GRANT USAGE ON SCHEMA cron TO db-user;
```

이렇게 하면 액세스 권한이 있는 개체에 대해 cron 작업을 예약하기 위해 `cron` 스키마에 액세스할 수 있는 권한이 *db-user*에게 부여됩니다. 데이터베이스 사용자에게 권한이 없으면 다음과 같이 `postgresql.log` 파일에 오류 메시지를 게시한 후 작업이 실패합니다.

```
2020-12-08 16:41:00 UTC::@:[30647]:ERROR: permission denied for table table-name
2020-12-08 16:41:00 UTC::@:[27071]:LOG: background worker "pg_cron" (PID 30647) exited with exit code 1
```

즉, `cron` 스키마에 대한 사용 권한이 부여된 데이터베이스 사용자는 예약하려는 개체(테이블, 스키마 등)에 대한 사용 권한도 있어야 합니다.

cron 작업 및 성공 또는 실패에 대한 세부 정보도 `cron.job_run_details` 테이블에 캡처됩니다. 자세한 내용은 [작업 예약 및 상태 캡처를 위한 테이블](#PostgreSQL_pg_cron.tables) 섹션을 참조하세요.

## pg\$1cron 작업 예약
<a name="PostgreSQL_pg_cron.examples"></a>

다음 단원에서는 `pg_cron` 작업을 사용하여 다양한 관리 태스크를 예약하는 방법을 보여 줍니다.

**참고**  
`pg_cron` 작업을 생성할 때 `max_worker_processes` 설정이 `cron.max_running_jobs` 개수보다 큰지 확인하십시오. 백그라운드 작업자 프로세스가 부족하면 `pg_cron` 작업은 실패합니다. 기본 `pg_cron` 작업 수는 `5`입니다. 자세한 내용은 [pg\$1cron 확장을 관리하기 위한 파라미터](#PostgreSQL_pg_cron.parameters) 섹션을 참조하십시오.

**Topics**
+ [테이블 베큠](#PostgreSQL_pg_cron.vacuum)
+ [pg\$1cron 기록 테이블 지우기](#PostgreSQL_pg_cron.job_run_details)
+ [postgresql.log 파일에만 오류 로깅](#PostgreSQL_pg_cron.log_run)
+ [기본 데이터베이스 이외의 데이터베이스에 대한 cron 작업 예약](#PostgreSQL_pg_cron.otherDB)

### 테이블 베큠
<a name="PostgreSQL_pg_cron.vacuum"></a>

Autovacuum은 대부분의 경우 정리 유지 관리를 처리합니다. 하지만 선택한 시간에 특정 테이블을 베큠하도록 예약해야 하는 경우도 있습니다.

또한 [Amazon RDS for PostgreSQL에서 PostgreSQL 자동 정리 사용](Appendix.PostgreSQL.CommonDBATasks.Autovacuum.md) 섹션도 참조하세요.

다음은 매일 22:00(GMT)에 특정 테이블에 `cron.schedule`를 사용하는 작업을 설정하는 `VACUUM FREEZE` 함수의 사용 예입니다.

```
SELECT cron.schedule('manual vacuum', '0 22 * * *', 'VACUUM FREEZE pgbench_accounts');
 schedule
----------
1
(1 row)
```

앞의 예제를 실행한 후, 다음과 같이 `cron.job_run_details` 테이블에서 기록을 확인할 수 있습니다.

```
postgres=> SELECT * FROM cron.job_run_details;
jobid  | runid | job_pid | database | username | command                        | status    | return_message | start_time                    | end_time
-------+-------+---------+----------+----------+--------------------------------+-----------+----------------+-------------------------------+-------------------------------
 1     | 1     | 3395    | postgres | adminuser| vacuum freeze pgbench_accounts | succeeded | VACUUM         | 2020-12-04 21:10:00.050386+00 | 2020-12-04 21:10:00.072028+00
(1 row)
```

다음은 실패한 작업을 확인하기 위한 `cron.job_run_details` 테이블의 쿼리입니다.

```
postgres=> SELECT * FROM cron.job_run_details WHERE status = 'failed';
jobid | runid | job_pid | database | username | command                       | status | return_message                                   | start_time                    | end_time
------+-------+---------+----------+----------+-------------------------------+--------+--------------------------------------------------+-------------------------------+------------------------------
 5    | 4     | 30339   | postgres | adminuser| vacuum freeze pgbench_account | failed | ERROR: relation "pgbench_account" does not exist | 2020-12-04 21:48:00.015145+00 | 2020-12-04 21:48:00.029567+00
(1 row)
```

자세한 내용은 [작업 예약 및 상태 캡처를 위한 테이블](#PostgreSQL_pg_cron.tables) 섹션을 참조하세요.

### pg\$1cron 기록 테이블 지우기
<a name="PostgreSQL_pg_cron.job_run_details"></a>

`cron.job_run_details` 테이블에는 시간이 지남에 따라 매우 커질 수 있는 cron 작업 기록이 포함되어 있습니다. 이 테이블을 지우는 작업을 예약하는 것이 좋습니다. 예를 들어, 1 주일 분량의 항목을 보관하면 문제 해결을 위해 충분할 수 있습니다.

다음 예에서는 [cron.schedule](#PostgreSQL_pg_cron.schedule) 함수를 사용하여, 매일 자정에 실행되어 `cron.job_run_details` 테이블을 지우는 작업을 예약합니다. 이 작업은 지난 7 일 동안의 항목만 유지합니다. `rds_superuser` 계정을 사용하여 다음과 같은 작업을 예약합니다.

```
SELECT cron.schedule('0 0 * * *', $$DELETE 
    FROM cron.job_run_details 
    WHERE end_time < now() - interval '7 days'$$);
```

자세한 내용은 [작업 예약 및 상태 캡처를 위한 테이블](#PostgreSQL_pg_cron.tables) 섹션을 참조하세요.

### postgresql.log 파일에만 오류 로깅
<a name="PostgreSQL_pg_cron.log_run"></a>

`cron.job_run_details` 테이블에 대한 쓰기 작업을 완전히 차단하려면 PostgreSQL DB 인스턴스와 연결된 파라미터 그룹을 수정하고 `cron.log_run` 파라미터를 '꺼짐'으로 설정합니다. `pg_cron` 확장이 더 이상 테이블에 기록하지 않고 `postgresql.log` 파일에만 오류를 캡처합니다. 자세한 내용은 [Amazon RDS에서 DB 파라미터 그룹의 파라미터 수정](USER_WorkingWithParamGroups.Modifying.md) 섹션을 참조하세요.

다음 명령을 사용하여 `cron.log_run` 파라미터 값을 확인합니다.

```
postgres=> SHOW cron.log_run;
```

자세한 내용은 [pg\$1cron 확장을 관리하기 위한 파라미터](#PostgreSQL_pg_cron.parameters) 섹션을 참조하세요.

### 기본 데이터베이스 이외의 데이터베이스에 대한 cron 작업 예약
<a name="PostgreSQL_pg_cron.otherDB"></a>

`pg_cron`의 메타데이터는 모두 `postgres`라는 PostgreSQL 기본 데이터베이스에 보관됩니다. 백그라운드 작업자는 유지 관리 cron 작업을 실행하는 데 사용되므로 PostgreSQL DB 인스턴스 내의 모든 데이터베이스에서 작업을 예약할 수 있습니다.

**참고**  
`rds_superuser` 역할 또는 `rds_superuser` 권한이 있는 사용자만 데이터베이스의 모든 cron 작업을 나열할 수 있습니다. 다른 사용자는 `cron.job` 테이블에서 자신의 작업만 볼 수 있습니다.

1. cron 데이터베이스에서 정상적으로 [cron.schedule](#PostgreSQL_pg_cron.schedule)을(를) 사용하는 것처럼 작업을 예약합니다.

   ```
   postgres=> SELECT cron.schedule('database1 manual vacuum', '29 03 * * *', 'vacuum freeze test_table');
   ```

1. `rds_superuser` 역할을 가진 사용자는 방금 생성한 작업에 대한 데이터베이스 열을 업데이트하여 PostgreSQL DB 인스턴스 내의 다른 데이터베이스에서 실행되도록 합니다.

   ```
   postgres=> UPDATE cron.job SET database = 'database1' WHERE jobid = 106;
   ```

1.  `cron.job` 테이블을 쿼리하여 확인합니다.

   ```
   postgres=> SELECT * FROM cron.job;
   jobid | schedule    | command                        | nodename  | nodeport | database | username  | active | jobname
   ------+-------------+--------------------------------+-----------+----------+----------+-----------+--------+-------------------------
   106   | 29 03 * * * | vacuum freeze test_table       | localhost | 8192     | database1| adminuser | t      | database1 manual vacuum
     1   | 59 23 * * * | vacuum freeze pgbench_accounts | localhost | 8192     | postgres | adminuser | t      | manual vacuum
   (2 rows)
   ```

**참고**  
경우에 따라, 다른 데이터베이스에서 실행하고자 하는 cron 작업을 추가할 수 있습니다. 이 경우, 올바른 데이터베이스 열을 업데이트하기 전에 작업이 기본 데이터베이스(`postgres`)에서 실행을 시도할 수 있습니다. 사용자 이름에 권한이 있으면 작업이 기본 데이터베이스에서 성공적으로 실행됩니다.

## pg\$1cron 확장에 대한 참조
<a name="PostgreSQL_pg_cron.reference"></a>

`pg_cron` 확장과 함께 다음 파라미터, 함수 및 테이블을 사용할 수 있습니다. 자세한 내용은 pg\$1cron 설명서의 [pg\$1cron이란 무엇입니까?](https://github.com/citusdata/pg_cron) 섹션을 참조하세요.

**Topics**
+ [pg\$1cron 확장을 관리하기 위한 파라미터](#PostgreSQL_pg_cron.parameters)
+ [함수 참조: cron.schedule](#PostgreSQL_pg_cron.schedule)
+ [함수 참조: cron.unschedule](#PostgreSQL_pg_cron.unschedule)
+ [작업 예약 및 상태 캡처를 위한 테이블](#PostgreSQL_pg_cron.tables)

### pg\$1cron 확장을 관리하기 위한 파라미터
<a name="PostgreSQL_pg_cron.parameters"></a>

다음은 `pg_cron` 확장 동작을 제어하는 파라미터의 목록입니다.


| 파라미터 | 설명 | 
| --- | --- | 
| cron.database\$1name |  `pg_cron` 메타데이터가 보관되는 데이터베이스입니다.  | 
| cron.host |  PostgreSQL에 연결할 호스트 이름입니다. 이 값은 수정할 수 없습니다.  | 
| cron.log\$1run |  `job_run_details` 테이블에서 실행되는 모든 작업을 로깅합니다. 유효한 값은 `on` 또는 `off`입니다. 자세한 내용은 [작업 예약 및 상태 캡처를 위한 테이블](#PostgreSQL_pg_cron.tables) 섹션을 참조하세요.  | 
| cron.log\$1statement |  모든 cron 문을 실행하기 전에 기록합니다. 유효한 값은 `on` 또는 `off`입니다.  | 
| cron.max\$1running\$1jobs |  동시에 실행할 수 있는 최대 작업 수입니다.  | 
| cron.use\$1background\$1workers |  클라이언트 세션 대신 백그라운드 작업자를 사용합니다. 이 값은 수정할 수 없습니다.  | 

다음 SQL 명령을 사용하여 이러한 파라미터와 해당 값을 표시합니다.

```
postgres=> SELECT name, setting, short_desc FROM pg_settings WHERE name LIKE 'cron.%' ORDER BY name;
```

### 함수 참조: cron.schedule
<a name="PostgreSQL_pg_cron.schedule"></a>

이 함수는 cron 작업을 예약합니다. 작업은 처음에 기본 `postgres` 데이터베이스에서 예약됩니다. 이 함수는 작업 식별자를 나타내는 `bigint` 값을 반환합니다. PostgreSQL DB 인스턴스 내의 다른 데이터베이스에서 작업이 실행되도록 예약하려면 [기본 데이터베이스 이외의 데이터베이스에 대한 cron 작업 예약](#PostgreSQL_pg_cron.otherDB)의 예제를 참조하세요.

이 함수에는 두 가지 구문 형식이 있습니다.

**구문**  

```
cron.schedule (job_name,
    schedule,
    command
);

cron.schedule (schedule,
    command
);
```

**파라미터**      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/PostgreSQL_pg_cron.html)

**예제**  

```
postgres=> SELECT cron.schedule ('test','0 10 * * *', 'VACUUM pgbench_history');
 schedule
----------
      145
(1 row)

postgres=> SELECT cron.schedule ('0 15 * * *', 'VACUUM pgbench_accounts');
 schedule
----------
      146
(1 row)
```

### 함수 참조: cron.unschedule
<a name="PostgreSQL_pg_cron.unschedule"></a>

이 함수는 cron 작업을 삭제합니다. `job_name` 또는 `job_id`를 지정할 수 있습니다. 정책은 사용자가 작업 일정을 제거할 수 있는 소유자인지를 확인합니다. 이 함수는 성공 또는 실패를 나타내는 부울 값을 반환합니다.

함수의 구문 형식은 다음과 같습니다.

**구문**  

```
cron.unschedule (job_id);

cron.unschedule (job_name);
```

**파라미터**      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/PostgreSQL_pg_cron.html)

**예제**  

```
postgres=> SELECT cron.unschedule(108);
 unschedule
------------
 t
(1 row)

postgres=> SELECT cron.unschedule('test');
 unschedule
------------
 t
(1 row)
```

### 작업 예약 및 상태 캡처를 위한 테이블
<a name="PostgreSQL_pg_cron.tables"></a>

다음 표는 cron 작업을 예약하고 작업 완료 방법을 기록하는 데 사용됩니다.


| 표 | 설명 | 
| --- | --- | 
| cron.job |  예약된 각 작업에 대한 메타데이터를 포함합니다. 이 테이블과의 대부분의 상호 작용은 `cron.schedule` 및 `cron.unschedule` 함수를 사용하여 수행해야 합니다.  이 테이블에 직접 업데이트 또는 삽입 권한을 부여하지 않는 것이 좋습니다. 이렇게 하면 사용자가 `username`(으)로 실행되도록 `rds-superuser` 열을 업데이트할 수 있습니다.   | 
| cron.job\$1run\$1details |  이전에 예약된 작업 실행에 대한 기록 정보를 포함합니다. 이는 실행한 작업에서 상태, 반환 메시지, 시작 및 종료 시간을 조사하는 데 유용합니다.  이 테이블이 무한정 증가하지 않게 하려면 정기적으로 삭제하세요. 관련 예제는 [pg\$1cron 기록 테이블 지우기](#PostgreSQL_pg_cron.job_run_details) 섹션을 참조하세요   | 