PostgreSQL: Solte o banco de dados PostgreSQL através da linha de comando [fechada]


321

Estou tentando soltar meu banco de dados e criar um novo pela linha de comando.

Efetuo login usando psql -U usernamee, em seguida, faço a \connect template1, seguido de a DROP DATABASE databasename;.

Eu recebo o erro

nome do banco de dados do banco de dados está sendo acessado por outros usuários

Desliguei o Apache e tentei novamente, mas ainda estou recebendo esse erro. Estou fazendo algo errado?


2
O que acontece se você acabou de executar o dropdb databasenamecomando na linha de comando?
Dylan Markow

1
Diz: "ERRO: Não é possível descartar o banco de dados aberto no momento"
iman453

4
Use psql -U <user> -c "drop database protodb"(sem nome do banco de dados)
user

3
Isso reiniciará o postgres e desconectará todos: sudo service postgresql restart Em seguida, execute um: dropdb -h localhost -p 5432 -U "youruser" "testdb" Observe o "" para garantir que caracteres especiais sejam inseridos sem problemas.
Unom

drop database <dataabase_name>;Não esqueça a vírgula.
precisa saber é o seguinte

Respostas:


455

Você pode executar o comando dropdb na linha de comando:

dropdb 'database name'

Observe que você precisa ser um superusuário ou o proprietário do banco de dados para poder eliminá-lo.

Você também pode verificar a visualização pg_stat_activity para ver que tipo de atividade está ocorrendo atualmente no seu banco de dados, incluindo todos os processos inativos.

SELECT * FROM pg_stat_activity WHERE datname='database name';

3
Estou usando o dropusercomando para remover também o usuário.
precisa saber é o seguinte

6
Resposta não útil como na versão 9. O erro sobre conexões abertas ainda aparece.
Pavel Vlasov

4
Isso reiniciará o postgres e desconectará todos: sudo service postgresql restart Em seguida, execute um: dropdb -h localhost -p 5432 -U "youruser" "testdb" Observe o "" para garantir que caracteres especiais sejam inseridos sem problemas.
Unom

1
usando o usuário do postgres: sudo -u postgres dropdb 'database name'
leszek.hanusz

\lpara ver todos os bancos de dados que você possui.
precisa saber é o seguinte

115

Isso funcionou para mim:

select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';

para o postgresql anterior à 9.2, substitua pidporprocpid

DROP DATABASE "YourDatabase";

http://blog.gahooa.com/2010/11/03/how-to-force-drop-a-postgresql-database-by-killing-off-connection-processes/


12
Teve que mudar um pouco ao trabalho:select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';
MRT

column "procpid" does not existinstância do amazon RDS postgres 9.6
anon58192932

Hum. Executou isso, mas acabou de se reconectar imediatamente, depois de dizer: "A conexão SSL foi fechada inesperadamente [...] tentando redefinir: Sucedido." Annnd, estou de volta.
mlissner

67

Tente isso. Observe que não há banco de dados especificado - ele apenas roda "no servidor"

psql -U postgres -c "drop database databasename"

Se isso não funcionar, vi um problema com o postgres segurando declarações preparadas órfãs.
Para limpá-los, faça o seguinte:

SELECT * FROM pg_prepared_xacts;

então, para cada ID que você vê, execute o seguinte:

ROLLBACK PREPARED '<id>';

Desculpe, eu sou novo nos bancos de dados, então essa provavelmente é uma pergunta estúpida, mas onde digito isso? Antes de fazer login no banco de dados, certo? E devo substituir databasename pelo nome do meu banco de dados, certo?
precisa saber é o seguinte

@ iman453: Você executaria isso diretamente do seu shell / linha de comando.
mu é muito curto

2
Não existem coisas como "apenas no servidor" para o postgresql. Você deve se conectar a um banco de dados. Nesse caso, você estará se conectando ao banco de dados do postgres, que está praticamente lá apenas para casos como este. E um bom argumento sobre transações preparadas, mas nesse caso você deve receber uma mensagem de erro informando que esse é o problema.
Scott Marlowe

1
Desculpe Bohemian, mas você é quem está errado. Aqui está pg_stat_activity durante a execução de createdb na linha de comando: postgres = # select * from pg_stat_activity; 11564 postgres | 22223 16384 smarlowe | Teste CREATE DATABASE; | f 2011-08-19 16: 18: 26.918933-06 | 2011-08-19 16: 18: 26.918933-06 | 2011-08-19 16: 18: 26.916578-06 | | -1 Observe que isso acontece durante a execução do createdb a partir da linha de comando em outro terminal. Esse primeiro campo é o banco de dados ao qual meu script createdb foi conectado #
Scott Marlowe

1
Por que não é a resposta número 1 no topo?
Henley Chiu

16

Quando diz que os usuários estão conectados, o que a consulta "seleciona * em pg_stat_activity;" dizer? Os outros usuários além de você agora estão conectados? Nesse caso, talvez seja necessário editar seu arquivo pg_hba.conf para rejeitar conexões de outros usuários ou desligar qualquer aplicativo que esteja acessando o banco de dados pg para poder eliminá-lo. Ocasionalmente, tenho esse problema na produção. Defina pg_hba.conf para ter duas linhas como esta:

local   all         all                               ident
host    all         all         127.0.0.1/32          reject

e diga ao pgsql para recarregar ou reiniciar (por exemplo, sudo /etc/init.d/postgresql reload ou pg_ctl reload) e agora a única maneira de conectar-se à sua máquina é através de soquetes locais. Estou assumindo que você está no Linux. Caso contrário, isso pode precisar ser ajustado para algo diferente de local / ident nessa primeira linha, para algo como host ... yourusername.

Agora você deve ser capaz de:

psql postgres
drop database mydatabase;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.