Me gustaría llamar a un procedimiento almacenado de forma regular. En Oracle, crearía un trabajo para esto. He descubierto que Postgresql puede imitar esto bien usando una herramienta externa (cron, etc.) y PgAgent.
¿Conoces una alternativa "interna" que no implique la herramienta externa?
- Quiero evitar problemas de seguridad con la contraseña almacenada en la línea de comando del pgAgent.
- Quiero evitar cualquier configuración adicional del sistema para ocultar la contraseña (
~/.pgpass
).
Postgresql 8.3
Linux RedHat 64bit
postgresql
jobs
scheduled-tasks
Stephan
fuente
fuente
Respuestas:
Incluso si estaba ejecutando el PostgreSQL 10 que se lanzará pronto (en el momento de la escritura) o el PostgreSQL 9.6 actual, no una versión antigua como la 8.3, todavía no hay un programador de tareas incorporado.
Se requiere algo como PgAgent o trabajos cron externos, no hay una solución conveniente.
La función de trabajadores en segundo plano introducida en 9.3 debería permitir que una herramienta como PgAgent se traslade al núcleo de PostgreSQL en una versión posterior, pero aún no se ha hecho. Incluso en 9.3 todavía tienes que ejecutar cron o pgagent.
Algunas personas están trabajando en planificadores basados en trabajadores en segundo plano, y están llegando algunos parches que deberían proporcionar instalaciones para ayudar con eso. Pero a partir de PostgreSQL 10 todavía no hay una buena calidad, un planificador ampliamente adoptado, y la mayoría de la gente usa cron / ms task Scheduler / etc.
Por favor, eche un vistazo a la política de versiones también; está ejecutando una versión obsoleta y no compatible.
fuente
Please take a look at the version policy
, actualizar Postgresql no es una opción.standard_conforming_strings
ybytea_output
.A partir de PostgreSQL 9.5, puede usar la extensión pg_cron , que se carga como una biblioteca compartida en PostgreSQL.
Después de configurarlo, crear un trabajo es bastante simple:
Esto ejecutará el comando eliminar de acuerdo con el cronograma especificado. También puede usarlo
@reboot
para programar un trabajo cuando se reinicie el servidor, y pg_cron comenzará a ejecutar trabajos automáticamente si promueve un modo de espera activo.En lugar de usar .pgpass, puede proporcionar acceso localhost para el usuario cron en pg_hba.conf.
fuente
Realmente, realmente no quieres hacer esto. Postgres no es un sistema operativo, es un servidor de base de datos. Incluso si la base de datos admite la ejecución de tareas programadas, no es realmente una buena idea abusar de la base de datos de esa manera.
Si su preocupación es que no desea configurar la contraseña y otras cosas, eso es fácil de resolver. Configure una conexión de socket Unix local utilizando la autenticación de confianza o identidad , ejecute su trabajo cron como ese usuario.
En su configuración lista
postgres
para usar , generalmente postgres configura al usuario del sistema para ejecutar el servidor db, y este usuario del sistema generalmente ya está preconfigurado para que pueda conectarse al servidor local mediante autenticación de confianza cuando se conecta a través de un socket local de Unix. Puede ejecutar su cronjob como usuario del sistema postgres, conectarse al socket local y luego cambiar de función si no desea que su procedimiento almacenado se ejecute con privilegio de superusuario.En la configuración predeterminada, puede hacer esto:
En el editor, agregue a la entrada crontab así:
y en su /path/to/run_stored_procedure.sh simplemente use psql para llamar al procedimiento de sus tiendas
fuente