PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Una panoramica degli strumenti di pianificazione dei lavori per PostgreSQL

A differenza di altri sistemi di gestione di database che hanno il proprio scheduler integrato (come Oracle, MSSQL o MySQL), PostgreSQL non ha ancora questo tipo di funzionalità.

Per fornire funzionalità di pianificazione in PostgreSQL dovrai utilizzare uno strumento esterno come...

  • Cronaca Linux
  • Agente pgAgent
  • Estensione pg_cron

In questo blog esploreremo questi strumenti e metteremo in evidenza come utilizzarli e le loro caratteristiche principali.

Cronaca Linux

È il più vecchio, tuttavia, un modo efficiente e utile per eseguire attività di pianificazione. Questo programma è basato su un demone (cron) che permette di eseguire attività in automatico in background periodicamente e verifica periodicamente i file di configurazione (detti file crontab) su cui sono definiti lo script/comando da eseguire e la sua programmazione.

Ogni utente può avere il proprio file crontab e per le ultime versioni di Ubuntu si trovano in: 

/var/spool/cron/crontabs (for other linux distributions the location could be different):

[email protected]:/var/spool/cron/crontabs# ls -ltr

total 12

-rw------- 1 dbmaster crontab 1128 Jan 12 12:18 dbmaster

-rw------- 1 slonik   crontab 1126 Jan 12 12:22 slonik

-rw------- 1 nines    crontab 1125 Jan 12 12:23 nines

La sintassi del file di configurazione è la seguente:

mm hh dd mm day <<command or script to execute>>



mm: Minute(0-59)

hh: Hour(0-23)

dd: Day(1-31)

mm: Month(1-12)

day: Day of the week(0-7 [7 or 0 == Sunday])

Alcuni operatori possono essere utilizzati con questa sintassi per semplificare la definizione della schedulazione e questi simboli consentono di specificare più valori in un campo:

Asterisco (*)  - indica tutti i valori possibili per un campo

La virgola (,) - usata per definire un elenco di valori

Trattino (-) - utilizzato per definire un intervallo di valori

Separatore (/) - specifica un valore di passaggio

Lo script all_db_backup.sh verrà eseguito in base a ciascuna espressione di pianificazione:

0 6 * * * /home/backup/all_db_backup.sh

Alle 6:00 tutti i giorni

20 22 * ​​* Lun, Mar, Mer, Gio, Ven /home/backup/all_db_backup.sh

Alle 22:20, tutti i giorni feriali

0 23 * * 1-5 /home/backup/all_db_backup.sh

Alle 23 durante la settimana

0 0/5 14 * * /home/backup/all_db_backup.sh

Ogni cinque ore a partire dalle 14:00. e termina alle 14:55, tutti i giorni

Anche se non è molto difficile, questa sintassi può essere generata automaticamente su più pagine web.

Se il file crontab non esiste per un utente può essere creato con il seguente comando:

[email protected]:~$ crontab -e

o presentato usando il parametro -l:

[email protected]:~$ crontab -l

Se necessario per rimuovere questo file, il parametro appropriato è -r:

[email protected]:~$ crontab -r

Lo stato del demone cron è mostrato dall'esecuzione del seguente comando:

Agente pgAgente

pgAgent è un agente di pianificazione dei lavori disponibile per PostgreSQL che consente l'esecuzione di procedure memorizzate, istruzioni SQL e script di shell. La sua configurazione è archiviata nel database postgres nel cluster.

Lo scopo è fare in modo che questo agente venga eseguito come demone su sistemi Linux e che periodicamente esegua una connessione al database per verificare se ci sono lavori da eseguire.

Questa pianificazione è facilmente gestibile da PgAdmin 4, ma non è installata di default una volta installato pgAdmin, è necessario scaricarlo e installarlo autonomamente.

Di seguito sono descritti tutti i passaggi necessari per il corretto funzionamento di pgAgent:

Fase uno

Installazione di pgAdmin 4

$ sudo apt install pgadmin4 pgadmin4-apache

Fase due

Creazione del linguaggio procedurale plpgsql se non definito

CREATE TRUSTED PROCEDURAL LANGUAGE ‘plpgsql’

     HANDLER plpgsql_call_handler

          HANDLER plpgsql_validator;

Fase tre

Installazione di pgAgent

$ sudo apt-get install pgagent

Fase quattro

Creazione dell'estensione pgagent

CREATE EXTENSION pageant 

Questa estensione creerà tutte le tabelle e le funzioni per l'operazione pgAgent e di seguito viene mostrato il modello dati utilizzato da questa estensione:

Ora l'interfaccia pgAdmin ha già l'opzione "pgAgent Jobs" per gestire il pgAgent: 

Per definire un nuovo lavoro è sufficiente selezionare "Crea" utilizzando il tasto destro su "pgAgent Jobs", inserirà una designazione per questo lavoro e definirà i passaggi per eseguirlo:

Nella scheda "Programmi" deve essere definita la pianificazione per questo nuovo lavoro :

Infine, per far funzionare l'agente in background è necessario avviare il seguente processo manualmente:

/usr/bin/pgagent host=localhost dbname=postgres user=postgres port=5432 -l 1

Tuttavia, l'opzione migliore per questo agente è creare un demone con il comando precedente.

Estensione pg_cron

Il pg_cron è un job scheduler basato su cron per PostgreSQL che viene eseguito all'interno del database come estensione (simile al DBMS_SCHEDULER in Oracle) e consente l'esecuzione di attività del database direttamente dal database, a causa di un lavoratore in background.

Le attività da eseguire possono essere una delle seguenti:

  • procedure archiviate
  • Istruzioni SQL
  • Comandi PostgreSQL (come VACUUM o VACUUM ANALYZE)

pg_cron può eseguire più lavori in parallelo, ma può essere eseguita solo un'istanza di un programma alla volta.

Se una seconda corsa deve essere avviata prima del termine della prima, viene messa in coda e verrà avviata non appena la prima corsa sarà completata.

Questa estensione è stata definita per la versione 9.5 o successiva di PostgreSQL.

Installazione di pg_cron

L'installazione di questa estensione richiede solo il seguente comando:

[email protected]:~$ sudo apt-get -y install postgresql-10-cron

Aggiornamento dei file di configurazione

Per avviare pg_cron background worker una volta avviato il server PostgreSQL, è necessario impostare pg_cron sul parametro shared_preload_libraries in postgresql.conf: 

shared_preload_libraries = ‘pg_cron’

E' inoltre necessario definire in questo file, il database su cui verrà creata l'estensione pg_cron, aggiungendo il seguente parametro:

cron.database_name= ‘postgres’

D'altra parte, nel file pg_hba.conf che gestisce l'autenticazione, è necessario definire il login postgres come trust per le connessioni IPV4, perché pg_cron richiede che tale utente sia in grado di connettersi al database senza fornire alcuna password, quindi è necessario aggiungere la seguente riga a questo file:

host postgres postgres 192.168.100.53/32 trust

Il metodo di autenticazione trust consente a chiunque di connettersi ai database specificati nel file pg_hba.conf, in questo caso il database postgres. È un metodo utilizzato spesso per consentire la connessione tramite socket di dominio Unix su un computer di un singolo utente per accedere al database e dovrebbe essere utilizzato solo quando esiste un'adeguata protezione a livello di sistema operativo sulle connessioni al server.

Entrambe le modifiche richiedono il riavvio del servizio PostgreSQL:

[email protected]:~$ sudo system restart postgresql.service

È importante tenere presente che pg_cron non esegue alcun lavoro finché il server è in modalità hot standby, ma si avvia automaticamente quando il server viene promosso.

Creazione dell'estensione pg_cron

Questa estensione creerà i metadati e le procedure per gestirli, quindi su psql dovrebbe essere eseguito il seguente comando:

postgres=#CREATE EXTENSION pg_cron;

CREATE EXTENSION

Ora, gli oggetti necessari per pianificare i lavori sono già definiti nello schema cron :

Questa estensione è molto semplice, basta solo la tabella dei lavori per gestire tutto questa funzionalità:

Definizione di nuovi lavori

La sintassi di scheduling per definire i lavori su pg_cron è la stessa usata sullo strumento cron, e la definizione di nuovi lavori è molto semplice, basta chiamare la funzione cron.schedule:

select cron.schedule('*/5 * * * *','CALL reporting.p_compute_client_data(12356,''DAILY_DATA'');')

select cron.schedule('*/5 * * * *','CALL reporting.p_compute_client_data(998934,''WEEKLY_DATA'');')

select cron.schedule('*/5 * * * *','CALL reporting.p_compute_client_data(45678,''DAILY_DATA'');')

select cron.schedule('*/5 * * * *','CALL reporting.p_compute_client_data(1010,''WEEKLY_DATA'');')

select cron.schedule('*/5 * * * *','CALL reporting.p_compute_client_data(1001,''MONTHLY_DATA'');')

select cron.schedule('*/5 * * * *','select reporting.f_reset_client_data(0,''DATA'')')

select cron.schedule('*/5 * * * *','VACUUM')

select cron.schedule('*/5 * * * *','$$DELETE FROM reporting.rep_request WHERE create_dt<now()- interval '60 DAYS'$$)

L'impostazione del lavoro è memorizzata nella tabella dei lavori: 

Un altro modo per definire un lavoro è inserire i dati direttamente nel cron .tabella lavori:

INSERT INTO cron.job (schedule, command, nodename, nodeport, database, username)

VALUES ('0 11 * * *','call loader.load_data();','postgresql-pgcron',5442,'staging', 'loader');

e usa valori personalizzati per nodename e nodeport per connetterti a una macchina diversa (così come ad altri database).

Disattivazione di un lavoro

Per disattivare un lavoro, invece, è sufficiente eseguire la seguente funzione:

select cron.schedule(8)

Registrazione lavori

La registrazione di questi lavori può essere trovata nel file di registro di PostgreSQL /var/log/postgresql/postgresql-12-main.log: