¿Cómo ejecutar tareas recurrentes en Postgresql sin una herramienta externa similar a cron?


41

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


¿Puedes agregar por qué no puedes usar pgAgent o crontab? específicamente qué características faltan ..
WrinkleFree

@Rohan He actualizado mi pregunta
Stephan

La publicación parece haber sido copiada y pegada en stackoverflow.com/q/16958625/398670
Craig Ringer

Respuestas:


30

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.


Please take a look at the version policy, actualizar Postgresql no es una opción.
Stephan

2
@Alex Tendrás que actualizar en algún momento, y solo será más difícil. ¿Qué lanzamiento de 8.3 puntos, por cierto? ¿Cuántas correcciones de errores importantes te faltan? ¿O al menos estás en 8.3.23? Dicho esto, como le expliqué, la característica que desea no existe incluso en la próxima versión 9.3, aunque se han agregado algunas de las bases para permitir su incorporación.
Craig Ringer

Hablaré con mi jefe :)
Stephan

1
@Alex Buena idea :-). Con una actualización mínima a 8.3.23 con urgencia, luego comience a trabajar en los planes de actualización a una versión más reciente. No resolverá esta pregunta, pero es una muy buena idea para salvar el dolor futuro. La cantidad de clientes que apoyo que tienen problemas que nunca hubieran tenido si se hubieran mantenido al día es increíble. No lanzamos nuevas versiones solo por diversión ;-). Lea las notas de la versión para cada versión .0 para obtener orientación sobre las cosas con las que podría tener que lidiar, y lea el manual sobre la actualización. Sus únicos puntos de dolor probables son standard_conforming_stringsy bytea_output.
Craig Ringer

Craig, ¿qué opinas sobre pg_cron?
mehmet

21

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:

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

Esto ejecutará el comando eliminar de acuerdo con el cronograma especificado. También puede usarlo @rebootpara 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.


-1

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 postgrespara 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:

$ sudo -u postgres crontab -e

En el editor, agregue a la entrada crontab así:

0    0    *     *    * bash /path/to/run_stored_procedure.sh

y en su /path/to/run_stored_procedure.sh simplemente use psql para llamar al procedimiento de sus tiendas

#!/usr/bin/env bash
psql my_db_name <<END
    SET ROLE limited_user;
    SELECT my_stored_proc();
    SELECT 1 FROM my_stored_proc();
END

1
"No es realmente una buena idea abusar de la base de datos así" ¿Por qué crees que es abuso? Los diferentes RDBMS principales tienden a tener enfoques similares, y no creo que sea tan terrible. Además, si no tiene acceso al sistema operativo, crontab le falta.
dezso
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.