pg_cron est un planificateur de tâches basé sur cron intégré à AnalyticDB for PostgreSQL. Il exécute des commandes PostgreSQL selon une planification directement depuis la base de données, sans nécessiter de planificateur externe.
Utilisez pg_cron pour automatiser les tâches récurrentes de base de données :
Supprimez ou archivez les données expirées selon une planification définie
Exécutez
VACUUMouVACUUM FULLpendant les heures creusesAppelez périodiquement des fonctions stockées
Exécutez automatiquement des instructions SQL de maintenance
Notes d'utilisation
Toutes les tâches planifiées s'exécutent en heure GMT (Greenwich Mean Time), équivalente à l'UTC. Convertissez votre heure locale en heure GMT avant de définir une planification.
Toutes les tâches sont stockées dans la base de données par défaut postgres et doivent être interrogées depuis celle-ci, quelle que soit la base de données ciblée par la tâche.
Certaines fonctionnalités décrites dans cette rubrique nécessitent une version minimale de l'instance :
AnalyticDB for PostgreSQL V6.0 : v6.3.6.0 ou ultérieure
AnalyticDB for PostgreSQL V7.0 : v7.0.3.0 ou ultérieure
AnalyticDB for PostgreSQL en mode Serverless : v2.0.0.1 ou ultérieure. Pour utiliser toutes les fonctionnalités, mettez à jour la version mineure du moteur. Pour plus d'instructions, consultez Mettre à jour la version mineure du moteur.
Fonctionnement
Une tâche planifiée se compose de deux éléments :
Commande : L'instruction SQL ou la fonction à exécuter, telle que
VACUUM.Planification : Le moment d'exécution de la commande, exprimé selon la syntaxe cron standard.
La planification utilise cinq champs séparés par des espaces :
┌───────────── minute (0 - 59)
│ ┌────────────── hour (0 - 23)
│ │ ┌─────────────── day of month (1 - 31)
│ │ │ ┌──────────────── month (1 - 12)
│ │ │ │ ┌───────────────── day of week (0 - 6, 0 is Sunday)
│ │ │ │ │
* * * * *
Opérateurs de champ :
| Opérateur | Signification | Exemple |
|---|---|---|
* |
Toute valeur | * * * * * — chaque minute |
| Nombre | Correspondance exacte | 30 3 * * * — tous les jours à 3 h 30 |
, |
Plusieurs valeurs | 1,15 * * * * — aux minutes 1 et 15 |
- |
Plage | 1-5 — du lundi au vendredi |
/ |
Valeur de pas | 0/2 — toutes les 2 heures à partir de 0 |
Exemples de planifications courantes :
| Planification | Expression |
|---|---|
| Tous les samedis à 3 h 30 (GMT) | 30 3 * * 6 |
| À 1 h 45 (GMT) le 1er et le 30 de chaque mois | 45 1 1,30 * * |
| Chaque jour de la semaine (lundi–vendredi) à 3 h 00 (GMT) | 00 3 * * 1-5 |
| Toutes les deux heures de 8 h 00 à 20 h 00 (GMT) | 0 8-20/2 * * * |
Utilisez Crontab.guru pour créer et prévisualiser interactivement des expressions cron.
Installation ou désinstallation de l'extension
L'extension pg_cron est installée par défaut sur toutes les instances AnalyticDB for PostgreSQL. Aucune installation manuelle n'est requise.
Cette extension présente des dépendances noyau et ne peut pas être désinstallée.
Planification d'une tâche
Planification de base
SELECT cron.schedule('<schedule>', '<command>');
| Paramètre | Obligatoire | Description |
|---|---|---|
<schedule> |
Oui | Expression cron spécifiant le moment d'exécution de la tâche |
<command> |
Oui | Instruction SQL ou appel de fonction à exécuter |
Exemples :
-- Delete events older than 1 week every Saturday at 3:30 AM GMT
SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
-- Call the test() function daily at 10:00 AM GMT
SELECT cron.schedule('0 10 * * *', 'select test()');
-- Run a SQL statement every minute
SELECT cron.schedule('* * * * *', 'select 1');
-- Run VACUUM FULL on the 1st and 30th of each month, and every Saturday and Sunday, at 2:30 AM GMT
SELECT cron.schedule('30 2 1,30 * 6,0', 'VACUUM FULL');
Planification d'une tâche avec un nom
Attribuez un nom pour faciliter l'identification et la gestion des tâches ultérieurement.
SELECT cron.schedule('<job_name>', '<schedule>', '<command>');
| Paramètre | Obligatoire | Description |
|---|---|---|
<job_name> |
Oui | Un libellé pour la tâche |
<schedule> |
Oui | Expression cron |
<command> |
Oui | Instruction SQL ou appel de fonction |
Exemples :
SELECT cron.schedule('Delete Expired Data', '30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
SELECT cron.schedule('Select Per Minute', '* * * * *', 'select 1');
SELECT cron.schedule('Do Vacuum', '0 23 * * *', 'VACUUM FULL');
L'extension pg_cron autorise les noms de tâches en double. Si vous appelez cron.unschedule('<job_name>') et que plusieurs tâches partagent ce nom, seule la tâche ayant l'ID de tâche le plus petit est supprimée. Utilisez les ID de tâche pour éviter toute ambiguïté.
Planification d'une tâche sur une base de données spécifique
Dans les versions de pg_cron antérieures à la 1.4, les tâches ne pouvaient s'exécuter que dans la base de données où l'extension était installée. L'exécution de tâches dans d'autres bases de données nécessitait de manipuler directement la table cron.job, ce qui était peu pratique et peu sécurisé. À partir de la version 1.4 de pg_cron, vous pouvez spécifier directement une base de données cible et un compte dans cron.schedule().
SELECT cron.schedule('<job_name>', '<schedule>', '<command>', '<database>', '<username>', '<active>');
| Paramètre | Obligatoire | Par défaut | Description |
|---|---|---|---|
<job_name> |
Oui | — | Un libellé pour la tâche |
<schedule> |
Oui | — | Expression cron |
<command> |
Oui | — | Instruction SQL ou appel de fonction |
<database> |
Non | postgres |
La base de données dans laquelle la tâche s'exécute |
<username> |
Non | Compte actuel | Le compte de base de données qui exécute la tâche |
<active> |
Non | true |
Indique si la tâche est activée |
Exemples :
-- Run VACUUM FULL on the dw database daily at 11:00 PM GMT
SELECT cron.schedule('Do Vacuum', '0 23 * * *', 'VACUUM FULL', 'dw');
-- Run a SQL statement in the dw database every minute as gp1234
SELECT cron.schedule('Select Per Minute', '* * * * *', 'select 1', 'dw', 'gp1234');
-- Call test() in the dw database daily at 10:00 AM GMT as user1
SELECT cron.schedule('DO Function', '0 10 * * *', 'select test()', 'dw', 'user1', true);
Mise à jour d'une tâche planifiée
Utilisez cron.alter_job pour modifier une tâche existante.
SELECT cron.alter_job(<job_id>, '<schedule>', '<command>', '<database>', '<username>', '<active>');
| Paramètre | Obligatoire | Description |
|---|---|---|
<job_id> |
Oui | L'ID de tâche issu de la table cron.job |
<schedule> |
Non | Nouvelle expression cron. Transmettez null pour laisser inchangé. |
<command> |
Non | Nouvelle instruction SQL. Transmettez null pour laisser inchangé. |
<database> |
Non | Nouvelle base de données cible. Transmettez null pour laisser inchangé. |
<username> |
Non | Nouveau compte de base de données. Transmettez null pour laisser inchangé. |
<active> |
Non | true pour activer, false pour désactiver. Transmettez null pour laisser inchangé. |
Exemples :
-- Change the schedule for job 3 to daily at 11:00 AM GMT
SELECT cron.alter_job(3, '0 11 * * *');
-- Change the command for job 1 to VACUUM
SELECT cron.alter_job(1, null, 'VACUUM');
-- Change the database account for job 2 to gp1234
SELECT cron.alter_job(2, null, null, null, 'gp1234');
Suppression d'une tâche planifiée
Suppression par nom de tâche
SELECT cron.unschedule('<job_name>');
Si plusieurs tâches partagent le même nom, seule la tâche ayant l'ID de tâche le plus petit est supprimée. Utilisez la forme avec ID de tâche pour plus de précision.
Exemple :
SELECT cron.unschedule('Do Vacuum');
Suppression par ID de tâche
SELECT cron.unschedule(<job_id>);
Exemple :
SELECT cron.unschedule(21);
Recherchez l'ID de tâche dans la table cron.job.
Consultation des tâches planifiées
Listez toutes les tâches planifiées :
SELECT * FROM cron.job;
Consultation de l'historique d'exécution des tâches
La table cron.job_run_details enregistre les détails de chaque exécution de tâche.
-- View all failed jobs
SELECT * FROM cron.job_run_details WHERE status = 'failed';
-- View execution history for job 1
SELECT * FROM cron.job_run_details WHERE jobid = '1';
Avec un grand nombre de tâches planifiées, la table cron.job_run_details peut devenir volumineuse au fil du temps. Planifiez une tâche de nettoyage périodique pour maintenir la taille de la table sous contrôle. Pour désactiver complètement la journalisation des exécutions, ouvrez un ticket pour demander au support technique de définir cron.log_run sur false.
Étapes suivantes
Dépôt pg_cron sur GitHub — documentation amont et notes de version
Tâches planifiées (pg_cron) pour RDS for PostgreSQL — si votre instance est une instance RDS for PostgreSQL