Planification des tâches de maintenance avec pg_cron
pg_cron est une extension de PostgreSQL qui permet de planifier des tâches dans la base de données, ce qui vous permet d'automatiser des tâches SQL sans dépendre d'outils externes. Pour plus d'informations, voir pg_cron.
L'extension pg_cron est prise en charge par PostgreSQL à partir de la version 13.
Configuration de pg_cron
-
Connectez-vous à la base de données ibmclouddb en tant qu'utilisateur admin.
\c ibmclouddb -
Activer l'extension
pg_cron.create extension pg_cron; -
Vérifiez si
pg_cronest installé.\dxpg_cronne peut être installé que sur les bases de données ibmclouddb et ne peut être utilisé que par l'utilisateur admin pour des raisons de sécurité. -
Exécutez la commande suivante pour accorder des privilèges à
pg_cron.select public.grant_pgcron_privileges();
Planification de travaux
Utilisez cron.schedule_in_database() pour planifier vos travaux.
SELECT cron.schedule_in_database(
job_name text,
schedule text, -- cron expression
command text, -- SQL command to run
database_name text -- target database
);
- Pour afficher les travaux de planification :
select * from cron.job;
- Pour afficher l'état des travaux de planification :
select * from cron.job_run_details;
- Pour annuler la programmation des travaux :
ibmclouddb=> SELECT cron.unschedule(jobid);
unschedule
------------
t
(1 row)
Exemple d'utilisation pg_cron
- Connectez-vous à la base de données ibmclouddb :
\c ibmclouddb
- Activer l'extension
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)
- Accorder des privilèges à
pg_cron:
ibmclouddb=> select public.grant_pgcron_privileges();
grant_pgcron_privileges
--------------------------------
Granted permission on pg_cron
(1 row)
- Programmation d'une tâche VACUUM à exécuter tous les dimanches à 4h00 du matin.
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)
- Pour afficher les travaux programmés :
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)
- Pour afficher les détails de l'exécution du travail :
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
- Pour annuler la programmation des travaux :
ibmclouddb=> SELECT cron.unschedule(35);
unschedule
------------
t
(1 row)
- Les enregistrements dans
cron.job_run_detailsne sont pas nettoyés automatiquement, mais chaque utilisateur qui peut programmer des tâches cron a également la permission de supprimer ses propres enregistrements 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_cronsont interrompus lorsque la base de données redémarre à la suite d'activités telles que la mise à l'échelle, le basculement ou la commutation. Comme il n'y a pas de mécanisme de relance, le travail ne reprendra pas automatiquement. Vous devez soit attendre la prochaine exécution programmée, soit ajuster la programmation en fonction des besoins. -
Jusqu'à 5 tâches pg_cron peuvent être exécutées simultanément; les tâches supplémentaires sont placées dans une file d'attente.