PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Преглед на инструментите за планиране на работа за PostgreSQL

За разлика от други системи за управление на бази данни, които имат свой собствен вграден планировчик (като Oracle, MSSQL или MySQL), PostgreSQL все още няма този вид функция.

За да предоставите функционалност за планиране в PostgreSQL, ще трябва да използвате външен инструмент като...

  • Linux crontab
  • Агент pgAgent
  • Разширение pg_cron

В този блог ще разгледаме тези инструменти и ще подчертаем как да работим с тях и основните им функции.

Linux crontab

Това обаче е най-старият, ефективен и полезен начин за изпълнение на задачи за планиране. Тази програма се основава на демон (cron), който позволява на задачите да се изпълняват автоматично във фонов режим периодично и редовно проверява конфигурационните файлове (наречени crontab файлове), върху които са дефинирани скрипта/командата, която трябва да се изпълни, и нейното планиране.

Всеки потребител може да има свой собствен файл crontab, а най-новите версии на Ubuntu се намират в: 

/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

Синтаксисът на конфигурационния файл е следният:

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

С този синтаксис могат да се използват няколко оператора за рационализиране на дефиницията за планиране и тези символи позволяват да се посочат множество стойности в поле:

Звездичка (*)  – означава всички възможни стойности за поле

Запетаята (,) - използва се за дефиниране на списък със стойности

Тире (-) - използва се за дефиниране на диапазон от стойности

Разделител (/) - посочва стойност на стъпка

Скриптът all_db_backup.sh ще се изпълнява според всеки израз за планиране:

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

В 6 сутринта всеки ден

20 22 * ​​* Пон, Вт, Ср, Четък, Пет /home/backup/all_db_backup.sh

В 22:20 ч. всеки делничен ден

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

В 23 часа през седмицата

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

На всеки пет часа, започвайки в 14:00 ч. и завършваща в 14:55 ч. всеки ден

Въпреки че не е много трудно, този синтаксис може да се генерира автоматично на множество уеб страници.

Ако файлът crontab не съществува за потребител, той може да бъде създаден чрез следната команда:

[email protected]:~$ crontab -e

или го представи с помощта на параметъра -l:

[email protected]:~$ crontab -l

Ако е необходимо да премахнете този файл, подходящият параметър е -r:

[email protected]:~$ crontab -r

Състоянието на демона cron се показва чрез изпълнение на следната команда:

Агент pgAgent

pgAgent е агент за планиране на задачи, наличен за PostgreSQL, който позволява изпълнението на съхранени процедури, SQL изрази и скриптове на обвивката. Неговата конфигурация се съхранява в базата данни на postgres в клъстера.

Целта е този агент да работи като демон в Linux системи и периодично да прави връзка с базата данни, за да проверява дали има някакви задачи за изпълнение.

Това планиране се управлява лесно от PgAdmin 4, но не се инсталира по подразбиране след инсталиране на pgAdmin, необходимо е да го изтеглите и инсталирате сами.

По-нататък са описани всички необходими стъпки, за да може pgAgent да работи правилно:

Първа стъпка

Инсталиране на pgAdmin 4

$ sudo apt install pgadmin4 pgadmin4-apache

Стъпка втора

Създаване на процедурен език plpgsql, ако не е дефиниран

CREATE TRUSTED PROCEDURAL LANGUAGE ‘plpgsql’

     HANDLER plpgsql_call_handler

          HANDLER plpgsql_validator;

Стъпка трета

Инсталиране на  pgAgent

$ sudo apt-get install pgagent

Стъпка четвърта

Създаване на разширението pgagent

CREATE EXTENSION pageant 

Това разширение ще създаде всички таблици и функции за операцията pgAgent и оттук нататък се показва моделът на данни, използван от това разширение:

Сега интерфейсът на pgAdmin вече има опцията „pgAgent Jobs“, за да управлявайте pgAgent: 

За да дефинирате нова работа, е необходимо само да изберете „Създаване“ като използвате десния бутон на „pgAgent Jobs“, и той ще вмъкне обозначение за тази задача и ще дефинира стъпките за нейното изпълнение:

В раздела „Графици“ трябва да се дефинира графикът за тази нова работа :

Накрая, за да работи агентът във фонов режим, е необходимо да стартирате следния процес ръчно:

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

Въпреки това, най-добрият вариант за този агент е да създаде демон с предишната команда.

Разширение pg_cron

Pg_cron е базиран на cron планировчик на задания за PostgreSQL, който работи в базата данни като разширение (подобно на DBMS_SCHEDULER в Oracle) и позволява изпълнението на задачи на база данни директно от базата данни, поради фонов работник.

Задачите за изпълнение могат да бъдат някоя от следните:

  • запазени процедури
  • SQL оператори
  • Команди на PostgreSQL (като VACUUM или VACUUM ANALYZE)

pg_cron може да изпълнява няколко задачи паралелно, но в даден момент може да се изпълнява само един екземпляр на програма.

Ако трябва да започне второ изпълнение преди да завърши първото, то се поставя на опашка и ще бъде стартирано веднага щом завърши първото изпълнение.

Това разширение е дефинирано за версия 9.5 или по-нова на PostgreSQL.

Инсталиране на pg_cron

Инсталирането на това разширение изисква само следната команда:

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

Актуализиране на конфигурационни файлове

За да стартирате pg_cron фонов работник, след като PostgreSQL сървърът стартира, е необходимо да зададете pg_cron на параметър shared_preload_libraries в postgresql.conf: 

shared_preload_libraries = ‘pg_cron’

В този файл също е необходимо да дефинирате базата данни, върху която ще бъде създадено разширението pg_cron, като добавите следния параметър:

cron.database_name= ‘postgres’

От друга страна, във файла pg_hba.conf, който управлява удостоверяването, е необходимо да се дефинира влизането в postgres като доверие за IPV4 връзките, тъй като pg_cron изисква такъв потребител да може да се свърже с базата данни без да предоставяте парола, така че към този файл трябва да се добави следният ред:

host postgres postgres 192.168.100.53/32 trust

Методът за доверие на удостоверяване позволява на всеки да се свърже с базата данни, посочени във файла pg_hba.conf, в този случай базата данни postgres. Това е метод, използван често за разрешаване на свързване чрез Unix сокет на домейн на една потребителска машина за достъп до базата данни и трябва да се използва само когато има  адекватна защита на ниво операционна система за връзките към сървъра.

И двете промени изискват рестартиране на услугата PostgreSQL:

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

Важно е да се има предвид, че pg_cron не изпълнява никакви задачи, докато сървърът е в режим на гореща готовност, но автоматично стартира, когато сървърът бъде повишен.

Създаване на разширение pg_cron

Това разширение ще създаде метаданните и процедурите за управлението им, така че следната команда трябва да се изпълни на psql:

postgres=#CREATE EXTENSION pg_cron;

CREATE EXTENSION

Сега необходимите обекти за планиране на задания вече са дефинирани в схемата на cron :

Това разширение е много просто, само таблицата със задания е достатъчна за управление на всички тази функционалност:

Дефиниция на нови работни места

Синтаксисът на планиране за дефиниране на работни места в pg_cron е същият, използван в инструмента cron, а дефиницията на новите работни места е много проста, необходимо е само да извикате функцията 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'$$)

Настройката на заданието се съхранява в таблицата със задания: 

Друг начин за дефиниране на задание е чрез вмъкване на данните директно в cron .таблица за работа:

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

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

и използвайте персонализирани стойности за име на nodename и nodeport, за да се свържете с друга машина (както и други бази данни).

Деактивиране на задания

От друга страна, за да деактивирате задание, е необходимо само да изпълните следната функция:

select cron.schedule(8)

Регистриране на работни места

Регистрирането на тези задачи може да се намери в регистрационния файл на 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. Получаване на автоматично генериран ключ от вмъкване на ред през пролетта 3 / PostgreSQL 8.4.9

  2. Автоматизирани надстройки на PostgreSQL клъстери в облак с почти нулев престой (част II)

  3. Фиксиране на дупки/пропуски в числата, генерирани от последователността на Postgres

  4. Защо стойностите NULL са на първо място при поръчка на DESC в заявка на PostgreSQL?

  5. Грешка при опит за стартиране на pgAdmin4