I modsætning til andre databasestyringssystemer, der har deres egen indbyggede skemalægger (som Oracle, MSSQL eller MySQL), har PostgreSQL stadig ikke denne form for funktion.
For at levere planlægningsfunktionalitet i PostgreSQL skal du bruge et eksternt værktøj som...
- Linux crontab
- Agent pgAgent
- Udvidelse pg_cron
I denne blog vil vi udforske disse værktøjer og fremhæve, hvordan man betjener dem og deres hovedfunktioner.
Linux crontab
Det er den ældste, men en effektiv og nyttig måde at udføre planlægningsopgaver på. Dette program er baseret på en dæmon (cron), der tillader, at opgaver automatisk køres i baggrunden med jævne mellemrum og regelmæssigt verificerer konfigurationsfilerne (kaldet crontab-filer), som er defineret scriptet/kommandoen, der skal udføres, og dets planlægning.
Hver bruger kan have sin egen crontab-fil, og de nyeste Ubuntu-udgivelser er placeret i:
/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
Konfigurationsfilens syntaks er følgende:
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])
Nogle få operatorer kunne bruges med denne syntaks til at strømline planlægningsdefinitionen, og disse symboler gør det muligt at angive flere værdier i et felt:
Asterisk (*) - det betyder alle mulige værdier for et felt
Kommaet (,) - bruges til at definere en liste med værdier
Dash (-) - bruges til at definere en række værdier
Separator (/) - angiver en trinværdi
Scriptet all_db_backup.sh vil blive udført i henhold til hvert planlægningsudtryk:
0 6 * * * /home/backup/all_db_backup.sh | Kl. 6 hver dag |
20 22 * * Man, Tir, Ons, Tor, Fre /home/backup/all_db_backup.sh | Kl. 22:20, alle hverdage |
0 23 * * 1-5 /home/backup/all_db_backup.sh | Kl. 23.00 i løbet af ugen |
0 0/5 14 * * /home/backup/all_db_backup.sh | Hver femte time fra kl. 14.00. og slutter kl. 14.55 hver dag |
Hvis crontab-filen ikke eksisterer for en bruger, kan den oprettes ved følgende kommando:
[email protected]:~$ crontab -e
eller præsenterede det ved hjælp af parameteren -l:
[email protected]:~$ crontab -l
Hvis det er nødvendigt for at fjerne denne fil, er den relevante parameter -r:
[email protected]:~$ crontab -r
Cron-dæmonens status vises ved udførelse af følgende kommando:
Agent pgAgent
pgAgent er en jobplanlægningsagent tilgængelig for PostgreSQL, som tillader udførelse af lagrede procedurer, SQL-sætninger og shell-scripts. Dens konfiguration er gemt i postgres-databasen i klyngen.
Formålet er at få denne agent til at køre som en dæmon på Linux-systemer og med jævne mellemrum oprette en forbindelse til databasen for at kontrollere, om der er nogle job, der skal udføres.
Denne planlægning administreres nemt af PgAdmin 4, men den er ikke installeret som standard, når først pgAdmin er installeret, det er nødvendigt at downloade og installere den på egen hånd.
Herefter beskrives alle de nødvendige trin for at få pgAgenten til at fungere korrekt:
Trin 1
Installation af pgAdmin 4
$ sudo apt install pgadmin4 pgadmin4-apache
Trin to
Oprettelse af plpgsql proceduresprog, hvis ikke defineret
CREATE TRUSTED PROCEDURAL LANGUAGE ‘plpgsql’
HANDLER plpgsql_call_handler
HANDLER plpgsql_validator;
Trin tre
Installation af pgAgent
$ sudo apt-get install pgagent
Trin fire
Oprettelse af pagent-udvidelsen
CREATE EXTENSION pageant
Denne udvidelse vil oprette alle tabeller og funktioner til pgAgent-operationen, og herefter vises datamodellen, der bruges af denne udvidelse:
Nu har pgAdmin-grænsefladen allerede muligheden "pgAgent Jobs" for at administrer pgAgenten:
For at definere et nyt job, er det kun nødvendigt at vælge "Opret" ved at bruge den højre knap på "pgAgent Jobs", og den vil indsætte en betegnelse for dette job og definere trinene til at udføre det:
I fanen "Schedules" skal planlægningen for dette nye job defineres :
For at få agenten til at køre i baggrunden er det endelig nødvendigt at starte følgende proces manuelt:
/usr/bin/pgagent host=localhost dbname=postgres user=postgres port=5432 -l 1
Ikke desto mindre er den bedste mulighed for denne agent at oprette en dæmon med den forrige kommando.
Udvidelse pg_cron
pg_cron er en cron-baseret jobplanlægger for PostgreSQL, der kører inde i databasen som en udvidelse (svarende til DBMS_SCHEDULER i Oracle) og tillader udførelse af databaseopgaver direkte fra databasen på grund af en baggrundsarbejder.
Opgaverne, der skal udføres, kan være en af følgende:
- lagrede procedurer
- SQL-udsagn
- PostgreSQL-kommandoer (som VACUUM eller VACUUM ANALYZE)
pg_cron kan køre flere job parallelt, men kun én forekomst af et program kan køre ad gangen.
Hvis en anden kørsel skal startes, før den første er færdig, er den i kø og vil blive startet, så snart den første kørsel er færdig.
Denne udvidelse blev defineret til version 9.5 eller nyere af PostgreSQL.
Installation af pg_cron
Installationen af denne udvidelse kræver kun følgende kommando:
[email protected]:~$ sudo apt-get -y install postgresql-10-cron
Opdatering af konfigurationsfiler
For at starte pg_cron-baggrundsarbejderen, når PostgreSQL-serveren starter, er det nødvendigt at indstille pg_cron til shared_preload_libraries-parameteren i postgresql.conf:
shared_preload_libraries = ‘pg_cron’
Det er også nødvendigt i denne fil at definere databasen, hvorpå pg_cron-udvidelsen vil blive oprettet, ved at tilføje følgende parameter:
cron.database_name= ‘postgres’
På den anden side, i filen pg_hba.conf, der styrer godkendelsen, er det nødvendigt at definere postgres login som tillid til IPV4-forbindelserne, fordi pg_cron kræver, at en sådan bruger kan oprette forbindelse til databasen uden at angive nogen adgangskode, så følgende linje skal tilføjes til denne fil:
host postgres postgres 192.168.100.53/32 trust
Tillidsmetoden til autentificering tillader enhver at oprette forbindelse til databasen(erne) specificeret i filen pg_hba.conf, i dette tilfælde postgres-databasen. Det er en metode, der ofte bruges til at tillade forbindelse ved hjælp af Unix-domæne-socket på en enkelt brugermaskine for at få adgang til databasen og bør kun bruges, når der er en tilstrækkelig beskyttelse på operativsystemniveau på forbindelser til serveren.
Begge ændringer kræver en PostgreSQL-tjenestegenstart:
[email protected]:~$ sudo system restart postgresql.service
Det er vigtigt at tage højde for, at pg_cron ikke kører nogen job, så længe serveren er i varm standby-tilstand, men den starter automatisk, når serveren forfremmes.
Oprettelse af pg_cron-udvidelse
Denne udvidelse vil skabe metadataene og procedurerne til at administrere dem, så følgende kommando skal udføres på psql:
postgres=#CREATE EXTENSION pg_cron;
CREATE EXTENSION
Nu er de nødvendige objekter til at planlægge job allerede defineret på cron-skemaet :
Denne udvidelse er meget enkel, kun jobtabellen er nok til at administrere alle denne funktionalitet:
Definition af nye job
Planlægningssyntaksen til at definere job på pg_cron er den samme som bruges på cron-værktøjet, og definitionen af nye job er meget enkel, det er kun nødvendigt at kalde funktionen 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'$$)
Job-opsætningen er gemt på jobtabellen:
En anden måde at definere et job på er ved at indsætte dataene direkte på cron .job tabel:
INSERT INTO cron.job (schedule, command, nodename, nodeport, database, username)
VALUES ('0 11 * * *','call loader.load_data();','postgresql-pgcron',5442,'staging', 'loader');
og brug tilpassede værdier for nodenavn og nodeport for at oprette forbindelse til en anden maskine (såvel som andre databaser).
Deaktivering af et job
På den anden side er det kun nødvendigt at udføre følgende funktion for at deaktivere et job:
select cron.schedule(8)
Joblogging
Logføringen af disse job kan findes i PostgreSQL-logfilen /var/log/postgresql/postgresql-12-main.log: