sql >> Base de Datos >  >> RDS >> PostgreSQL

Una descripción general de las herramientas de programación de trabajos para PostgreSQL

A diferencia de otros sistemas de administración de bases de datos que tienen su propio programador incorporado (como Oracle, MSSQL o MySQL), PostgreSQL todavía no tiene este tipo de función.

Para proporcionar la funcionalidad de programación en PostgreSQL, necesitará usar una herramienta externa como...

  • Linux crontab
  • Agente pgAgente
  • Extensión pg_cron

En este blog exploraremos estas herramientas y destacaremos cómo operarlas y sus características principales.

Linux crontab

Es el más antiguo, sin embargo, una forma eficiente y útil de ejecutar tareas de programación. Este programa se basa en un demonio (cron) que permite que las tareas se ejecuten automáticamente en segundo plano periódicamente y verifica regularmente los archivos de configuración (llamados archivos crontab) en los que se define el script/comando a ejecutar y su programación.

Cada usuario puede tener su propio archivo crontab y para las versiones más recientes de Ubuntu se encuentran en: 

/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 sintaxis del archivo de configuración es la siguiente:

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

Se podrían usar algunos operadores con esta sintaxis para simplificar la definición de programación y estos símbolos permiten especificar múltiples valores en un campo:

Asterisco (*) :significa todos los valores posibles para un campo

La coma (,) - utilizada para definir una lista de valores

Guión (-) - utilizado para definir un rango de valores

Separador (/) - especifica un valor de paso

El script all_db_backup.sh se ejecutará de acuerdo con cada expresión de programación:

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

A las 6 am todos los días

20 22 * ​​* lunes, martes, miércoles, jueves, viernes /home/backup/all_db_backup.sh

A las 22:20, todos los días de la semana

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

A las 23:00 entre semana

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

Cada cinco horas a partir de las 14:00 h. y finalizando a las 14:55, todos los días

Aunque no es muy difícil, esta sintaxis se puede generar automáticamente en varias páginas web.

Si el archivo crontab no existe para un usuario, se puede crear con el siguiente comando:

[email protected]:~$ crontab -e

o presentado usando el parámetro -l:

[email protected]:~$ crontab -l

Si es necesario eliminar este archivo, el parámetro apropiado es -r:

[email protected]:~$ crontab -r

El estado del demonio cron se muestra mediante la ejecución del siguiente comando:

Agente pgAgente

pgAgent es un agente de programación de trabajos disponible para PostgreSQL que permite la ejecución de procedimientos almacenados, declaraciones SQL y scripts de shell. Su configuración se almacena en la base de datos de postgres en el clúster.

El propósito es que este agente se ejecute como un demonio en los sistemas Linux y se conecte periódicamente a la base de datos para verificar si hay trabajos para ejecutar.

Esta programación es fácilmente administrada por PgAdmin 4, pero no se instala de manera predeterminada una vez que se instala pgAdmin, es necesario que la descargue e instale por su cuenta.

A continuación se describen todos los pasos necesarios para que pgAgent funcione correctamente:

Paso uno

Instalación de pgAdmin 4

$ sudo apt install pgadmin4 pgadmin4-apache

Paso dos

Creación de lenguaje procedimental plpgsql si no está definido

CREATE TRUSTED PROCEDURAL LANGUAGE ‘plpgsql’

     HANDLER plpgsql_call_handler

          HANDLER plpgsql_validator;

Paso tres

Instalación de  pgAgent

$ sudo apt-get install pgagent

Cuarto Paso

Creación de la extensión pgagent

CREATE EXTENSION pageant 

Esta extensión creará todas las tablas y funciones para la operación de pgAgent y, a continuación, se muestra el modelo de datos utilizado por esta extensión:

Ahora la interfaz de pgAdmin ya tiene la opción “pgAgent Jobs” para administrar el pgAgent: 

Para definir un nuevo trabajo solo es necesario seleccionar "Crear" usando el botón derecho en “pgAgent Jobs”, e insertará una designación para este trabajo y definirá los pasos para ejecutarlo:

En la pestaña “Schedules” se debe definir la programación para este nuevo trabajo :

Finalmente, para tener el agente ejecutándose en segundo plano es necesario lanzar el siguiente proceso manualmente:

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

Sin embargo, la mejor opción para este agente es crear un daemon con el comando anterior.

Extensión pg_cron

pg_cron es un programador de trabajos basado en cron para PostgreSQL que se ejecuta dentro de la base de datos como una extensión (similar a DBMS_SCHEDULER en Oracle) y permite la ejecución de tareas de base de datos directamente desde la base de datos, debido a un trabajador de fondo.

Las tareas a realizar pueden ser cualquiera de las siguientes:

  • procedimientos almacenados
  • Declaraciones SQL
  • Comandos de PostgreSQL (como VACUUM o VACUUM ANALYZE)

pg_cron puede ejecutar varios trabajos en paralelo, pero solo se puede ejecutar una instancia de un programa a la vez.

Si se debe iniciar una segunda ejecución antes de que finalice la primera, se pone en cola y se iniciará tan pronto como se complete la primera ejecución.

Esta extensión se definió para la versión 9.5 o superior de PostgreSQL.

Instalación de pg_cron

La instalación de esta extensión solo requiere el siguiente comando:

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

Actualización de archivos de configuración

Para iniciar el trabajo en segundo plano de pg_cron una vez que se inicia el servidor PostgreSQL, es necesario establecer pg_cron en el parámetro shared_preload_libraries en postgresql.conf: 

shared_preload_libraries = ‘pg_cron’

También es necesario definir en este archivo, la base de datos sobre la cual se creará la extensión pg_cron, agregando el siguiente parámetro:

cron.database_name= ‘postgres’

Por otro lado, en el archivo pg_hba.conf que administra la autenticación, es necesario definir el inicio de sesión de postgres como confianza para las conexiones IPV4, ya que pg_cron requiere que dicho usuario pueda conectarse a la base de datos. sin proporcionar ninguna contraseña, por lo que se debe agregar la siguiente línea a este archivo:

host postgres postgres 192.168.100.53/32 trust

El método de confianza de autenticación permite que cualquier persona se conecte a la(s) base(s) de datos especificada(s) en el archivo pg_hba.conf, en este caso la base de datos postgres. Es un método que se usa a menudo para permitir la conexión mediante un socket de dominio Unix en una máquina de un solo usuario para acceder a la base de datos y solo debe usarse cuando existe una protección adecuada a nivel del sistema operativo en las conexiones al servidor.

Ambos cambios requieren un reinicio del servicio PostgreSQL:

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

Es importante tener en cuenta que pg_cron no ejecuta ningún trabajo mientras el servidor esté en modo de espera activa, pero se inicia automáticamente cuando se promueve el servidor.

Creación de la extensión pg_cron

Esta extensión creará los metadatos y los procedimientos para administrarlos, por lo que se debe ejecutar el siguiente comando en psql:

postgres=#CREATE EXTENSION pg_cron;

CREATE EXTENSION

Ahora, los objetos necesarios para programar trabajos ya están definidos en el esquema cron :

Esta extensión es muy simple, solo la tabla de trabajos es suficiente para administrar todos esta funcionalidad:

Definición de Nuevos Empleos

La sintaxis de programación para definir trabajos en pg_cron es la misma que se usa en la herramienta cron, y la definición de nuevos trabajos es muy simple, solo es necesario llamar a la función 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 configuración del trabajo se almacena en la tabla de trabajos: 

Otra forma de definir un trabajo es insertando los datos directamente en el cron .tabla de trabajos:

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

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

y use valores personalizados para nodename y nodeport para conectarse a una máquina diferente (así como a otras bases de datos).

Desactivación de un Trabajo

Por otro lado, para desactivar un trabajo solo es necesario ejecutar la siguiente función:

select cron.schedule(8)

Registro de trabajos

El registro de estos trabajos se puede encontrar en el archivo de registro de PostgreSQL /var/log/postgresql/postgresql-12-main.log: