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

Cliente Postgres travando ao criar uma nova tabela


Se reiniciar o postgres for uma opção, isso provavelmente resolverá o problema e evitará que você gaste tempo lendo o restante desta resposta :-)

Verifique o pg_stat_activity view, provavelmente há alguma outra transação bloqueando a alteração do esquema.
select * from pg_stat_activity 
where 
wait_event_type is NULL and xact_start is not NULL order by xact_start;

(o pg_stat_activity é um pouco alterado em todas as versões principais do pg, tente isso para versões mais antigas):
select * from pg_stat_activity 
where 
not waiting and xact_start is not NULL order by xact_start;

A primeira linha a aparecer é provavelmente a que causa problemas. Muitas vezes, é uma "ociosidade na transação" - isso pode muito bem manter bloqueios e, se for uma transação antiga, também pode matar o desempenho. Provavelmente o programador esqueceu de garantir o término da transação com "commit" ou "rollback", ou talvez alguma sessão de banco de dados tenha travado devido a problemas de rede.

Para encerrar a transação com pid 1234, use select pg_cancel_backend(1234); , se isso falhar, select pg_terminate_backend(1234) . Com acesso ao shell, os comandos equivalentes são kill -INT 1234 e kill 1234 . (lembre-se, kill -9 1234 é uma péssima ideia).

Há também uma visão pg_locks o que pode dar algumas dicas, embora provavelmente não seja tão fácil obter informações úteis a partir dele. Se granted for verdadeiro, o bloqueio é mantido, quando granted for false significa que a consulta está aguardando o bloqueio. Aqui estão mais algumas dicas sobre como extrair informações úteis do pg_locks:http://wiki.postgresql. org/wiki/Lock_Monitoring

Se tudo mais falhar, provavelmente é hora de ir para a solução simples, reinicie o servidor de banco de dados.