Je voudrais appeler une procédure stockée sur une base régulière. Sur Oracle, je créerais un travail pour cela. J'ai trouvé que Postgresql pouvait 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 souhaite éviter les problèmes de sécurité liés au mot de passe stocké sur la ligne de commande de pgAgent.
- Je veux éviter toute configuration système supplémentaire pour cacher le mot de passe (
~/.pgpass
).
Postgresql 8.3
Linux RedHat 64bit
postgresql
jobs
scheduled-tasks
Stephan
la source
la source
Réponses:
Même si vous utilisiez PostgreSQL 10 ou PostgreSQL 9.6 (qui étaient en train d’être publiés), il n’existait pas encore de planificateur de tâches intégré.
Quelque chose comme PgAgent ou des tâches externes cron est requis, il n’existe pas de solution de rechange pratique.
La fonctionnalité travailleurs d'arrière-plan introduite dans la version 9.3 devrait permettre, espérons-le, de transférer un outil tel que PgAgent dans le noyau de PostgreSQL dans une version ultérieure, mais cela n'a pas encore été fait. Même sur la version 9.3, vous devez toujours exécuter cron ou pgagent.
Quelques personnes travaillent sur des ordonnanceurs basés sur des travailleurs d'arrière-plan, et certains correctifs à venir devraient fournir des installations pour vous aider. Mais depuis PostgreSQL 10, il n’existe toujours pas de planificateur de bonne qualité, largement adopté, et la plupart des gens utilisent le planificateur de tâches cron / ms / etc.
S'il vous plaît jeter un oeil à la politique de version , aussi; vous utilisez une version obsolète et non prise en charge.
la source
Please take a look at the version policy
, mettre à niveau Postgresql n’est pas une option.standard_conforming_strings
etbytea_output
.A partir de PostgreSQL 9.5, vous pouvez utiliser l' extension pg_cron , chargée en tant que bibliothèque partagée dans PostgreSQL.
Après l’avoir configuré, créer un travail est assez simple:
Cela exécutera la commande delete en fonction de la planification cron spécifiée. Vous pouvez également utiliser
@reboot
pour planifier un travail lorsque le serveur redémarre, et pg_cron commencera automatiquement à exécuter les travaux si vous promouvez une mise en veille automatique.Au lieu d'utiliser .pgpass, vous pouvez fournir un accès localhost à l'utilisateur cron dans pg_hba.conf.
la source
Vous ne voulez vraiment pas vraiment faire ça. Postgres n'est pas un système d'exploitation, c'est un serveur de base de données. Même si la base de données prend en charge l'exécution de tâches planifiées, ce n'est pas vraiment une bonne idée d'abuser de la base de données.
Si votre préoccupation est que vous ne voulez pas configurer de mot de passe et de contenu, c'est facile à résoudre. Configurez une connexion de socket Unix locale en utilisant plutôt une authentification trust ou ident , exécutez votre travail cron en tant qu'utilisateur.
Dans sa configuration prête
postgres
à l'emploi , postgres configure généralement l'utilisateur système pour qu'il exécute le serveur de base de données. Cet utilisateur système est généralement déjà préconfiguré afin de pouvoir se connecter au serveur local à l'aide d'une authentification sécurisée lors d'une connexion via un socket Unix local. Vous pouvez exécuter votre cronjob en tant qu'utilisateur système postgres, vous connecter au socket local, puis changer de rôle si vous ne souhaitez pas que votre procédure stockée s'exécute avec le privilège de superutilisateur.Dans la configuration par défaut, vous pouvez simplement faire ceci:
Dans l'éditeur, ajoutez à l'entrée de la crontab comme suit:
et dans votre fichier /path/to/run_stored_procedure.sh, il vous suffit d'utiliser psql pour appeler la procédure de votre magasin.
la source