Programación de tareas de mantenimiento con pg_cron

pg_cron es una extensión de PostgreSQL que proporciona programación de trabajos en la base de datos, permitiéndole automatizar tareas SQL sin depender de herramientas externas. Para obtener más información, consulte pg_cron.

La extensión pg_cron es compatible con PostgreSQL versión 13 y superiores.

Configuración de pg_cron

  1. Inicie sesión en la base de datos ibmclouddb como usuario admin.

     \c ibmclouddb
    
  2. Active la extensión pg_cron.

     create extension pg_cron;
    
  3. Compruebe si pg_cron está instalado.

     \dx
    

    pg_cron sólo puede instalarse en bases de datos ibmclouddb y sólo puede ser utilizado por el usuario administrador debido a razones de seguridad actuales.

  4. Ejecute el siguiente comando para conceder privilegios a pg_cron.

     select public.grant_pgcron_privileges();
    

Planificación de trabajos

Utilice cron.schedule_in_database() para programar sus trabajos.

SELECT cron.schedule_in_database(
    job_name text,
    schedule text,          -- cron expression
    command text,           -- SQL command to run
    database_name text      -- target database
);
  • Para ver los trabajos programados:
select * from cron.job;
  • Para ver el estado de los trabajos programados:
 select * from cron.job_run_details;
  • Para desprogramar trabajos:
ibmclouddb=> SELECT cron.unschedule(jobid);
 unschedule
------------
 t
(1 row)

Ejemplo de utilización pg_cron

  • Acceda a la base de datos ibmclouddb:
\c ibmclouddb
  • Active la extensión pg_cron:
ibmclouddb=> \dx
                 List of installed extensions
  Name   | Version |   Schema   |         Description
---------+---------+------------+------------------------------
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
(1 row)

ibmclouddb=> create extension pg_cron;
CREATE EXTENSION
ibmclouddb=>
ibmclouddb=> \dx
                 List of installed extensions
  Name   | Version |   Schema   |         Description
---------+---------+------------+------------------------------
 pg_cron | 1.6     | pg_catalog | Job scheduler for PostgreSQL
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
(2 rows)
  • Conceder privilegios para pg_cron:
ibmclouddb=> select public.grant_pgcron_privileges();
    grant_pgcron_privileges
--------------------------------
 Granted permission on pg_cron
(1 row)
  • Programar un trabajo de VACIO para que se ejecute todos los domingos a las 4:00 AM.
SELECT cron.schedule_in_database(
    job_name text,
    schedule text,          -- cron expression
    command text,           -- SQL command to run
    database_name text      -- target database
);
 ibmclouddb=> SELECT cron.schedule_in_database('weekly-vacuum', '0 4 * * 0', 'VACUUM', 'test');
 schedule_in_database
----------------------
                   35
(1 row)

  • Para ver los trabajos programados:
ibmclouddb=> select * from cron.job;
 jobid | schedule  | command | nodename  | nodeport | database | username | active |    jobname
-------+-----------+---------+-----------+----------+----------+----------+--------+---------------
    35 | 0 4 * * 0 | VACUUM  | localhost |     5432 | test     | admin    | t      | weekly-vacuum
(1 row)

  • Para ver los detalles de la ejecución del trabajo:
ibmclouddb=> select * from cron.job_run_details;
 jobid | runid | job_pid | database | username | command |  status   | return_message |          start_time           |           end_time
-------+-------+---------+----------+----------+---------+-----------+----------------+-------------------------------+-------------------------------
    35 |    85 |   33810 | test     | admin    | VACUUM  | succeeded | VACUUM         | 2025-09-23 15:48:00.013814+00 | 2025-09-23 15:48:01.29763+00
  • Para desprogramar trabajos:
ibmclouddb=> SELECT cron.unschedule(35);
 unschedule
------------
 t
(1 row)
  • Los registros de cron.job_run_details no se limpian automáticamente, pero todos los usuarios que pueden programar tareas cron también tienen permiso para eliminar sus propios registros de cron.job_run_details.
ibmclouddb=> SELECT  cron.schedule('delete-job-run-details', '0 12 * * *', $$DELETE FROM cron.job_run_details WHERE end_time < now() - interval '7 days'$$);
  • pg_cron los trabajos finalizan cada vez que se reinicia la base de datos como resultado de actividades como el escalado, la conmutación por error o la conmutación. Como no existe un mecanismo de reintento, el trabajo no se reanudará automáticamente. Debe esperar a la siguiente ejecución programada o ajustar la programación según sea necesario.

  • Hasta 5 trabajos pg_cron se ejecutan simultáneamente; los trabajos adicionales esperan en una cola.