Pg_cron으로 유지 관리 작업 예약하기

pg_cron 는 데이터베이스 내 작업 스케줄링을 제공하는 PostgreSQL 확장 프로그램으로, 외부 도구에 의존하지 않고도 SQL 작업을 자동화할 수 있습니다. 자세한 정보는 pg_cron의 내용을 참조하십시오.

pg_cron 확장자는 PostgreSQL 버전 13 이상에서 지원됩니다.

pg_cron 설정

  1. 관리자 사용자로 ibmclouddb 데이터베이스에 로그인합니다.

     \c ibmclouddb
    
  2. pg_cron 확장자를 활성화합니다.

     create extension pg_cron;
    
  3. pg_cron 이 설치되어 있는지 확인합니다.

     \dx
    

    pg_cron 는 현재 보안상의 이유로 관리자 사용자만 사용할 수 있으며 ibmclouddb 데이터베이스에만 설치할 수 있습니다.

  4. 다음 명령을 실행하여 pg_cron 에 대한 권한을 부여합니다.

     select public.grant_pgcron_privileges();
    

작업 스케줄 설정

cron.schedule_in_database() 을 사용하여 작업을 예약하세요.

SELECT cron.schedule_in_database(
    job_name text,
    schedule text,          -- cron expression
    command text,           -- SQL command to run
    database_name text      -- target database
);
  • 스케줄 작업을 보려면 다음과 같이 하세요:
select * from cron.job;
  • 상태 스케줄 작업을 보려면 다음과 같이 하세요:
 select * from cron.job_run_details;
  • 작업 예약을 취소하려면:
ibmclouddb=> SELECT cron.unschedule(jobid);
 unschedule
------------
 t
(1 row)

사용 예 pg_cron

  • Ibmclouddb 데이터베이스에 로그인합니다:
\c ibmclouddb
  • pg_cron 확장자를 활성화합니다:
ibmclouddb=> \dx
                 List of installed extensions
  Name   | Version |   Schema   |         Description
---------+---------+------------+------------------------------
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
(1 row)

ibmclouddb=> create extension pg_cron;
CREATE EXTENSION
ibmclouddb=>
ibmclouddb=> \dx
                 List of installed extensions
  Name   | Version |   Schema   |         Description
---------+---------+------------+------------------------------
 pg_cron | 1.6     | pg_catalog | Job scheduler for PostgreSQL
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
(2 rows)
  • pg_cron 에 대한 권한을 부여합니다:
ibmclouddb=> select public.grant_pgcron_privileges();
    grant_pgcron_privileges
--------------------------------
 Granted permission on pg_cron
(1 row)
  • 매주 일요일 오전 4시에 실행되도록 VACUUM 작업을 예약합니다.
SELECT cron.schedule_in_database(
    job_name text,
    schedule text,          -- cron expression
    command text,           -- SQL command to run
    database_name text      -- target database
);
 ibmclouddb=> SELECT cron.schedule_in_database('weekly-vacuum', '0 4 * * 0', 'VACUUM', 'test');
 schedule_in_database
----------------------
                   35
(1 row)

  • 예약된 작업을 보려면 다음과 같이 하세요:
ibmclouddb=> select * from cron.job;
 jobid | schedule  | command | nodename  | nodeport | database | username | active |    jobname
-------+-----------+---------+-----------+----------+----------+----------+--------+---------------
    35 | 0 4 * * 0 | VACUUM  | localhost |     5432 | test     | admin    | t      | weekly-vacuum
(1 row)

  • 작업 실행 세부 정보를 보려면 다음과 같이 하세요:
ibmclouddb=> select * from cron.job_run_details;
 jobid | runid | job_pid | database | username | command |  status   | return_message |          start_time           |           end_time
-------+-------+---------+----------+----------+---------+-----------+----------------+-------------------------------+-------------------------------
    35 |    85 |   33810 | test     | admin    | VACUUM  | succeeded | VACUUM         | 2025-09-23 15:48:00.013814+00 | 2025-09-23 15:48:01.29763+00
  • 작업 예약을 취소하려면:
ibmclouddb=> SELECT cron.unschedule(35);
 unschedule
------------
 t
(1 row)
  • cron.job_run_details 의 레코드는 자동으로 정리되지 않지만 크론 작업을 예약할 수 있는 모든 사용자에게는 자신의 cron.job_run_details 레코드를 삭제할 수 있는 권한이 있습니다.
ibmclouddb=> SELECT  cron.schedule('delete-job-run-details', '0 12 * * *', $$DELETE FROM cron.job_run_details WHERE end_time < now() - interval '7 days'$$);
  • pg_cron 작업은 확장, 장애 조치 또는 전환과 같은 활동의 결과로 데이터베이스가 다시 시작될 때마다 종료됩니다. 재시도 메커니즘이 없으므로 작업이 자동으로 다시 시작되지 않습니다. 다음 예약된 실행을 기다리거나 필요에 따라 일정을 조정해야 합니다.

  • 최대 5개의 pg_cron 작업이 동시에 실행되며, 추가 작업은 대기열에서 대기합니다.