Na rozdíl od jiných systémů pro správu databází, které mají svůj vlastní vestavěný plánovač (jako Oracle, MSSQL nebo MySQL), PostgreSQL tuto funkci stále nemá.
Abyste mohli v PostgreSQL poskytovat funkce plánování, budete muset použít externí nástroj jako...
- Linux crontab
- Agent pgAgent
- Rozšíření pg_cron
V tomto blogu prozkoumáme tyto nástroje a zdůrazníme, jak je ovládat a jejich hlavní funkce.
Linux crontab
Je to nejstarší, nicméně účinný a užitečný způsob provádění úloh plánování. Tento program je založen na démonu (cron), který umožňuje automatické spouštění úloh na pozadí pravidelně a pravidelně ověřuje konfigurační soubory (nazývané soubory crontab), na kterých je definován skript/příkaz, který se má provést, a jeho plánování.
Každý uživatel může mít svůj vlastní soubor crontab a nejnovější verze Ubuntu jsou umístěny v:
/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
Syntaxe konfiguračního souboru je následující:
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])
S touto syntaxí lze použít několik operátorů ke zjednodušení definice plánování a tyto symboly umožňují zadat více hodnot v poli:
Hvězdička (*) – znamená všechny možné hodnoty pro pole
Čárka (,) – používá se k definování seznamu hodnot
Pomlčka (-) – používá se k definování rozsahu hodnot
Oddělovač (/) – určuje hodnotu kroku
Skript all_db_backup.sh bude spuštěn podle každého plánovacího výrazu:
0 6 * * * /home/backup/all_db_backup.sh | Každý den v 6:00 |
20 22 * * Po, Út, St, Čt, Pá /home/backup/all_db_backup.sh | Ve 22:20, každý všední den |
0 23 * * 1-5 /home/backup/all_db_backup.sh | Ve 23:00 během týdne |
0 0/5 14 * * /home/backup/all_db_backup.sh | Každých pět hodin od 14:00 a končí ve 14:55, každý den |
Pokud soubor crontab pro uživatele neexistuje, lze jej vytvořit následujícím příkazem:
[email protected]:~$ crontab -e
nebo jej prezentoval pomocí parametru -l:
[email protected]:~$ crontab -l
Pokud je nutné tento soubor odstranit, je vhodným parametrem -r:
[email protected]:~$ crontab -r
Stav démona cron se zobrazí provedením následujícího příkazu:
Agent pgAgent
PgAgent je agent pro plánování úloh dostupný pro PostgreSQL, který umožňuje spouštění uložených procedur, příkazů SQL a skriptů shellu. Jeho konfigurace je uložena v databázi postgres v clusteru.
Účelem je, aby tento agent běžel jako démon na systémech Linux a pravidelně se připojoval k databázi, aby zkontroloval, zda existují nějaké úlohy ke spuštění.
Toto plánování snadno spravuje PgAdmin 4, ale po instalaci pgAdmin se ve výchozím nastavení neinstaluje, je nutné si jej stáhnout a nainstalovat sami.
Níže jsou popsány všechny nezbytné kroky, aby pgAgent správně fungoval:
Krok jedna
Instalace pgAdmin 4
$ sudo apt install pgadmin4 pgadmin4-apache
Krok dva
Vytvoření procedurálního jazyka plpgsql, pokud není definován
CREATE TRUSTED PROCEDURAL LANGUAGE ‘plpgsql’
HANDLER plpgsql_call_handler
HANDLER plpgsql_validator;
Krok tři
Instalace pgAgent
$ sudo apt-get install pgagent
Krok čtyři
Vytvoření rozšíření pgagent
CREATE EXTENSION pageant
Toto rozšíření vytvoří všechny tabulky a funkce pro operaci pgAgent a dále je uveden datový model používaný tímto rozšířením:
Rozhraní pgAdmin již má možnost „pgAgent Jobs“, aby bylo možné spravovat pgAgent:
Chcete-li definovat novou úlohu, je nutné pouze vybrat "Vytvořit" pomocí pravého tlačítka na „pgAgent Jobs“ a vloží označení pro tuto úlohu a definuje kroky k jejímu provedení:
Na záložce „Plány“ musí být definováno plánování pro tuto novou úlohu :
Aby agent běžel na pozadí, je nutné spustit následující proces ručně:
/usr/bin/pgagent host=localhost dbname=postgres user=postgres port=5432 -l 1
Nicméně nejlepší možností pro tohoto agenta je vytvořit démona pomocí předchozího příkazu.
Rozšíření pg_cron
Pg_cron je plánovač úloh pro PostgreSQL založený na cron, který běží uvnitř databáze jako rozšíření (podobně jako DBMS_SCHEDULER v Oracle) a umožňuje provádění databázových úloh přímo z databáze, protože pracovník na pozadí.
Úkoly k provedení mohou být některé z následujících:
- uložené procedury
- příkazy SQL
- Příkazy PostgreSQL (jako VACUUM nebo VACUUM ANALYZE)
pg_cron může spouštět několik úloh paralelně, ale současně může být spuštěna pouze jedna instance programu.
Pokud by měl být druhý běh spuštěn před dokončením prvního, bude zařazen do fronty a bude spuštěn, jakmile skončí první běh.
Toto rozšíření bylo definováno pro verzi PostgreSQL 9.5 nebo vyšší.
Instalace pg_cron
Instalace tohoto rozšíření vyžaduje pouze následující příkaz:
[email protected]:~$ sudo apt-get -y install postgresql-10-cron
Aktualizace konfiguračních souborů
Aby se po spuštění serveru PostgreSQL spustil pracovník na pozadí pg_cron, je nutné nastavit pg_cron na parametr shared_preload_libraries v postgresql.conf:
shared_preload_libraries = ‘pg_cron’
V tomto souboru je také nutné definovat databázi, na které bude přípona pg_cron vytvořena, přidáním následujícího parametru:
cron.database_name= ‘postgres’
Na druhou stranu v souboru pg_hba.conf, který spravuje autentizaci, je nutné definovat postgres přihlášení jako důvěryhodnost pro připojení IPV4, protože pg_cron vyžaduje, aby se takový uživatel mohl připojit k databázi bez zadání jakéhokoli hesla, takže do tohoto souboru je třeba přidat následující řádek:
host postgres postgres 192.168.100.53/32 trust
Metoda ověřování důvěryhodnosti umožňuje komukoli připojit se k databázi (databázím) uvedeným v souboru pg_hba.conf, v tomto případě k databázi postgres. Je to metoda, která se často používá k umožnění připojení pomocí soketu domény Unix na jednom uživatelském počítači pro přístup k databázi a měla by se používat pouze v případě, že připojení k serveru má odpovídající ochranu na úrovni operačního systému.
Obě změny vyžadují restart služby PostgreSQL:
[email protected]:~$ sudo system restart postgresql.service
Je důležité vzít v úvahu, že pg_cron nespouští žádné úlohy, dokud je server v horkém pohotovostním režimu, ale automaticky se spouští, když je server povýšen.
Vytvoření rozšíření pg_cron
Toto rozšíření vytvoří metadata a postupy pro jejich správu, takže následující příkaz by měl být spuštěn na psql:
postgres=#CREATE EXTENSION pg_cron;
CREATE EXTENSION
Nyní jsou potřebné objekty pro plánování úloh již definovány ve schématu cron :
Toto rozšíření je velmi jednoduché, ke správě všech stačí pouze pracovní tabulka tato funkce:
Definice nových pracovních míst
Syntaxe plánování pro definování úloh na pg_cron je stejná jako v nástroji cron a definice nových úloh je velmi jednoduchá, stačí zavolat funkci 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'$$)
Nastavení úlohy je uloženo v tabulce úloh:
Dalším způsobem, jak definovat úlohu, je vložení dat přímo do cronu .tabulka práce:
INSERT INTO cron.job (schedule, command, nodename, nodeport, database, username)
VALUES ('0 11 * * *','call loader.load_data();','postgresql-pgcron',5442,'staging', 'loader');
a použijte vlastní hodnoty pro nodename a nodeport pro připojení k jinému počítači (stejně jako k jiným databázím).
Deaktivace úlohy
Na druhou stranu k deaktivaci úlohy je nutné provést pouze následující funkci:
select cron.schedule(8)
Protokolování úloh
Protokolování těchto úloh lze nalézt v souboru protokolu PostgreSQL /var/log/postgresql/postgresql-12-main.log: