Agendamento de tarefas de manutenção com o pg_cron

pg_cron é uma extensão do PostgreSQL que oferece agendamento de tarefas no banco de dados, permitindo que você automatize tarefas SQL sem depender de ferramentas externas. Para obter mais informações, consulte pg_cron.

A extensão pg_cron é compatível com a versão 13 e superior do site PostgreSQL.

Configurando pg_cron

  1. Faça login no banco de dados ibmclouddb como usuário admin.

     \c ibmclouddb
    
  2. Habilite a extensão pg_cron.

     create extension pg_cron;
    
  3. Verifique se o site pg_cron está instalado.

     \dx
    

    pg_cron pode ser instalado somente em bancos de dados ibmclouddb e pode ser usado somente pelo usuário administrador devido a motivos de segurança atuais.

  4. Execute o seguinte comando para conceder privilégios para pg_cron.

     select public.grant_pgcron_privileges();
    

Planejando tarefas

Use o site cron.schedule_in_database() para agendar seus trabalhos.

SELECT cron.schedule_in_database(
    job_name text,
    schedule text,          -- cron expression
    command text,           -- SQL command to run
    database_name text      -- target database
);
  • Para visualizar os trabalhos agendados:
select * from cron.job;
  • Para visualizar os trabalhos de programação de status:
 select * from cron.job_run_details;
  • Para cancelar o agendamento de trabalhos:
ibmclouddb=> SELECT cron.unschedule(jobid);
 unschedule
------------
 t
(1 row)

Exemplo de uso pg_cron

  • Faça login no banco de dados ibmclouddb:
\c ibmclouddb
  • Habilite a extensão 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 privilégios para pg_cron:
ibmclouddb=> select public.grant_pgcron_privileges();
    grant_pgcron_privileges
--------------------------------
 Granted permission on pg_cron
(1 row)
  • Agendamento de um trabalho VACUUM para ser executado todos os domingos às 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 visualizar os trabalhos agendados:
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 visualizar os detalhes da execução do trabalho:
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 cancelar o agendamento de trabalhos:
ibmclouddb=> SELECT cron.unschedule(35);
 unschedule
------------
 t
(1 row)
  • Os registros em cron.job_run_details não são limpos automaticamente, mas todos os usuários que podem agendar trabalhos cron também têm permissão para excluir seus próprios registros em 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 são encerrados sempre que o banco de dados é reiniciado como resultado de atividades como dimensionamento, failover ou switchover. Como não há mecanismo de repetição, o trabalho não será retomado automaticamente. Você deve aguardar a próxima execução programada ou ajustar a programação conforme necessário.

  • Até 5 trabalhos pg_cron são executados simultaneamente; trabalhos adicionais aguardam em uma fila.