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.