PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Przegląd narzędzi do planowania zadań dla PostgreSQL

W przeciwieństwie do innych systemów zarządzania bazami danych, które mają własny wbudowany harmonogram (takich jak Oracle, MSSQL lub MySQL), PostgreSQL nadal nie ma tego rodzaju funkcji.

W celu zapewnienia funkcjonalności planowania w PostgreSQL będziesz musiał użyć zewnętrznego narzędzia, takiego jak...

  • crontab Linux
  • Agent pgAgent
  • Rozszerzenie pg_cron

W tym blogu przyjrzymy się tym narzędziom i przedstawimy sposób ich obsługi oraz ich główne funkcje.

Crontab Linuksa

Jest to jednak najstarszy, wydajny i użyteczny sposób wykonywania zadań związanych z harmonogramem. Ten program jest oparty na daemonie (cronie), który umożliwia okresowe automatyczne uruchamianie zadań w tle i regularnie weryfikuje pliki konfiguracyjne (zwane plikami crontab), na których zdefiniowany jest skrypt/polecenie do wykonania i jego harmonogram.

Każdy użytkownik może mieć swój własny plik crontab, a najnowsze wydania Ubuntu znajdują się w: 

/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

Składnia pliku konfiguracyjnego jest następująca:

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

W tej składni można użyć kilku operatorów, aby usprawnić definicję planowania, a te symbole umożliwiają określenie wielu wartości w polu:

Gwiazdka (*)  – oznacza wszystkie możliwe wartości pola

Przecinek (,) — używany do definiowania listy wartości

Myślnik (-) — używany do definiowania zakresu wartości

Separator (/) — określa wartość kroku

Skrypt all_db_backup.sh zostanie wykonany zgodnie z każdym wyrażeniem planowania:

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

Codziennie o 6 rano

20 22 * ​​* pon., wt., śr., czw., pt. /home/backup/all_db_backup.sh

O 22:20, w każdy dzień powszedni

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

O 23:00 w ciągu tygodnia

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

Co pięć godzin od godziny 14:00 i kończy się codziennie o 14:55

Chociaż nie jest to bardzo trudne, ta składnia może być automatycznie generowana na wielu stronach internetowych.

Jeśli plik crontab nie istnieje dla użytkownika, można go utworzyć za pomocą następującego polecenia:

[email protected]:~$ crontab -e

lub przedstawił go za pomocą parametru -l:

[email protected]:~$ crontab -l

Jeśli konieczne jest usunięcie tego pliku, odpowiednim parametrem jest -r:

[email protected]:~$ crontab -r

Status demona cron jest pokazywany przez wykonanie następującego polecenia:

Agent pgAgent

pgAgent to agent planowania zadań dostępny dla PostgreSQL, który umożliwia wykonywanie procedur zapisanych w bazie, instrukcji SQL i skryptów powłoki. Jego konfiguracja jest przechowywana w bazie danych postgres w klastrze.

Celem jest, aby ten agent działał jako demon w systemach Linux i okresowo nawiązywał połączenie z bazą danych, aby sprawdzić, czy są jakieś zadania do wykonania.

Ten harmonogram jest łatwo zarządzany przez PgAdmin 4, ale nie jest domyślnie instalowany po zainstalowaniu pgAdmina, konieczne jest pobranie i zainstalowanie go samodzielnie.

Poniżej opisano wszystkie niezbędne kroki, aby pgAgent działał poprawnie:

Krok pierwszy

Instalacja pgAdmin 4

$ sudo apt install pgadmin4 pgadmin4-apache

Krok drugi

Tworzenie języka proceduralnego plpgsql, jeśli nie jest zdefiniowany

CREATE TRUSTED PROCEDURAL LANGUAGE ‘plpgsql’

     HANDLER plpgsql_call_handler

          HANDLER plpgsql_validator;

Krok trzeci

Instalacja pgAgenta

$ sudo apt-get install pgagent

Krok czwarty

Tworzenie rozszerzenia pgagent

CREATE EXTENSION pageant 

To rozszerzenie utworzy wszystkie tabele i funkcje dla operacji pgAgent, a poniżej zostanie pokazany model danych używany przez to rozszerzenie:

Teraz interfejs pgAdmin ma już opcję „PgAgent Jobs” w celu zarządzaj pgAgent: 

W celu zdefiniowania nowego zadania wystarczy wybrać opcję „Utwórz” używając prawego przycisku na „pgAgent Jobs”, a wstawi oznaczenie dla tego zadania i zdefiniuje kroki, aby je wykonać:

W zakładce „Harmonogramy” należy zdefiniować harmonogram dla tego nowego zadania :

Na koniec, aby agent działał w tle, należy uruchomić następujący proces ręcznie:

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

Niemniej jednak najlepszą opcją dla tego agenta jest utworzenie demona za pomocą poprzedniego polecenia.

Rozszerzenie pg_cron

pg_cron to oparty na cronie harmonogram zadań dla PostgreSQL, który działa wewnątrz bazy danych jako rozszerzenie (podobnie jak DBMS_SCHEDULER w Oracle) i umożliwia wykonywanie zadań bazy danych bezpośrednio z bazy danych, ze względu na pracownik w tle.

Zadania do wykonania mogą być jednymi z następujących:

  • procedury składowane
  • wyrażenia SQL
  • Polecenia PostgreSQL (jako VACUUM lub VACUUM ANALYZE)

pg_cron może uruchamiać kilka zadań równolegle, ale tylko jedna instancja programu może być uruchomiona na raz.

Jeżeli drugi przebieg powinien zostać rozpoczęty przed zakończeniem pierwszego, jest on umieszczany w kolejce i zostanie uruchomiony zaraz po zakończeniu pierwszego przebiegu.

To rozszerzenie zostało zdefiniowane dla wersji 9.5 lub nowszej PostgreSQL.

Instalacja pg_crona

Instalacja tego rozszerzenia wymaga tylko następującego polecenia:

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

Aktualizacja plików konfiguracyjnych

Aby uruchomić pg_cron background worker po uruchomieniu serwera PostgreSQL, należy ustawić pg_cron na parametr shared_preload_libraries w postgresql.conf:

shared_preload_libraries = ‘pg_cron’

Konieczne jest również zdefiniowanie w tym pliku bazy danych, na której zostanie utworzone rozszerzenie pg_cron, poprzez dodanie następującego parametru:

cron.database_name= ‘postgres’

Z drugiej strony w pliku pg_hba.conf zarządzającym uwierzytelnianiem konieczne jest zdefiniowanie loginu postgres jako zaufania dla połączeń IPV4, ponieważ pg_cron wymaga, aby taki użytkownik mógł połączyć się z bazą danych bez podawania hasła, więc do tego pliku należy dodać następującą linię:

host postgres postgres 192.168.100.53/32 trust

Metoda uwierzytelniania zaufania pozwala każdemu połączyć się z bazą danych określoną w pliku pg_hba.conf, w tym przypadku bazą danych postgres. Jest to metoda często używana do zezwalania na połączenie przy użyciu gniazda domeny uniksowej na pojedynczym komputerze użytkownika w celu uzyskania dostępu do bazy danych i powinna być używana tylko wtedy, gdy istnieje odpowiednia ochrona na poziomie systemu operacyjnego połączeń z serwerem.

Obie zmiany wymagają ponownego uruchomienia usługi PostgreSQL:

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

Ważne jest, aby wziąć pod uwagę, że pg_cron nie uruchamia żadnych zadań, dopóki serwer jest w trybie gotowości, ale automatycznie uruchamia się, gdy serwer jest promowany.

Tworzenie rozszerzenia pg_cron

To rozszerzenie utworzy metadane i procedury do zarządzania nimi, więc następujące polecenie powinno zostać wykonane na psql:

postgres=#CREATE EXTENSION pg_cron;

CREATE EXTENSION

Teraz wymagane obiekty do planowania zadań są już zdefiniowane w schemacie crona :

To rozszerzenie jest bardzo proste, tylko tabela zadań wystarcza do zarządzania wszystkimi ta funkcja:

Definicja nowych miejsc pracy

Składnia planowania służąca do definiowania zadań w pg_cron jest taka sama, jak w narzędziu cron, a definicja nowych zadań jest bardzo prosta, wystarczy wywołać funkcję 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'$$)

Konfiguracja zadania jest przechowywana w tabeli zadań: 

Innym sposobem zdefiniowania zadania jest wstawienie danych bezpośrednio do crona tabela .job:

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

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

i użyj niestandardowych wartości dla nazwy węzła i portu węzła, aby połączyć się z inną maszyną (jak również z innymi bazami danych).

Dezaktywacja zadań

Z drugiej strony, aby dezaktywować zadanie, wystarczy wykonać następującą funkcję:

select cron.schedule(8)

Rejestrowanie zadań

Rejestrowanie tych zadań można znaleźć w pliku dziennika PostgreSQL /var/log/postgresql/postgresql-12-main.log:


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przetestować mój ad-hoc SQL z parametrami w oknie zapytania Postgres

  2. Jak utworzyć sekwencję, jeśli nie istnieje?

  3. Problemy z createdb w postgres

  4. Jak działa KOPIUJ i dlaczego jest o wiele szybszy niż WSTAWIANIE?

  5. Jak testować pod kątem nakładających się dat w PostgreSQL