web-dev-qa-db-fra.com

Comment exécuter des tâches récurrentes sur Postgresql sans outil de type cron externe?

Je souhaite appeler régulièrement une procédure stockée. Sur Oracle, je créerais un travail pour cela. J'ai trouvé que Postgresql peut bien imiter cela en utilisant un outil externe (cron, etc.) et PgAgent.

Connaissez-vous une alternative "interne" qui n'impliquerait pas l'outil externe?

  • Je veux éviter les problèmes de sécurité avec le mot de passe stocké sur la ligne de commande de pgAgent.
  • Je souhaite éviter toute configuration système supplémentaire pour masquer le mot de passe (~/.pgpass).

Postgresql 8.
Linux RedHat 64bit

43
Stephan

Même si vous utilisiez PostgreSQL 10 (ou au moment de la rédaction) PostgreSQL 10 ou PostgreSQL 9.6, qui n'est pas une ancienne version comme 8.3, il n'y a toujours pas de planificateur de tâches intégré.

Quelque chose comme PgAgent ou des tâches cron externes est requis, il n'y a pas de solution de contournement pratique.

Il est à espérer que la fonctionnalité de travail en arrière-plan introduite dans 9.3 devrait permettre à un outil comme PgAgent d'être déplacé dans le noyau PostgreSQL dans une version ultérieure, mais cela n'a pas encore été fait. Même sur 9.3, vous devez toujours exécuter cron ou pgagent.

Quelques personnes travaillent sur des planificateurs basés sur des travailleurs en arrière-plan, et il y a quelques correctifs à venir qui devraient fournir des installations pour aider à cela. Mais à partir de PostgreSQL 10, il n'y a toujours pas de planificateur de bonne qualité, largement adopté, et la plupart des gens utilisent le planificateur de tâches cron/ms/etc.

Veuillez également consulter la politique de version ; vous exécutez une version obsolète et non prise en charge.

31
Craig Ringer

Depuis PostgreSQL 9.5, vous pouvez utiliser l'extension pg_cron , qui est chargée en tant que bibliothèque partagée dans PostgreSQL.

Après l'avoir configuré, la création d'un travail est assez simple:

SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);

Cela exécutera la commande de suppression conformément à la planification cron spécifiée. Vous pouvez aussi utiliser @reboot pour planifier un travail au redémarrage du serveur, et pg_cron démarrera automatiquement l'exécution des travaux si vous promouvez une redondance d'UC.

Au lieu d'utiliser .pgpass, vous pouvez fournir un accès localhost à l'utilisateur cron dans pg_hba.conf.

22
Marco Slot