Tous les produits
Search
Centre de documentation

AnalyticDB:pg_cron

Dernière mise à jour :Sep 15, 2026

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 VACUUM ou VACUUM FULL pendant les heures creuses

  • Appelez périodiquement des fonctions stockées

  • Exécutez automatiquement des instructions SQL de maintenance

Notes d'utilisation

Important

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.

Important

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.

Important

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');
Important

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>');
Important

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';
Remarque

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