Eu preciso remover um banco de dados de um cluster de banco de dados PostgreSQL. Como posso fazer isso mesmo se houver conexões ativas? Eu preciso de uma espécie de -force
sinalizador, que derrubará todas as conexões e, em seguida, o banco de dados.
Como posso implementá-lo?
Estou usando dropdb
atualmente, mas outras ferramentas são possíveis.
PostgreSQL 13 adicionado:
O manual:
No PostgreSQL 12 e versões anteriores , você não pode descartar um banco de dados enquanto os clientes estiverem conectados a ele.
Pelo menos, não com o
dropdb
utilitário - que é apenas um wrapper simples em torno daDROP DATABASE
consulta do servidor.A solução alternativa bastante robusta segue:
Conecte-se ao seu servidor como superusuário , usando
psql
ou outro cliente. Não use o banco de dados que deseja eliminar.Agora, usando o cliente de banco de dados simples, você pode forçar o descarte do banco de dados usando três etapas simples:
Certifique-se de que ninguém possa se conectar a este banco de dados. Você pode usar um dos seguintes métodos (o segundo parece mais seguro, mas não impede conexões de superusuários).
Força a desconexão de todos os clientes conectados a este banco de dados, usando
pg_terminate_backend
.Solte o banco de dados.
A etapa 1 requer privilégios de superusuário para o primeiro método e privilégios de proprietário do banco de dados para o segundo. A etapa 2 requer privilégios de superusuário . A etapa 3 requer privilégio de proprietário do banco de dados.
O Postgres 13 adiciona a
FORCE
opção para arquivosDROP DATABASE
. Veja a resposta de filiprem .O utilitário shell
dropdb
é basicamente apenas um wrapper em torno do comando SQL e herda a mesma opção. Portanto, agora também é simples e confiável do shell:Ou curta:
Para Postgres 12 e anteriores , existe uma maneira com os utilitários shell
dropdb
&pg_ctl
(oupg_ctlcluster
no Debian e derivados) também. Mas o método do filiprem é superior por vários motivos:dropdb
comando.eu cito
man pg_ctlcluster
:ou
ou
imediatamente seguido por:
Possivelmente em um roteiro para sucessão imediata.
Usando a resposta do @filiprem no meu caso e simplificando:
Para aqueles que encontram esta pergunta agora, 8 anos depois, o PostgreSQL 13 finalmente adiciona o
--force
sinalizador que esta pergunta pede:DROP DATABASE database_to_drop WITH (FORCE)
ou
dropdb [-f/--force] database_to_drop
vai
https://www.postgresql.org/docs/13/sql-dropdatabase.html
Usando a resposta de @Dorian , corrigida e aprimorada:
Se você estiver em algo como o RDS, onde as conexões sem um banco de dados selecionado o colocam no banco de dados que você pediu para ser criado por padrão, você pode fazer essa variante para evitar ser a última conexão aberta.