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 |
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: