Pianificazione dei lavori di manutenzione con pg_cron

pg_cron è un'estensione di PostgreSQL che fornisce la programmazione dei lavori all'interno del database, consentendo di automatizzare le attività SQL senza ricorrere a strumenti esterni. Per ulteriori informazioni, vedere pg_cron.

L'estensione pg_cron è supportata da PostgreSQL versione 13 e successive.

Configurazione pg_cron

  1. Accedere al database ibmclouddb come utente admin.

     \c ibmclouddb
    
  2. Abilitare l'estensione pg_cron.

     create extension pg_cron;
    
  3. Verificare se pg_cron è installato.

     \dx
    

    pg_cron può essere installato solo sui database ibmclouddb e può essere usato solo dall'utente amministratore per motivi di sicurezza.

  4. Eseguire il seguente comando per concedere i privilegi a pg_cron.

     select public.grant_pgcron_privileges();
    

Pianificazione dei lavori

Utilizzate cron.schedule_in_database() per programmare i vostri lavori.

SELECT cron.schedule_in_database(
    job_name text,
    schedule text,          -- cron expression
    command text,           -- SQL command to run
    database_name text      -- target database
);
  • Per visualizzare i lavori di pianificazione:
select * from cron.job;
  • Per visualizzare lo stato di pianificazione dei lavori:
 select * from cron.job_run_details;
  • Per annullare la programmazione dei lavori:
ibmclouddb=> SELECT cron.unschedule(jobid);
 unschedule
------------
 t
(1 row)

Esempio di utilizzo pg_cron

  • Accedere al database ibmclouddb:
\c ibmclouddb
  • Abilitare l'estensione 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)
  • Concessione di privilegi per pg_cron:
ibmclouddb=> select public.grant_pgcron_privileges();
    grant_pgcron_privileges
--------------------------------
 Granted permission on pg_cron
(1 row)
  • Pianificazione di un lavoro VACUUM da eseguire ogni domenica alle 4:00 del mattino.
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)

  • Per visualizzare i lavori programmati:
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)

  • Per visualizzare i dettagli dell'esecuzione del lavoro:
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
  • Per annullare la programmazione dei lavori:
ibmclouddb=> SELECT cron.unschedule(35);
 unschedule
------------
 t
(1 row)
  • I record di cron.job_run_details non vengono puliti automaticamente, ma ogni utente che può pianificare lavori di cron ha anche l'autorizzazione a cancellare i propri record di 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 i lavori vengono terminati ogni volta che il database viene riavviato in seguito ad attività come lo scaling, il failover o lo switchover. Poiché non esiste un meccanismo di ripetizione, il lavoro non riprenderà automaticamente. È necessario attendere la successiva esecuzione programmata o regolare la pianificazione secondo le necessità.

  • Vengono eseguiti contemporaneamente fino a 5 lavori di pg_cron; i lavori in più attendono in una coda.