Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Planification de la maintenance avec l'extension PostgreSQL pg_cron
Vous pouvez utiliser l'extension pg_cron
PostgreSQL pour planifier des commandes de maintenance dans une base de données PostgreSQL. Pour plus d'informations concernant l'extension, consultez la section What is pg_cron?
L'extension pg_cron
est prise en charge sur RDS for PostgreSQL versions 12.5 et ultérieures du moteur.
Pour en savoir plus sur l'utilisation de pg_cron
, consultez la section Schedule jobs with pg_cron on your RDS for PostgreSQL or your Aurora PostgreSQL-Compatible Edition databases
Rubriques
Configuration de l'extension pg_cron
Configurez l'extension pg_cron
comme suit :
-
Modifiez le groupe de paramètres personnalisé employé avec votre instance de base de données PostgreSQL en ajoutant
pg_cron
à la valeur du paramètreshared_preload_libraries
.Si votre instance de base de données RDS for PostgreSQL utilise le paramètre
rds.allowed_extensions
pour lister explicitement les extensions qui peuvent être installées, vous devez ajouter l'extensionpg_cron
à la liste. Seules certaines versions de RDS for PostgreSQL prennent en charge le paramètrerds.allowed_extensions
. Par défaut, toutes les extensions disponibles sont autorisées. Pour de plus amples informations, veuillez consulter Restreindre l'installation des extensions Postgre SQL.
Redémarrez l'instance de la base de données PostgreSQL pour que les modifications du groupe de paramètres prennent effet. Pour en savoir plus sur l'utilisation des groupes de paramètres, consultez Modification des paramètres d'un groupe de paramètres de base de données dans Amazon RDS.
-
Après le redémarrage de l'instance de base de données PostgreSQL, exécutez la commande suivante à l'aide d'un compte disposant d'autorisations
rds_superuser
. Par exemple, si vous avez utilisé les paramètres par défaut lors de la création de votre instance de base de données RDS for PostgreSQL, connectez-vous en tant qu'utilisateurpostgres
et créez l'extension.CREATE EXTENSION pg_cron;
Le planificateur
pg_cron
est défini dans la base de données PostgreSQL par défaut nomméepostgres
. Les objetspg_cron
sont créés dans cette base de donnéespostgres
et toutes les actions de planification s'y exécutent. -
Vous pouvez utiliser les paramètres par défaut ou planifier des tâches à exécuter dans d'autres bases de données de votre instance de base de données PostgreSQL. Pour planifier des tâches dans d'autres bases de données de votre instance de base de données PostgreSQL, veuillez consulter l'exemple disponible dans Planification d'une tâche cron pour une base de données autre que la base de données par défaut.
Octroi d'autorisations utilisateurs de la base de données pour l'utilisation de pg_cron
L'installation de l'extension pg_cron
requiert les privilèges rds_superuser
. Toutefois, les autorisations d'utiliser le pg_cron
peuvent être accordées (par un membre du groupe/rôle rds_superuser
) à d'autres utilisateurs de la base de données, afin qu'ils puissent planifier leurs propres tâches. Nous vous recommandons de n'accorder des autorisations au schéma cron
qu'en cas de besoin, si cela améliore les opérations dans votre environnement de production.
Pour accorder à un utilisateur de base de données des autorisations dans le schéma cron
, exécutez la commande suivante :
postgres=>
GRANT USAGE ON SCHEMA cron TOdb-user
;
Cela donne au db-user
l'autorisation d'accéder au schéma cron
pour planifier des tâches cron pour les objets auxquels il a des autorisations d'accès. Si l'utilisateur de la base de données ne dispose pas des autorisations nécessaires, la tâche échoue après avoir validé le message d'erreur dans le fichier postgresql.log
, comme indiqué ci-dessous :
2020-12-08 16:41:00 UTC::@:[30647]:ERROR: permission denied for table table-name
2020-12-08 16:41:00 UTC::@:[27071]:LOG: background worker "pg_cron" (PID 30647) exited with exit code 1
En d'autres termes, assurez-vous que les utilisateurs de base de données dotés d'autorisations sur le cron
schéma disposent également d'autorisations sur les objets (tables, schémas, etc.) qu'ils prévoient de planifier.
Les détails de la tâche cron et de son succès ou de son échec sont également enregistrés dans le cron.job_run_details
tableau. Pour de plus amples informations, veuillez consulter Tableaux pour planifier les tâches et capturer leur statut .
Planification des tâches pg_cron
Les sections suivantes montrent comment vous pouvez planifier diverses tâches de gestion à l'aide de tâches pg_cron
.
Note
Lorsque vous créez des tâches pg_cron
, vérifiez que le paramètre max_worker_processes
est supérieur au nombre de cron.max_running_jobs
. Une tâche pg_cron
échoue si elle manque de processus de travail en arrière-plan. Le nombre de tâches pg_cron
par défaut est de 5
. Pour de plus amples informations, veuillez consulter Paramètres de gestion de l'extension pg_cron.
Rubriques
Vidage d'une table
Autovacuum gère la maintenance dans la plupart des cas. Toutefois, vous pouvez vider une table spécifique quand bon vous semble.
Voir aussi, Utilisation de l'SQLaspirateur automatique Postgre sur Amazon RDS pour Postgre SQL.
L'exemple suivant montre comment utiliser la fonction cron.schedule
pour configurer une tâche de manière à ce qu'elle utilise VACUUM FREEZE
sur une table spécifique tous les jours à 22:00 (GMT).
SELECT cron.schedule('manual vacuum', '0 22 * * *', 'VACUUM FREEZE pgbench_accounts');
schedule ---------- 1 (1 row)
Une fois l'exemple précédent exécuté, vous pouvez vérifier l'historique dans la table cron.job_run_details
comme suit.
postgres=>
SELECT * FROM cron.job_run_details;
jobid | runid | job_pid | database | username | command | status | return_message | start_time | end_time -------+-------+---------+----------+----------+--------------------------------+-----------+----------------+-------------------------------+------------------------------- 1 | 1 | 3395 | postgres | adminuser| vacuum freeze pgbench_accounts | succeeded | VACUUM | 2020-12-04 21:10:00.050386+00 | 2020-12-04 21:10:00.072028+00 (1 row)
Vous trouverez ci-dessous une requête de la cron.job_run_details
table pour voir les tâches ayant échoué.
postgres=>
SELECT * FROM cron.job_run_details WHERE status = 'failed';
jobid | runid | job_pid | database | username | command | status | return_message | start_time | end_time ------+-------+---------+----------+----------+-------------------------------+--------+--------------------------------------------------+-------------------------------+------------------------------ 5 | 4 | 30339 | postgres | adminuser| vacuum freeze pgbench_account | failed | ERROR: relation "pgbench_account" does not exist | 2020-12-04 21:48:00.015145+00 | 2020-12-04 21:48:00.029567+00 (1 row)
Pour de plus amples informations, veuillez consulter Tableaux pour planifier les tâches et capturer leur statut .
Purge de la table Historique pg_cron
La table cron.job_run_details
contient un historique des tâches cron et celui-ci peut considérablement s'étoffer au fil du temps. Nous vous recommandons de planifier une tâche afin de purger cette table. Par exemple, conserver les entrées d'une semaine peut s'avérer suffisant à des fins de dépannage.
L'exemple suivant utilise la fonction cron.schedule pour planifier une tâche qui s'exécute tous les jours à minuit afin de purger la table cron.job_run_details
. Cette tâche ne conserve que les entrées des sept derniers jours. Utilisez votre compte rds_superuser
pour planifier la tâche comme suit :
SELECT cron.schedule('0 0 * * *', $$DELETE FROM cron.job_run_details WHERE end_time < now() - interval '7 days'$$);
Pour de plus amples informations, veuillez consulter Tableaux pour planifier les tâches et capturer leur statut .
Journalisation des erreurs dans le fichier postgresql.log uniquement
Pour empêcher les écritures dans la table cron.job_run_details
, modifiez le groupe de paramètres associé à l'instance de base de données PostgreSQL et désactivez le paramètre cron.log_run
. L'extension pg_cron
n'écrit plus dans la table et consigne uniquement des erreurs dans le fichier postgresql.log
. Pour de plus amples informations, veuillez consulter Modification des paramètres d'un groupe de paramètres de base de données dans Amazon RDS.
Utilisez la commande suivante pour vérifier la valeur du paramètre cron.log_run
.
postgres=>
SHOW cron.log_run;
Pour de plus amples informations, veuillez consulter Paramètres de gestion de l'extension pg_cron.
Planification d'une tâche cron pour une base de données autre que la base de données par défaut
Toutes les métadonnées de pg_cron
sont conservées dans la base de données par défaut PostgreSQL nommée postgres
. Des exécutants étant utilisés en arrière-plan pour exécuter les tâches de maintenance cron, vous pouvez planifier une tâche dans n'importe quelle base de données de l'instance de base de données PostgreSQL.
-
Dans la base de données cron, planifiez la tâche comme vous le faites normalement à l'aide de la fonction cron.schedule.
postgres=>
SELECT cron.schedule('database1 manual vacuum', '29 03 * * *', 'vacuum freeze test_table');
-
En tant qu'utilisateur ayant le rôle
rds_superuser
, mettez à jour la colonne de base de données correspondant à la tâche que vous venez de créer de manière à l'exécuter dans une autre base de données de votre instance de base de données PostgreSQL.postgres=>
UPDATE cron.job SET database = 'database1' WHERE jobid = 106;
-
Procédez à une vérification en interrogeant la table
cron.job
.postgres=>
SELECT * FROM cron.job;
jobid | schedule | command | nodename | nodeport | database | username | active | jobname ------+-------------+--------------------------------+-----------+----------+----------+-----------+--------+------------------------- 106 | 29 03 * * * | vacuum freeze test_table | localhost | 8192 | database1| adminuser | t | database1 manual vacuum 1 | 59 23 * * * | vacuum freeze pgbench_accounts | localhost | 8192 | postgres | adminuser | t | manual vacuum (2 rows)
Note
Dans certains cas, vous pouvez ajouter une tâche cron que vous avez l'intention d'exécuter sur une base de données différente. Dans de tels cas, le tâche peut essayer de s'exécuter dans la base de données par défaut (postgres
) avant la mise à jour de la colonne de base de données correcte. Si le nom d'utilisateur dispose d'autorisations, la tâche s'exécute correctement dans la base de données par défaut.
Référence pour l'extension pg_cron
Vous pouvez utiliser les paramètres, fonctions et tables suivants avec l'extension pg_cron
. Pour plus d'informations, consultez la section Qu'est-ce que pg_cron
Rubriques
Paramètres de gestion de l'extension pg_cron
La liste ci-dessous répertorie les paramètres permettant de contrôler le comportement de l'extension pg_cron
.
Paramètre | Description |
---|---|
cron.database_name |
Base de données dans laquelle les métadonnées |
cron.host |
Nom d'hôte permettant de se connecter à PostgreSQL. Vous ne pouvez pas modifier cette valeur. |
cron.log_run |
Enregistrez chaque tâche qui s'exécute dans la table |
cron.log_statement |
Enregistre toutes les instructions cron avant leur exécution. Les valeurs sont |
cron.max_running_jobs |
Nombre maximal de tâches pouvant être exécutées simultanément. |
cron.use_background_workers |
Utilisez des exécutants en arrière-plan plutôt que des sessions client. Vous ne pouvez pas modifier cette valeur. |
Utilisez la commande SQL suivante pour afficher ces paramètres et leurs valeurs.
postgres=>
SELECT name, setting, short_desc FROM pg_settings WHERE name LIKE 'cron.%' ORDER BY name;
Référence de fonction : cron.schedule
Cette fonction planifie une tâche cron. Cette tâche est initialement planifiée dans la base de données postgres
par défaut. La fonction renvoie une valeur bigint
correspondant à l'identifiant de la tâche. Pour planifier l'exécution de tâches dans d'autres bases de données de votre instance de base de données PostgreSQL, consultez l'exemple disponible dans Planification d'une tâche cron pour une base de données autre que la base de données par défaut.
La fonction présente deux formats de syntaxe.
- Syntaxe
-
cron.schedule (job_name, schedule, command ); cron.schedule (schedule, command );
- Paramètres
-
Paramètre Description job_name
Nom de la tâche cron.
schedule
Texte indiquant la planification de la tâche cron. Le format correspond au format cron standard.
command
Texte de la commande à exécuter. - Exemples
-
postgres=>
SELECT cron.schedule ('test','0 10 * * *', 'VACUUM pgbench_history');
schedule ---------- 145 (1 row)
postgres=>
SELECT cron.schedule ('0 15 * * *', 'VACUUM pgbench_accounts');schedule ---------- 146 (1 row)
Référence de fonction : cron.unschedule
Cette fonction supprime une tâche cron. Vous pouvez spécifier soit le job_name
ou le job_id
. Une politique assure que vous soyez le propriétaire pouvant supprimer la planification de la tâche. La fonction renvoie une valeur booléenne indiquant la réussite ou l'échec.
La fonction a les formats de syntaxe suivants.
- Syntaxe
-
cron.unschedule (job_id); cron.unschedule (job_name);
- Paramètres
-
Paramètre Description job_id
Identifiant de tâche renvoyé par la fonction
cron.schedule
lors de la planification de la tâche cron.job_name
Nom d'une tâche cron planifiée avec la fonction
cron.schedule
. - Exemples
-
postgres=>
SELECT cron.unschedule(108);unschedule ------------ t (1 row)
postgres=>
SELECT cron.unschedule('test');
unschedule ------------ t (1 row)
Tableaux pour planifier les tâches et capturer leur statut
Les tables suivantes sont utilisées pour planifier les tâches cron et enregistrer la façon dont elles ont été accomplies.
Tableau | Description |
---|---|
cron.job |
Contient les métadonnées relatives à chaque tâche planifiée. La plupart des interactions avec cette table doivent être effectuées à l'aide des fonctions ImportantNous vous recommandons de ne pas accorder de privilèges de mise à jour ou d'insertion directement à cette table. Ce faisant, l'utilisateur pourrait mettre à jour la colonne |
cron.job_run_details |
Contient des informations historiques sur l'exécution de tâches planifiées antérieures. Ces informations sont utiles pour examiner l'état, les messages renvoyés et les heures de début et de fin d'exécution de la tâche. NotePour éviter que cette table évolue indéfiniment, purgez-la de manière régulière. Pour obtenir un exemple, veuillez consulter Purge de la table Historique pg_cron. |