Como agendar execução de consultas e comandos pelo PostgreSQL no RDS
Tags: postgres, rds, aws, braziliandevs
Published: 2022-02-07 13:46:36

---
title: Como agendar execução de consultas e comandos pelo PostgreSQL no RDS
published: true
description: Habilite a execução de comandos no postgres no RDS, usando a extensão pg_cron
tags: #PostgreSQL #rds #aws #braziliandevs 
cover_image: https://cdn.culturagenial.com/imagens/clocks-cke.jpgD
---

## Introdução

PostgreSQL é um banco de dados incrível e que tem crescido nos últimos anos. Possui uma arquitetura modular e de fácil extensibilidade, existem no mercado diversos produtos baseado nele. Um dos recursos mais legais do Postgres são suas extensões. Essas extensões dão a possibilidade ao usuário de estender suas funcionalidades através da instalação de módulos adicionais. Neste artigo abordaremos a utilização da extensão `pg_cron` disponível no [***aws rds***](https://aws.amazon.com/pt/rds/postgresql/). O RDS é um serviço de banco de dados gerenciado da Amazon Web Services. 

## Extensão pg_cron

A extensão `pg_cron` é um agendador de tarefas simples baseado no cron para PostgreSQL(10 ou superior) que é executado dentro do banco de dados como uma extensão. Ele usa a mesma sintaxe do [cron](https://en.wikipedia.org/wiki/Cron) comum, mas permite agendar comandos do PostgreSQL diretamente. A extensão foi desenvolvida pela  **Citus Data**(comprada pela Microsoft). Para mais detalhes veja no link https://github.com/citusdata/pg_cron 


## Habilitando a extensão no RDS

Neste artigo consideraremos a versão 13 do Postgres. Para habilitar a extensão, primeiramente precisaremos criar um ***Parameter group***. No console da AWS vá em RDS no menu do lado esquerdo clique em ***Parameter group***, conforme imagem abaixo: 
![Menu de Opções do RDS](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ek02p80ol3cfdnt89ci9.png)

Em seguida clique em "***create parameter group***" no canto superior direito, veja a imagem abaixo:

![Listagem do Parameter groups](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dzsefoqqybmyx2pgpj8i.png)

Em ***Parameter group family***, selecione "postgres 13", em ***Type*** deixe o valor como está(DB Parameter Group), no campo ***Group name*** coloque um identificador apropriado, em ***Description*** coloque um valor apropriado e clique no botão "***create***", conforme a imagem abaixo: 

![Create parameter group](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qrhdw7yv4gzfej6x0z0d.png)

Na listagem dos ***Parameters Group*** procure o parameter group definido no passo anterior, conforme a imagem:

![Listagem do Parameter groups](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oydirg1gc5ddq8t661m0.png)

Na caixa de busca pesquise por "shared", conforme a imagem:

![Listagem dos parâmetros do parameter group criado](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7d7mi66cizxsi8bv5855.png)

Em seguida selecione o parâmetro `shared_preload_libraries` e clique no botão superior direito "***Edit parameter***", conforme imagem:

![Listagem dos parâmetros do parameter group criado](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2j2lvruvssv5l78xb68c.png)

Coloque separado por vírgula a extensão `pg_cron` e clique em "***Save Changes***", conforme a imagem:

![Edição dos parâmetros do parameter group criado](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5og0owr96h4fxbs1ywtf.png)

> shared_preload_libraries: pg_stat_statements,pg_cron

## Habilitando a extensão em uma instância

Você pode habilitar a extensão em dois momentos, no momento da criação de uma instância ou em uma já criada. Neste artigo vou mostrar como habilitar em uma instância já criada.

No menu do RDS clique em "Databases"

![Menu do RDS](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cazrd3353pab7wktmb6j.png)

Selecione a instância desejada e clique em "***Modify***", conforme a imagem a seguir:

![Listagem de Instância](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iiryt5iegud67uqhzx8s.png)

Navegue até a opção, ***Additional configuration*** > ***Database options*** > ***DB parameter group*** selecione o `parameter group` criado nos passos anteriores e em seguida salve a modificação

![Additional configuration](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7dsy1nfhr14006575ea6.png)

Feito isso reinicie a instância.

![Listagem de Instância](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xm6f33kp236pxvx4isyy.png)

Pronto!!!! Agora precisamos habilitar a extensão dentro da instância do PostgreSQL.

## Habilitando a extensão no PostgreSQL

Os metadados para pg_cron são todos mantidos no banco de dados padrão PostgreSQL chamado `postgres`. Você pode agendar um trabalho em qualquer um dos seus bancos de dados dentro da instância de banco de dados do PostgreSQL. 

Conecte no banco padrão chamado `postgres` e habilite a extensão `pg_cron` com o seguinte comando:

```sql
CREATE EXTENSION IF NOT EXISTS pg_cron;
```

Feito isso você terá acesso as funções e objetos do `pg_cron`. 

## Realizando agendamentos com a pg_cron

Para agendar um comando existem duas opções:

**1**. Usando a função `cron.schedule`

```sql
SELECT cron.schedule('0 0 * * *', $$DELETE 
    FROM logs
    WHERE end_time < now() – interval '7 days'$$);
``` 
Neste caso você deve alterar o banco de dados com um update, pelo fato que o default é o banco padrão `postgres`

> Você pode usar o https://crontab.guru/ para auxiliar na sintaxe do cron

```sql
UPDATE cron.job SET database = 'database1' WHERE jobid = 1;
```

**2**. Fazendo um insert direto na tabela `cron.job`

```sql
INSERT INTO cron.job (schedule, command, nodename, nodeport, database, username, active,jobname)
    VALUES ('0 0 * * *',$$DELETE 
    FROM logs
    WHERE end_time < now() – interval '7 days'$$, 'localhost', 5432, 'database1','postgres', true, 'clear-log
```
> Você só pode agendar para banco de dados somente dentro da instância, então valor da coluna `nodename` deve ser sempre `localhost`

Para consultar a execução dos agendamentos use:

```sql
SELECT * FROM cron.job_run_details;
```

Para remover um agendamento use: 

```sql
SELECT * FROM cron.job WHERE jobname = 'clear-log';
SELECT cron.unschedule(1);
```

Lembre-se que sempre que precisar realizar manutenção ou verificar o status dos agendamento vocẽ deve sempre conectar no banco padrão `postgres`.

## Referências

Para configurações adicionais consulte a documentação oficial:

https://docs.aws.amazon.com/pt_br/AmazonRDS/latest/UserGuide/PostgreSQL_pg_cron.html

Para detalhes adicionais da extensão:

https://github.com/citusdata/pg_cron 

## Extras

Caso queira testar a extensão `pg_cron` localmente, você pode usar esse `dockerfile` de exemplo https://github.com/renatoassis01/docker-pg-cron