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
-
Accedere al database ibmclouddb come utente admin.
\c ibmclouddb -
Abilitare l'estensione
pg_cron.create extension pg_cron; -
Verificare se
pg_cronè installato.\dxpg_cronpuò essere installato solo sui database ibmclouddb e può essere usato solo dall'utente amministratore per motivi di sicurezza. -
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_detailsnon 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_croni 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.