PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Encerrar consulta suspensa (ocioso na transação)


Esta é uma resposta geral do Postgres, e não específica para heroku

(A resposta simples e estúpida para esta pergunta pode ser ... apenas reinicie o postgresql. Supondo que isso não seja desejável ou não seja uma opção ...)

Encontre o PID executando este sql:
SELECT pid , query, * from pg_stat_activity
  WHERE state != 'idle' ORDER BY xact_start;

(A consulta pode precisar de reparo dependendo da versão do postgres - eventualmente, basta selecionar * de pg_stat_activity). Você encontrará o pid na primeira coluna (esquerda) e a primeira linha (superior) provavelmente será a consulta que você deseja encerrar. Vou assumir que o pid é 1234 abaixo.

Você pode cancelar uma consulta por meio do SQL (ou seja, sem acesso ao shell) desde que seja sua ou tenha acesso de superusuário:
select pg_cancel_backend(1234);

Essa é uma solicitação "amigável" para cancelar a consulta 1234 e, com alguma sorte, ela desaparecerá depois de um tempo. Eventualmente, isso é mais eficiente:
select pg_terminate_backend(1234);

Se você tiver acesso ao shell e permissões de root ou postgres, também poderá fazê-lo a partir do shell. Para "cancelar" pode-se fazer:
kill -INT 1234

e para "encerrar", simplesmente:
kill 1234

NÃO:
kill -9 1234

... que muitas vezes resultará em todo o servidor postgres em chamas, então você também pode reiniciar o postgres. Postgres é bastante robusto, então os dados não serão corrompidos, mas eu recomendo não usar "kill -9" em qualquer caso :-)

Um "inativo na transação" de longa duração geralmente significa que a transação não foi encerrada com um "commit" ou um "rollback", o que significa que o aplicativo está com bugs ou não foi projetado adequadamente para funcionar com bancos de dados transacionais. A "inatividade na transação" de longa duração deve ser evitada, pois também pode causar grandes problemas de desempenho.