PostgreSQL pg_cron 확장을 사용하여 유지 관리 예약 - Amazon Aurora

PostgreSQL pg_cron 확장을 사용하여 유지 관리 예약

PostgreSQL pg_cron 확장을 사용하여 PostgreSQL 데이터베이스 내에서 유지 관리 명령을 예약할 수 있습니다. 확장에 대한 자세한 내용은 pg_cron 설명서의 pg_cron이란 무엇입니까? 단원을 참조하십시오.

pg_cron 확장은 Aurora PostgreSQL 엔진 버전 12.6 이상에서 지원됩니다.

pg_cron 사용에 대한 자세한 내용은 RDS for PostgreSQL 또는 Aurora PostgreSQL 호환 에디션 데이터베이스에서 pg_cron을 사용하여 작업 예약을 참조하세요.

pg_cron 확장 설정

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

  1. shared_preload_libraries 파라미터 값에 pg_cron 을 추가하여 PostgreSQL DB 인스턴스와 연결된 사용자 지정 파라미터 그룹을 수정합니다.

    파라미터 그룹에 대한 변경 사항을 적용하려면 PostgreSQL DB 인스턴스를 다시 시작합니다. 파라미터 그룹 사용에 대한 자세한 내용은 Amazon Aurora PostgreSQL parameters. 단원을 참조하십시오.

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

    CREATE EXTENSION pg_cron;

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

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

데이터베이스 사용자에게 pg_cron 사용 권한 부여

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 테이블에 캡처됩니다. 자세한 내용은 작업 예약 및 상태 캡처를 위한 테이블 단원을 참조하십시오.

pg_cron 작업 예약

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

참고

pg_cron 작업을 생성할 때 max_worker_processes 설정이 cron.max_running_jobs 개수보다 큰지 확인하십시오. 백그라운드 작업자 프로세스가 부족하면 pg_cron 작업은 실패합니다. 기본 pg_cron 작업 수는 5입니다. 자세한 내용은 pg_cron 확장을 관리하기 위한 파라미터 단원을 참조하십시오.

테이블 베큠

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

다음은 매일 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)

자세한 내용은 작업 예약 및 상태 캡처를 위한 테이블 단원을 참조하십시오.

pg_cron 기록 테이블 지우기

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

다음 예에서는 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.log 파일에만 오류 로깅

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

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

postgres=> SHOW cron.log_run;

자세한 내용은 pg_cron 확장을 관리하기 위한 파라미터 단원을 참조하십시오.

기본 데이터베이스 이외의 데이터베이스에 대한 cron 작업 예약

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

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

    postgres=> SELECT cron.schedule('database1 manual vacuum', '29 03 * * *', 'vacuum freeze test_table');
  2. rds_superuser 역할을 가진 사용자는 방금 생성한 작업에 대한 데이터베이스 열을 업데이트하여 PostgreSQL DB 인스턴스 내의 다른 데이터베이스에서 실행되도록 합니다.

    postgres=> UPDATE cron.job SET database = 'database1' WHERE jobid = 106;
  3. 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_cron 확장에 대한 참조

pg_cron 확장과 함께 다음 파라미터, 함수 및 테이블을 사용할 수 있습니다. 자세한 내용은 pg_cron 설명서의 pg_cron이란 무엇입니까? 단원을 참조하세요.

pg_cron 확장을 관리하기 위한 파라미터

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

파라미터 설명

cron.database_name

pg_cron 메타데이터가 보관되는 데이터베이스입니다.

cron.host

PostgreSQL에 연결할 호스트 이름입니다. 이 값은 수정할 수 없습니다.

cron.log_run

job_run_details 테이블에서 실행되는 모든 작업을 로깅합니다. 유효한 값은 on 또는 off입니다. 자세한 내용은 작업 예약 및 상태 캡처를 위한 테이블 섹션을 참조하세요.

cron.log_statement

모든 cron 문을 실행하기 전에 기록합니다. 유효한 값은 on 또는 off입니다.

cron.max_running_jobs

동시에 실행할 수 있는 최대 작업 수입니다.

cron.use_background_workers

클라이언트 세션 대신 백그라운드 작업자를 사용합니다. 이 값은 수정할 수 없습니다.

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

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

함수 참조: cron.schedule

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

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

구문
cron.schedule (job_name, schedule, command ); cron.schedule (schedule, command );
파라미터
파라미터 설명
job_name

cron 작업의 이름입니다.

schedule

cron 작업의 일정을 나타내는 텍스트입니다. 형식은 표준 cron 형식입니다.

command 실행할 명령의 텍스트입니다.
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

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

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

구문
cron.unschedule (job_id); cron.unschedule (job_name);
파라미터
파라미터 설명
job_id

cron 작업이 예약된 경우 cron.schedule 함수에서 반환된 작업 식별자입니다.

job_name

cron.schedule 함수로 예약된 cron 작업의 이름입니다.

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

작업 예약 및 상태 캡처를 위한 테이블

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

설명
cron.job

예약된 각 작업에 대한 메타데이터를 포함합니다. 이 테이블과의 대부분의 상호 작용은 cron.schedulecron.unschedule 함수를 사용하여 수행해야 합니다.

중요

이 테이블에 직접 업데이트 또는 삽입 권한을 부여하지 않는 것이 좋습니다. 이렇게 하면 사용자가 username(으)로 실행되도록 rds-superuser 열을 업데이트할 수 있습니다.

cron.job_run_details

이전에 예약된 작업 실행에 대한 기록 정보를 포함합니다. 이는 실행한 작업에서 상태, 반환 메시지, 시작 및 종료 시간을 조사하는 데 유용합니다.

참고

이 테이블이 무한정 증가하지 않게 하려면 정기적으로 삭제하세요. 관련 예제는 pg_cron 기록 테이블 지우기 섹션을 참조하세요