Come eseguire attività ricorrenti su Postgresql senza uno strumento esterno simile a cron?


41

Vorrei chiamare una procedura memorizzata su base regolare. Su Oracle, creerei un lavoro per questo. Ho scoperto che Postgresql può imitare bene questo utilizzando uno strumento esterno (cron etc) e PgAgent.

Conosci un'alternativa "interna" che non coinvolgerebbe lo strumento esterno?

  • Voglio evitare problemi di sicurezza con la password memorizzata nella riga di comando di pgAgent.
  • Voglio evitare qualsiasi configurazione di sistema aggiuntiva per nascondere la password ( ~/.pgpass).

Postgresql 8.3
Linux RedHat 64 bit


Puoi aggiungere perché non puoi usare pgAgent o crontab? in particolare quali funzioni mancano ..
WrinkleFree

@Rohan Ho aggiornato la mia domanda
Stephan,

Il post sembra essere stato copiato e incollato su stackoverflow.com/q/16958625/398670
Craig Ringer

Risposte:


30

Anche se stavi eseguendo PostgreSQL 10 o la PostgreSQL 9.6 che sarà presto rilasciata (al momento della stesura) non è una versione antica come la 8.3, non esiste ancora un programmatore di attività integrato.

È richiesto qualcosa come PgAgent o cron job esterni, non c'è soluzione alternativa conveniente.

Si spera che la funzionalità di background worker introdotta in 9.3 dovrebbe consentire a uno strumento come PgAgent di essere spostato nel core PostgreSQL in una versione successiva, ma non è stato ancora fatto. Anche su 9.3 devi ancora eseguire cron o pgagent.

Alcune persone stanno lavorando su pianificatori basati sul lavoratore in background e ci sono alcune patch in arrivo che dovrebbero fornire strutture per aiutarlo. Ma a partire da PostgreSQL 10 non c'è ancora una buona qualità, uno scheduler ampiamente adottato e la maggior parte delle persone usa lo scheduler cron / ms / ecc.

Dai un'occhiata anche alla politica della versione ; stai eseguendo una versione obsoleta e non supportata.


Please take a look at the version policy, l'aggiornamento di Postgresql non è un'opzione.
Stephan,

2
@Alex Dovrai aggiornare ad un certo punto, e diventerà solo più difficile. Quale rilascio di 8.3 punti, a proposito? Quante correzioni di bug significative manchi? O almeno l'8.3.23? Detto questo, come ho spiegato, la funzione che desideri non esiste nemmeno nella prossima versione 9.3, sebbene siano state aggiunte alcune delle basi per consentirne l'aggiunta.
Craig Ringer,

Parlerò con il mio capo :)
Stephan,

1
@Alex Buona idea :-). Con un aggiornamento minimo alla 8.3.23 urgentemente, quindi iniziare a lavorare sui piani di aggiornamento a una versione più recente. Essa non risolverà questo problema, ma è una molto buona idea per salvare il dolore futuro. Il numero di clienti che supporto che hanno problemi che non avrebbero mai avuto se fossero rimasti aggiornati è incredibile. Non rilasciamo nuove versioni solo per i calci ;-). Leggi le note di rilascio per ogni versione .0 per indicazioni su cose che potresti dover affrontare e leggi il manuale sull'aggiornamento. I tuoi unici punti di dolore probabili sono standard_conforming_stringse bytea_output.
Craig Ringer,

Craig, cosa ne pensi di pg_cron?
Mehmet,

21

A partire da PostgreSQL 9.5, è possibile utilizzare l' estensione pg_cron , che viene caricata come libreria condivisa in PostgreSQL.

Dopo averlo impostato, creare un lavoro è piuttosto semplice:

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

Questo eseguirà il comando di eliminazione in base alla pianificazione cron specificata. È inoltre possibile utilizzare @rebootper pianificare un lavoro al riavvio del server e pg_cron avvierà automaticamente l'esecuzione dei lavori se si promuove un hot standby.

Invece di usare .pgpass, puoi fornire l'accesso localhost per l'utente cron in pg_hba.conf.


-1

Davvero, davvero non vuoi farlo. Postgres non è un sistema operativo, è un server di database. Anche se il database supporta l'esecuzione di attività pianificate, non è davvero una buona idea abusare del database in questo modo.

Se la tua preoccupazione è che non vuoi impostare password e cose, è facile da risolvere. Configurare una connessione socket Unix locale utilizzando invece l' autenticazione trust o ident , eseguire cronjob come tale utente.

Nella sua configurazione out of the box, di solito postgres imposta l'utente di sistema postgresper eseguire il server db, e questo utente di sistema è solitamente già preconfigurato in modo che possa connettersi al server locale usando l'autenticazione di fiducia quando si connette tramite socket unix locale. È possibile eseguire il cronjob come utente di sistema Postgres, connettersi al socket locale e quindi cambiare ruolo se non si desidera che la procedura memorizzata venga eseguita con il privilegio di superutente.

Nella configurazione predefinita, puoi semplicemente fare questo:

$ sudo -u postgres crontab -e

Nell'editor, aggiungi alla voce crontab in questo modo:

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

e nel tuo file /path/to/run_stored_procedure.sh devi semplicemente usare psql per chiamare la procedura del tuo negozio

#!/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
"Non è davvero una buona idea abusare del database in questo modo" Perché pensi che sia un abuso? I diversi RDBMS tradizionali tendono ad avere approcci simili, e non penso che sia così terribile. Inoltre, se non si ha accesso al sistema operativo, con crontab non si ha alcuna mancanza.
dezso
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.