Como descartar todas as conexões com um banco de dados específico sem parar o servidor?

45

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?

sorin
fonte
Li em algum lugar que você poderia usar o lowth.com/cutter para conseguir isso.

Respostas:

22

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_activitycom 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');
jb.
fonte
8
ERRO: falta da entrada da cláusula FROM para a tabela "pg_stat_activity" (psql (9.6.1))
user1767316
4
isso não funciona mais .... obter o erro acima ^
leve
Veja resposta abaixo por Szymon Guz
Dfranc3373
Faltando cláusula, não funciona
Vipul
78

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';

pidcostumava 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 PUBLICou algo semelhante e GRANTdepois.

Paul White diz que a GoFundMonica
fonte
3

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.

Trygve Laugstøl
fonte