PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Présentation des outils de planification des tâches pour PostgreSQL

Contrairement à d'autres systèmes de gestion de bases de données qui ont leur propre planificateur intégré (comme Oracle, MSSQL ou MySQL), PostgreSQL n'a toujours pas ce genre de fonctionnalité.

Afin de fournir une fonctionnalité de planification dans PostgreSQL, vous devrez utiliser un outil externe comme...

  • Crontab Linux
  • Agent pgAgent
  • Extension pg_cron

Dans ce blog, nous allons explorer ces outils et mettre en évidence leur fonctionnement et leurs principales fonctionnalités.

Crontab Linux

C'est le plus ancien, cependant, un moyen efficace et utile d'exécuter des tâches de planification. Ce programme est basé sur un démon (cron) qui permet d'exécuter automatiquement des tâches en arrière-plan périodiquement et vérifie régulièrement les fichiers de configuration (appelés fichiers crontab) sur lesquels sont définis le script/commande à exécuter et sa planification.

Chaque utilisateur peut avoir son propre fichier crontab et les dernières versions d'Ubuntu se trouvent dans : 

/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

La syntaxe du fichier de configuration est la suivante :

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

Quelques opérateurs peuvent être utilisés avec cette syntaxe pour rationaliser la définition de la planification et ces symboles permettent de spécifier plusieurs valeurs dans un champ :

Astérisque (*) : il signifie toutes les valeurs possibles pour un champ

La virgule (,) - utilisée pour définir une liste de valeurs

Tiret (-) - utilisé pour définir une plage de valeurs

Séparateur (/) - spécifie une valeur de pas

Le script all_db_backup.sh sera exécuté en fonction de chaque expression de planification :

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

A 6h du matin tous les jours

20 22 * ​​* Lun, Mar, Mer, Jeu, Ven /home/backup/all_db_backup.sh

À 22h20, tous les jours de la semaine

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

A 23h en semaine

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

Toutes les cinq heures à partir de 14h00. et se terminant à 14h55, tous les jours

Bien que ce ne soit pas très difficile, cette syntaxe peut être générée automatiquement sur plusieurs pages Web.

Si le fichier crontab n'existe pas pour un utilisateur, il peut être créé par la commande suivante :

[email protected]:~$ crontab -e

ou présenté en utilisant le paramètre -l :

[email protected]:~$ crontab -l

Si nécessaire pour supprimer ce fichier, le paramètre approprié est -r :

[email protected]:~$ crontab -r

L'état du démon cron est affiché par l'exécution de la commande suivante :

Agent pgAgent

Le pgAgent est un agent de planification de travaux disponible pour PostgreSQL qui permet l'exécution de procédures stockées, d'instructions SQL et de scripts shell. Sa configuration est stockée sur la base de données postgres du cluster.

L'objectif est que cet agent s'exécute en tant que démon sur les systèmes Linux et effectue périodiquement une connexion à la base de données pour vérifier s'il y a des travaux à exécuter.

Cette planification est facilement gérée par PgAdmin 4, mais elle n'est pas installée par défaut une fois le pgAdmin installé, il est nécessaire de le télécharger et de l'installer soi-même.

Ci-après sont décrites toutes les étapes nécessaires pour que le pgAgent fonctionne correctement :

Première étape

Installation de pgAdmin 4

$ sudo apt install pgadmin4 pgadmin4-apache

Étape 2

Création du langage procédural plpgsql si non défini

CREATE TRUSTED PROCEDURAL LANGUAGE ‘plpgsql’

     HANDLER plpgsql_call_handler

          HANDLER plpgsql_validator;

Étape 3

Installation de  pgAgent

$ sudo apt-get install pgagent

Étape 4

Création de l'extension pgagent

CREATE EXTENSION pageant 

Cette extension créera toutes les tables et fonctions pour l'opération pgAgent et ci-après est montré le modèle de données utilisé par cette extension :

Maintenant, l'interface pgAdmin a déjà l'option "pgAgent Jobs" afin de gérer le pgAgent : 

Pour définir un nouveau travail, il suffit de sélectionner "Créer" en utilisant le bouton droit sur "pgAgent Jobs", et il insérera une désignation pour ce travail et définira les étapes pour l'exécuter :

Dans l'onglet "Planifications" doit être défini la planification pour ce nouveau travail :

Enfin, pour que l'agent s'exécute en arrière-plan, il est nécessaire de lancer le processus suivant manuellement :

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

Néanmoins, la meilleure option pour cet agent est de créer un démon avec la commande précédente.

Extension pg_cron

Le pg_cron est un planificateur de tâches basé sur cron pour PostgreSQL qui s'exécute à l'intérieur de la base de données en tant qu'extension (similaire au DBMS_SCHEDULER dans Oracle) et permet l'exécution de tâches de base de données directement à partir de la base de données, en raison d'un travailleur de fond.

Les tâches à effectuer peuvent être l'une des suivantes :

  • procédures stockées
  • Instructions SQL
  • Commandes PostgreSQL (comme VACUUM ou VACUUM ANALYZE)

pg_cron peut exécuter plusieurs tâches en parallèle, mais une seule instance d'un programme peut être exécutée à la fois.

Si une deuxième exécution doit être lancée avant la fin de la première, elle est mise en file d'attente et sera lancée dès la fin de la première exécution.

Cette extension a été définie pour la version 9.5 ou supérieure de PostgreSQL.

Installation de pg_cron

L'installation de cette extension nécessite uniquement la commande suivante :

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

Mise à jour des fichiers de configuration

Afin de démarrer le travailleur d'arrière-plan pg_cron une fois le serveur PostgreSQL démarré, il est nécessaire de définir pg_cron sur le paramètre shared_preload_libraries dans postgresql.conf : 

shared_preload_libraries = ‘pg_cron’

Il faut également définir dans ce fichier, la base de données sur laquelle l'extension pg_cron sera créée, en ajoutant le paramètre suivant :

cron.database_name= ‘postgres’

D'autre part, dans le fichier pg_hba.conf qui gère l'authentification, il est nécessaire de définir le login postgres comme trust pour les connexions IPV4, car pg_cron nécessite que cet utilisateur puisse se connecter à la base de données sans fournir de mot de passe, la ligne suivante doit donc être ajoutée à ce fichier :

host postgres postgres 192.168.100.53/32 trust

La méthode d'authentification de confiance permet à quiconque de se connecter à la ou aux bases de données spécifiées dans le fichier pg_hba.conf, dans ce cas la base de données postgres. Il s'agit d'une méthode souvent utilisée pour autoriser la connexion à l'aide d'un socket de domaine Unix sur une machine mono-utilisateur pour accéder à la base de données et ne doit être utilisée que lorsqu'il existe une protection adéquate au niveau du système d'exploitation sur les connexions au serveur.

Les deux modifications nécessitent un redémarrage du service PostgreSQL :

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

Il est important de prendre en compte que pg_cron n'exécute aucune tâche tant que le serveur est en mode de secours automatique, mais il démarre automatiquement lorsque le serveur est promu.

Création de l'extension pg_cron

Cette extension va créer les méta-données et les procédures pour les gérer, donc la commande suivante doit être exécutée sur psql :

postgres=#CREATE EXTENSION pg_cron;

CREATE EXTENSION

Maintenant, les objets nécessaires pour planifier les tâches sont déjà définis sur le schéma cron :

Cette extension est très simple, seule la table des jobs suffit à tout gérer cette fonctionnalité :

Définition des nouveaux emplois

La syntaxe de planification pour définir les jobs sur pg_cron est la même que celle utilisée sur l'outil cron, et la définition des nouveaux jobs est très simple, il suffit d'appeler la fonction 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'$$)

La configuration de la tâche est stockée dans la table des tâches : 

Une autre façon de définir un travail consiste à insérer les données directement sur le cron .table de travail :

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

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

et utilisez des valeurs personnalisées pour nodename et nodeport pour vous connecter à une autre machine (ainsi qu'à d'autres bases de données).

Désactivation d'un Job

Par contre, pour désactiver une tâche, il suffit d'exécuter la fonction suivante :

select cron.schedule(8)

Journalisation des travaux

La journalisation de ces tâches se trouve dans le fichier journal PostgreSQL /var/log/postgresql/postgresql-12-main.log :