Estou usando o Heroku com a opção Crane Postgres e estava executando uma consulta no banco de dados de minha máquina local quando minha máquina local travou. Se eu correr
select * from pg_stat_activity
uma das entradas tem
<IDLE> in transaction
na coluna current_query_text.
Como resultado, não posso descartar a tabela que estava sendo gravada pela consulta que foi encerrada. Tentei usar pg_cancel_backend (N) e ele retorna True, mas nada parece acontecer.
Como posso encerrar este processo para poder largar a mesa?
postgresql
heroku
alan
fonte
fonte
Respostas:
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:
(A consulta pode precisar de conserto dependendo da versão do postgres - eventualmente, basta selecionar * em pg_stat_activity). Você encontrará o pid na primeira coluna (à esquerda) e a primeira linha (superior) provavelmente será a consulta que você gostaria de encerrar. Vou assumir que o pid é 1234 abaixo.
Você pode cancelar uma consulta por meio de SQL (ou seja, sem acesso shell), desde que seja sua ou tenha acesso de superusuário:
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:
Se você tiver acesso ao shell e permissões de root ou postgres, também poderá fazer isso no shell. Para "cancelar", pode-se fazer:
e para "encerrar", simplesmente:
NÃO:
... isso freqüentemente resultará em todo o servidor postgres caindo em chamas, então você 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 :-)
Uma "transação ociosa" 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á cheio de bugs ou não foi projetado corretamente para funcionar com bancos de dados transacionais. Deve-se evitar "ociosidade na transação" de longa duração, pois isso também pode causar grandes problemas de desempenho.
fonte
select version()
. Você recebe alguma mensagem de erro ao usarpg_cancel_backend
?Experimente isto:
Mais sobre isso você pode encontrar aqui . Esta deve ser uma solução 'mais limpa' para este problema do que eliminar processo por sistema.
fonte
Você pode instalar o
heroku-pg-extras
add-on e executar o seguinte comando para obter o PID:Depois é só fazer:
NOTA : a
--force
opção pode ser usada para emitir pg_terminate_backend que interrompe a conexão inteira para essa consulta.Se
heroku pg:locks
não listar nada, tenteheroku pg:ps
.Para mais informações, acesse:
https://devcenter.heroku.com/articles/heroku-postgresql#pg-ps-pg-kill-pg-killall
fonte
Podemos usar o seguinte para alcançá-lo em uma única consulta:
fonte
SELECT pid, pg_cancel_backend(pid) FROM pg_stat_activity WHERE state != 'idle' AND (now() - query_start) > interval '5 minutes';