sql >> Databáze >  >> RDS >> PostgreSQL

Přehled nástrojů pro plánování úloh pro PostgreSQL

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

Ačkoli to není příliš obtížné, lze tuto syntaxi automaticky vygenerovat na více webových stránkách.

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:


  1. Jak zobrazím seznam všech sloupců v tabulce?

  2. Jak používat REPLACE v SQL

  3. Jak přepnout databázi pomocí PostgreSQL

  4. Obnovení smazaného 'root' uživatele a hesla pro MySQL