Você pode encerrar uma sessão problemática usando a função pg_terminate_backend.
SELECT pg_terminate_backend(PID);
Identificando consultas demoradas
Antes de encerrar uma sessão no PostgreSQL, você precisa saber qual sessão é o alvo. Para encontrar consultas demoradas, use a view pg_stat_activity e filtre pelas colunas state e query_start.
SELECT pid, usename, state, query, now() - query_start AS duration
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY duration DESC;
Saída esperada:
| pid | usename | state | query | duration |
|---|---|---|---|---|
| 1236 | appuser | active | UPDATE orders SET status=’paid’; | 00:20:34 |
| 1234 | postgres | active | SELECT * FROM users; | 00:05:12 |
Encerrando uma sessão
Depois de identificar a sessão problemática, você pode encerrá-la usando a função pg_terminate_backend.
SELECT pg_terminate_backend(1236);
Este comando encerra à força a conexão com o backend. Ele envia um sinal SIGTERM ao processo e permite que ele termine com segurança, oferecendo uma última chance de fazer a limpeza antes de encerrar. Antes de executar este comando, verifique a natureza das consultas em execução e avalie a saída.
Automatizando o encerramento de sessões
Em ambientes onde problemas com sessões são frequentes, você pode automatizar o encerramento de sessões com um script. Veja um exemplo de script básico para encerrar consultas demoradas:
DO $$
DECLARE
r RECORD;
BEGIN
FOR r IN
SELECT pid
FROM pg_stat_activity
WHERE state = 'active'
AND now() - query_start > interval '10 minutes'
LOOP
PERFORM pg_terminate_backend(r.pid);
END LOOP;
END $$;
Este script encerra qualquer sessão ativa que esteja em execução há mais de 10 minutos.
Usando a função pg_cancel_backend
Às vezes, não é desejável encerrar uma sessão, mas apenas cancelar a consulta que ela está executando. Nesses casos, você pode usar a função pg_cancel_backend.
SELECT pg_cancel_backend(PID);
Substitua PID pelo ID do processo da sessão com a consulta que você quer cancelar.
Este comando envia um SIGINT ao processo para cancelar a consulta. É menos drástico que o pg_terminate_backend e permite que a sessão continue ativa, mesmo com a consulta em execução sendo cancelada.
Lembre-se de que tanto pg_cancel_backend quanto pg_terminate_backend exigem acesso de superusuário. Se a sessão que você está tentando encerrar ou cancelar pertence a um superusuário, você precisará de privilégios de superusuário para executar esses comandos com sucesso.
Conclusão
Agora você sabe como encerrar sessões no PostgreSQL. Gerenciar sessões no PostgreSQL é uma habilidade importante para administradores de banco de dados. Ao identificar e encerrar sessões problemáticas de forma eficaz, você mantém melhor o desempenho e a confiabilidade dos seus bancos de dados PostgreSQL. Use esses comandos com cautela, pois o uso indevido pode interromper etapas importantes de processamento de dados e comprometer a integridade dos seus bancos de dados PostgreSQL.
Outros posts que você pode gostar:
Beekeeper Studio é um cliente de banco de dados gratuito e open source
A melhor ferramenta de consultas e edição de SQL que já usei. Tem tudo o que preciso para gerenciar meu banco de dados. - ⭐⭐⭐⭐⭐ Mit
O Beekeeper Studio é rápido, intuitivo e fácil de usar. Ele suporta vários bancos de dados e funciona muito bem no Windows, Mac e Linux.
O que os usuários dizem sobre o Beekeeper Studio
"O Beekeeper Studio substituiu completamente meu antigo fluxo de trabalho com SQL. É rápido, intuitivo e torna o trabalho com bancos de dados agradável de novo."
"Já testei muitas GUIs de banco de dados, mas o Beekeeper encontra o equilíbrio perfeito entre recursos e simplicidade. Simplesmente funciona."