Eu quero descartar todas as conexões (sessões) atualmente abertas em um banco de dados PostgreSQL específico, mas sem reiniciar o servidor ou desconectar as conexões com outros bancos de dados.
Como eu posso fazer isso?
Eu quero descartar todas as conexões (sessões) atualmente abertas em um banco de dados PostgreSQL específico, mas sem reiniciar o servidor ou desconectar as conexões com outros bancos de dados.
Como eu posso fazer isso?
Respostas:
Aqui está a minha resposta para uma pergunta muito semelhante no StackOverflow.
Dependendo da sua versão do postgresql, você pode encontrar um erro, o que faz pg_stat_activity
com que você omita conexões ativas de usuários descartados. Essas conexões também não são mostradas no pgAdminIII.
Se você estiver realizando testes automáticos (nos quais também cria usuários), esse pode ser um cenário provável.
Nesse caso, você precisa reverter para consultas como:
SELECT pg_terminate_backend(pg_stat_activity.procpid)
FROM pg_stat_get_activity(NULL::integer)
WHERE datid=(SELECT oid from pg_database where datname = 'your_database');
A consulta como essa deve ajudar (assumindo que o banco de dados seja denominado 'db'):
select pg_terminate_backend(pid) from pg_stat_activity where datname='db';
pid
costumava ser chamado procpid
, portanto, se você estiver usando uma versão do postgres anterior à 9.2, tente o seguinte:
select pg_terminate_backend(procpid) from pg_stat_activity where datname='db';
No entanto, você precisa ser um superusuário para desconectar outros usuários.
Também pode ser útil REVOKE CONNECT ON DATABASE FROM PUBLIC
ou algo semelhante e GRANT
depois.
Isso pode ser usado para "liberar" um banco de dados das conexões do cliente, para que você, por exemplo, possa renomeá-lo:
SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname='current_db';
ALTER DATABASE current_db RENAME TO old_db;
ALTER DATABASE new_db RENAME TO current_db;
Esteja ciente de que isso pode causar comportamento problemático aos seus aplicativos clientes. Os dados atualmente não devem ser interrompidos devido ao uso de transações.