sql >> Database >  >> RDS >> PostgreSQL

Een overzicht van tools voor taakplanning voor PostgreSQL

In tegenstelling tot andere databasebeheersystemen die hun eigen ingebouwde planner hebben (zoals Oracle, MSSQL of MySQL), heeft PostgreSQL dit soort functies nog steeds niet.

Om planningsfunctionaliteit in PostgreSQL te bieden, moet u een externe tool gebruiken zoals...

  • Linux crontab
  • Agent pgAgent
  • Extensie pg_cron

In deze blog zullen we deze tools verkennen en benadrukken hoe ze te bedienen en hun belangrijkste functies.

Linux crontab

Het is echter de oudste, een efficiënte en handige manier om planningstaken uit te voeren. Dit programma is gebaseerd op een daemon (cron) waarmee taken automatisch periodiek op de achtergrond kunnen worden uitgevoerd en verifieert regelmatig de configuratiebestanden (crontab-bestanden genaamd) waarop het uit te voeren script/de opdracht en de planning zijn gedefinieerd.

Elke gebruiker kan zijn eigen crontab-bestand hebben en voor de nieuwste Ubuntu-releases bevinden zich 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

De syntaxis van het configuratiebestand is als volgt:

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])

Met deze syntaxis kunnen enkele operators worden gebruikt om de planningsdefinitie te stroomlijnen en deze symbolen maken het mogelijk om meerdere waarden in een veld op te geven:

Asterisk (*)  - dit betekent alle mogelijke waarden voor een veld

De komma (,) - gebruikt om een ​​lijst met waarden te definiëren

Dash (-) - gebruikt om een ​​reeks waarden te definiëren

Scheidingsteken (/) - specificeert een stapwaarde

Het script all_db_backup.sh wordt uitgevoerd volgens elke planningsexpressie:

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

Elke dag om 6 uur

20 22 * ​​* ma, di, wo, do, vr /home/backup/all_db_backup.sh

Om 22:20, elke weekdag

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

Om 23.00 uur tijdens de week

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

Elke vijf uur vanaf 14:00 uur. en eindigend om 14.55 uur, elke dag

Hoewel het niet erg moeilijk is, kan deze syntaxis automatisch op meerdere webpagina's worden gegenereerd.

Als het crontab-bestand niet bestaat voor een gebruiker, kan het worden gemaakt met de volgende opdracht:

[email protected]:~$ crontab -e

of presenteerde het met de parameter -l:

[email protected]:~$ crontab -l

Indien nodig om dit bestand te verwijderen, is de juiste parameter -r:

[email protected]:~$ crontab -r

De cron daemon-status wordt weergegeven door het uitvoeren van het volgende commando:

Agent pgAgent

De pgAgent is een taakplanningsagent die beschikbaar is voor PostgreSQL en waarmee opgeslagen procedures, SQL-instructies en shellscripts kunnen worden uitgevoerd. De configuratie wordt opgeslagen in de postgres-database in het cluster.

Het doel is om deze agent als een daemon op Linux-systemen te laten draaien en periodiek een verbinding met de database tot stand te brengen om te controleren of er taken zijn om uit te voeren.

Deze planning kan eenvoudig worden beheerd door PgAdmin 4, maar wordt niet standaard geïnstalleerd zodra pgAdmin is geïnstalleerd, u moet deze zelf downloaden en installeren.

Hierna worden alle noodzakelijke stappen beschreven om de pgAgent correct te laten werken:

Stap één

Installatie van pgAdmin 4

$ sudo apt install pgadmin4 pgadmin4-apache

Stap twee

Creëren van plpgsql procedurele taal indien niet gedefinieerd

CREATE TRUSTED PROCEDURAL LANGUAGE ‘plpgsql’

     HANDLER plpgsql_call_handler

          HANDLER plpgsql_validator;

Stap drie

Installatie van pgAgent

$ sudo apt-get install pgagent

Stap vier

Aanmaken van de pgaagent-extensie

CREATE EXTENSION pageant 

Deze extensie maakt alle tabellen en functies voor de pgAgent-bewerking en hierna wordt het gegevensmodel getoond dat door deze extensie wordt gebruikt:

Nu heeft de pgAdmin-interface al de optie "pgAgent Jobs" om beheer de pgAgent: 

Om een ​​nieuwe taak te definiëren, hoeft u alleen maar "Maken" te selecteren met de rechterknop op "pgAgent Jobs", en het zal een aanduiding voor deze taak invoegen en de stappen definiëren om deze uit te voeren:

In het tabblad "Schedules" moet de planning voor deze nieuwe taak worden gedefinieerd :

Ten slotte, om de agent op de achtergrond te laten draaien, moet de volgende proces handmatig:

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

Desalniettemin is de beste optie voor deze agent om een ​​daemon te maken met het vorige commando.

Extensie pg_cron

De pg_cron is een cron-gebaseerde taakplanner voor PostgreSQL die als een extensie in de database draait (vergelijkbaar met de DBMS_SCHEDULER in Oracle) en de uitvoering van databasetaken rechtstreeks vanuit de database mogelijk maakt, vanwege een achtergrondmedewerker.

De uit te voeren taken kunnen een van de volgende zijn:

  • opgeslagen procedures
  • SQL-statements
  • PostgreSQL-opdrachten (als VACUUM of VACUUM ANALYZE)

pg_cron kan meerdere taken parallel uitvoeren, maar er kan slechts één instantie van een programma tegelijk worden uitgevoerd.

Als een tweede run moet worden gestart voordat de eerste is afgelopen, wordt deze in de wachtrij geplaatst en wordt gestart zodra de eerste run is voltooid.

Deze extensie is gedefinieerd voor versie 9.5 of hoger van PostgreSQL.

Installatie van pg_cron

De installatie van deze extensie vereist alleen het volgende commando:

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

Bijwerken van configuratiebestanden

Om de pg_cron background worker te starten zodra de PostgreSQL-server is gestart, moet pg_cron worden ingesteld op de parameter shared_preload_libraries in postgresql.conf: 

shared_preload_libraries = ‘pg_cron’

Het is ook nodig om in dit bestand de database te definiëren waarop de pg_cron-extensie zal worden gemaakt, door de volgende parameter toe te voegen:

cron.database_name= ‘postgres’

Aan de andere kant, in het pg_hba.conf-bestand dat de authenticatie beheert, is het noodzakelijk om de postgres-login te definiëren als vertrouwen voor de IPV4-verbindingen, omdat pg_cron vereist dat een dergelijke gebruiker verbinding kan maken met de database zonder een wachtwoord op te geven, dus de volgende regel moet aan dit bestand worden toegevoegd:

host postgres postgres 192.168.100.53/32 trust

De vertrouwensmethode van authenticatie stelt iedereen in staat om verbinding te maken met de database(s) gespecificeerd in het pg_hba.conf-bestand, in dit geval de postgres-database. Het is een methode die vaak wordt gebruikt om verbinding met Unix-domeinsocket op een computer met één gebruiker toe te staan ​​om toegang te krijgen tot de database en mag alleen worden gebruikt als er voldoende bescherming op besturingssysteemniveau is voor verbindingen met de server.

Beide wijzigingen vereisen een herstart van de PostgreSQL-service:

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

Het is belangrijk om er rekening mee te houden dat pg_cron geen taken uitvoert zolang de server in de stand-bymodus staat, maar automatisch start wanneer de server wordt gepromoveerd.

Creatie van pg_cron extensie

Deze extensie creëert de meta-data en de procedures om deze te beheren, dus het volgende commando moet worden uitgevoerd op psql:

postgres=#CREATE EXTENSION pg_cron;

CREATE EXTENSION

Nu zijn de benodigde objecten om taken te plannen al gedefinieerd in het cron-schema :

Deze extensie is heel eenvoudig, alleen de takentabel is voldoende om alle deze functionaliteit:

Definitie van nieuwe banen

De planningssyntaxis om taken op pg_cron te definiëren is dezelfde die wordt gebruikt in de cron-tool, en de definitie van nieuwe taken is heel eenvoudig, het is alleen nodig om de functie cron.schedule aan te roepen:

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'$$)

De taakinstelling wordt opgeslagen in de taaktabel: 

Een andere manier om een ​​taak te definiëren is door de gegevens rechtstreeks in de cron in te voegen .taaktabel:

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

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

en gebruik aangepaste waarden voor nodename en nodeport om verbinding te maken met een andere machine (evenals andere databases).

Deactivering van een taak

Aan de andere kant, om een ​​taak te deactiveren, is het alleen nodig om de volgende functie uit te voeren:

select cron.schedule(8)

Takenregistratie

Het loggen van deze taken is te vinden in het PostgreSQL-logbestand /var/log/postgresql/postgresql-12-main.log:


  1. Kan ik een functie gebruiken voor een standaardwaarde in MySql?

  2. Aan de slag met SQLite Zoeken in volledige tekst

  3. Het voorkomen van een drop-table bij het doelschema in Oracle Streams

  4. PostgreSQL versus Linux-kernelversies