Eu preciso escrever um script que irá soltar um banco de dados PostgreSQL. Pode haver muitas conexões, mas o script deve ignorar isso.
A DROP DATABASE db_name
consulta padrão não funciona quando há conexões abertas.
Como posso resolver o problema?
postgresql
Roman Prykhodchenko
fonte
fonte
Respostas:
Isso eliminará as conexões existentes, exceto a sua:
Consulte
pg_stat_activity
e obtenha os valores pid que você deseja matar e emitaSELECT pg_terminate_backend(pid int)
-os.PostgreSQL 9.2 e superior:
PostgreSQL 9.1 e abaixo:
Depois de desconectar todos, será necessário desconectar e emitir o comando DROP DATABASE a partir de uma conexão de outro banco de dados, também conhecido como aquele que você não deseja soltar.
Observe a renomeação da
procpid
coluna parapid
. Veja esta lista de discussão .fonte
; drop database TARGET_DB;
funcionou bem no meu caso para garantir que o banco de dados estivesse ausente no momento em que as coisas começaram a tentar novamente.dropdb --force
.No PostgreSQL 9.2 e superior, para desconectar tudo, exceto a sua sessão, do banco de dados ao qual você está conectado:
Nas versões anteriores é o mesmo, basta mudar
pid
paraprocpid
. Para desconectar-se de um banco de dados diferente, mudecurrent_database()
para o nome do banco de dados do qual você deseja desconectar os usuários.Você pode querer
REVOKE
oCONNECT
direito dos usuários do banco de dados antes de desconectá-los, caso contrário, os usuários continuarão se reconectando e você nunca terá a chance de descartar o banco de dados. Veja este comentário e a pergunta à qual está associado: Como desanexo todos os outros usuários do banco de dados .Se você deseja apenas desconectar usuários ociosos, consulte esta pergunta .
fonte
Você pode matar todas as conexões antes de descartar o banco de dados usando a
pg_terminate_backend(int)
funçãoVocê pode obter todos os back-ends em execução usando a visualização do sistema
pg_stat_activity
Não tenho certeza, mas o seguinte provavelmente mataria todas as sessões:
Claro que você pode não estar conectado a esse banco de dados
fonte
Dependendo da sua versão do postgresql, você pode encontrar um bug, 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:
NOTA: No 9.2+, você terá que mudar
procpid
parapid
.fonte
procpid
parapid
esse snippet, funciona na 9.3.Notei que o postgres 9.2 agora chama a coluna pid ao invés de procpid.
Eu costumo chamá-lo da casca:
Espero que seja útil. Obrigado a @JustBob pelo sql.
fonte
Acabei de reiniciar o serviço no Ubuntu para desconectar os clientes conectados.
fonte
No prompt de comando do Linux, eu pararia primeiro todos os processos postgresql em execução, vinculando este comando sudo /etc/init.d/postgresql restart
digite o comando bg para verificar se outros processos postgresql ainda estão em execução
seguido por dropdb dbname para descartar o banco de dados
Isso funciona para mim no prompt de comando linux
fonte
PostgreSQL 9.2 e superior:
SELECT pg_terminate_backend(pid)FROM pg_stat_activity WHERE datname = 'YOUR_DATABASE_NAME_HERE'
fonte
Aqui está o meu hack ... = D
Eu coloquei esta resposta porque inclui um comando (acima) para bloquear novas conexões e porque qualquer tentativa com o comando ...
... não funciona para bloquear novas conexões!
Obrigado a @araqnid @GoatWalker! = D
https://stackoverflow.com/a/3185413/3223785
fonte
O próximo PostgreSQL 13 apresentará a
FORCE
opção.fonte
No meu caso, tive que executar um comando para descartar todas as conexões, incluindo minha conexão de administrador ativo
que finalizou todas as conexões e mostra uma mensagem fatal de '' erro '':
FATAL: terminating connection due to administrator command SQL state: 57P01
Depois disso, foi possível descartar o banco de dados
fonte
Nada funcionou para mim, exceto, eu entrei no pgAdmin4 e, no painel, desconectei todas as conexões, exceto o pgAdmin4, e fui capaz de renomear com o botão direito do mouse no banco de dados e nas propriedades e digitei o novo nome.
fonte