Todo mundo quer saber dos problemas antes do servidor cair ou ferrar a vida dos usuários, né? O PostgreSQL tem umas paradas maneiras pra criar notificações e agendar tarefas: pg_notify e pg_cron. Basicamente, é tipo nosso despertador e agenda pessoal pro banco de dados.
Imagina a cena: você tem um banco de dados de um curso de câmbio, e do nada um processo trava os outros. Ao invés de ficar checando o banco toda hora na mão, dá pra configurar alertas pra ficar ligado. E pra checar o estado do banco de tempos em tempos, entra o pg_cron. Bora ver como faz isso na prática.
Notificações rápidas do banco: pg_notify
Vamos começar pelo pg_notify. É uma função nativa do PostgreSQL que deixa você mandar uma notificação do banco pra um "canal" específico. Dá pra usar pra avisar sobre eventos tipo query demorada, bloqueio detectado ou qualquer situação fora do normal.
A sintaxe do pg_notify é bem tranquila:
NOTIFY <canal>, <mensagem>;
canal— nome do canal pra onde vai a notificação.mensagem— string com o texto da notificação.
Vamos ver um exemplo de uso do pg_notify. Bora criar uma notificação pra quando rolar um bloqueio:
DO $$
BEGIN
IF EXISTS (
SELECT 1
FROM pg_locks l
JOIN pg_stat_activity a
ON l.pid = a.pid
WHERE NOT l.granted
) THEN
PERFORM pg_notify('alerts', 'Bloqueio no banco de dados!');
END IF;
END $$;
Esse código checa se tem algum bloqueio pendente e manda uma notificação pro canal alerts.
Pra escutar as notificações, usa o comando LISTEN em outra conexão:
LISTEN alerts;
Agora, se o pg_notify mandar mensagem pro canal alerts, você vê a notificação no console.
Exemplo:
NOTIFY alerts, 'Ei, tem bloqueio aqui!';
Na outra conexão, onde rolou o LISTEN alerts, você recebe na hora:
NOTIFY: Ei, tem bloqueio aqui!
O uso do pg_notify não fica só nessas notificações simples. Dá pra ligar ele com triggers pra avisar automaticamente quando dados são inseridos, alterados ou deletados:
Notificação sobre novos registros
CREATE OR REPLACE FUNCTION notify_new_record()
RETURNS trigger AS $$
BEGIN
PERFORM pg_notify('table_changes', 'Novo registro adicionado na tabela!');
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER record_added
AFTER INSERT ON your_table
FOR EACH ROW EXECUTE FUNCTION notify_new_record();
Agora, sempre que entrar um registro novo na tabela your_table, você recebe a notificação na hora.
Você vai aprender mais sobre triggers e funções nativas daqui a pouco, relaxa :P
Erros comuns e como evitar
Se você tá usando LISTEN mas não vê as notificações, confere aí:
- Se tá na mesma conexão de onde as notificações são enviadas.
- Se o canal tá escrito certinho.
- Se você chamou o
pg_notifydentro de uma transação que foi commitada (COMMIT).
Agendador de tarefas no PostgreSQL: pg_cron
pg_cron é uma extensão do PostgreSQL que deixa você agendar tarefas, igual o cron clássico do Linux. Por exemplo, dá pra rodar checagem de bloqueios ou coletar estatísticas de tempos em tempos.
Criando tarefas com pg_cron
Agora que o pg_cron tá instalado e pronto, bora criar uma tarefa que limpa registros antigos da tabela logs todo dia.
SELECT cron.schedule('Remover logs antigos',
'0 0 * * *',
$$ DELETE FROM logs WHERE created_at < NOW() - INTERVAL '30 days' $$);
O que tá rolando aqui:
'0 0 * * *'— horário da tarefa (todo dia à meia-noite).DELETE FROM logs ...— query SQL que o cron vai rodar.
Vendo as tarefas
Pra ver todas as tarefas agendadas com pg_cron, usa:
SELECT * FROM cron.job;
Desativando tarefas
Pra desligar uma tarefa:
SELECT cron.unschedule(jobid);
Onde jobid é o ID da tarefa. Você acha ele na tabela cron.job.
Exemplos úteis com pg_cron
Checagem regular de queries ativas
Bora criar uma tarefa que a cada 5 minutos checa queries que tão rodando faz tempo:
SELECT cron.schedule('Checar queries demoradas',
'*/5 * * * *',
$$ SELECT pid, query, state
FROM pg_stat_activity
WHERE state = 'active'
AND now() - query_start > INTERVAL '5 minutes' $$);
Essa tarefa procura queries que tão rodando há mais de 5 minutos.
Integração com sistemas externos
Tanto o pg_notify quanto o pg_cron podem ser integrados com sistemas externos tipo Slack, Telegram ou ferramentas de monitoramento (tipo Prometheus).
Telegram
Dá pra juntar o pg_notify com um bot do Telegram pra mandar notificações. A ideia é fazer um script em Python ou outra linguagem que escuta as notificações e manda pro Telegram.
Exemplo de um bot Python simples:
import psycopg2
import telegram
# Conectando ao PostgreSQL
conn = psycopg2.connect("dbname=your_database user=your_user")
# Criando o bot do Telegram
bot = telegram.Bot(token='your_telegram_bot_token')
# Abrindo cursor pra escutar
conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
cur = conn.cursor()
cur.execute("LISTEN alerts;")
# Escutando notificações
print("Escutando notificações...")
while True:
conn.poll()
while conn.notifies:
notify = conn.notifies.pop()
print("Notificação recebida:", notify.payload)
bot.send_message(chat_id='your_chat_id', text=notify.payload)
Agora seu bot vai receber as notificações enviadas pelo pg_notify.
Quando usar pg_notify e pg_cron?
Use pg_notify pra reações instantâneas (tipo avisar o admin de bloqueios).
Use pg_cron pra tarefas regulares (checagem de queries, limpeza de dados antigos).
Dicas e pegadinhas
pg_notify manda as notificações na hora, mas não guarda histórico. Melhor integrar com logs em arquivo ou sistemas externos.
pg_cron pode causar carga inesperada se as tarefas rodarem demais. Sempre testa as queries antes de botar no cron.
Agora você tá pronto pra otimizar seu monitoramento e automatizar o controle do banco. Bora configurar os alertas e virar não só um programador SQL, mas um DBA de respeito!
GO TO FULL VERSION