PostgreSQL: rilascia il database PostgreSQL dalla riga di comando [chiuso]


321

Sto cercando di eliminare il mio database e crearne uno nuovo dalla riga di comando.

Accedo usando psql -U usernamee quindi eseguo un \connect template1, seguito da un DROP DATABASE databasename;.

Ottengo l'errore

database nome database è accessibile da altri utenti

Ho chiuso Apache e riprovato ma sto ancora ricevendo questo errore. Sto facendo qualcosa di sbagliato?


2
Cosa succede se si esegue semplicemente il dropdb databasenamecomando dalla riga di comando?
Dylan Markow,

1
Dice "ERRORE: impossibile eliminare il database attualmente aperto"
iman453,

4
Usa psql -U <user> -c "drop database protodb"(senza nome database)
utente

3
Questo riavvierà Postgres e disconnetterà tutti: sudo service postgresql restart Quindi esegui un: dropdb -h localhost -p 5432 -U "youruser" "testdb" Nota "" per assicurarti che caratteri speciali entrino senza intoppi.
unom,

drop database <dataabase_name>;Non dimenticare la virgola.
Sandip Subedi,

Risposte:


455

È possibile eseguire il comando dropdb dalla riga di comando:

dropdb 'database name'

Nota che devi essere un superutente o il proprietario del database per poterlo eliminare.

Puoi anche controllare la vista pg_stat_activity per vedere quale tipo di attività è attualmente in corso sul tuo database, inclusi tutti i processi inattivi.

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

3
Sto usando il dropusercomando per rimuovere anche l'utente.
Pl1nk,

6
Risposta non utile come per la versione 9. L'errore relativo alle connessioni aperte appare ancora.
Pavel Vlasov,

4
Questo riavvierà Postgres e disconnetterà tutti: sudo service postgresql restart Quindi esegui un: dropdb -h localhost -p 5432 -U "youruser" "testdb" Nota "" per assicurarti che caratteri speciali entrino senza intoppi.
unom,

1
usando l'utente postgres: sudo -u postgres dropdb 'nome database'
leszek.hanusz

\lper vedere tutti i database che hai.
Sandip Subedi,

115

Questo ha funzionato per me:

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

per postgresql precedente alla 9.2 sostituire pidconprocpid

DROP DATABASE "YourDatabase";

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


12
Ho dovuto cambiarlo un po 'per funzionare:select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';
sig.

column "procpid" does not existper amazon RDS postgres 9.6 istanza
anon58192932

Hm. L'ho eseguito, ma si è riconnesso immediatamente, dopo aver detto, "La connessione SSL si è chiusa inaspettatamente [...] durante il tentativo di reimpostazione: riuscita." Annnd, sono tornata.
mlissner,

67

Prova questo. Nota che non è stato specificato alcun database: viene eseguito "sul server"

psql -U postgres -c "drop database databasename"

Se ciò non funziona, ho riscontrato un problema con Postgres che si aggrappava a dichiarazioni preparate orfane.
Per ripulirli, procedere come segue:

SELECT * FROM pg_prepared_xacts;

quindi per ogni ID che vedi, esegui questo:

ROLLBACK PREPARED '<id>';

Mi dispiace, sono nuovo ai database, quindi questa è probabilmente una domanda stupida, ma dove lo scrivo? Prima di accedere al database giusto? E dovrei sostituire databasename con il nome del mio database giusto?
iman453,

@ iman453: lo avresti eseguito direttamente dalla tua shell / riga di comando.
mu è troppo corto il

2
Postgresql non contiene cose come "solo sul server". È necessario connettersi a un database. In questo caso ti collegherai al database postgres che è praticamente lì solo per casi come questo. E un buon punto sulle transazioni preparate, ma in tal caso dovresti ricevere un messaggio di errore che dice che è il problema.
Scott Marlowe,

1
Scusa Bohemian, ma sei tu quello che ha torto. Ecco pg_stat_activity mentre esegui createb dalla riga di comando: postgres = # seleziona * da pg_stat_activity; 11564 | Postgres | 22223 | 16384 | smarlowe | Test CREATE DATABASE; | f | 19-08-2011 16: 18: 26.918933-06 | 19-08-2011 16: 18: 26.918933-06 | 19-08-2011 16: 18: 26.916578-06 | | -1 Si noti che ciò accade durante l'esecuzione di Createdb dalla riga di comando in un altro terminale. Quel primo campo è il db a cui era collegato il mio script creato
Scott Marlowe,

1
Perché questa non è la migliore risposta n. 1?
Henley Chiu,

16

Quando dice che gli utenti sono connessi, cosa fa la query "select * from pg_stat_activity;" dire? Gli altri utenti oltre a te sono ora connessi? In tal caso, potrebbe essere necessario modificare il file pg_hba.conf per rifiutare le connessioni da altri utenti o chiudere qualsiasi app acceda al database pg per poterlo eliminare. Ho questo problema in occasione della produzione. Impostare pg_hba.conf in modo che abbia due righe come questa:

local   all         all                               ident
host    all         all         127.0.0.1/32          reject

e dire a pgsql di ricaricare o riavviare (ovvero sudo /etc/init.d/postgresql reload o pg_ctl reload) e ora l'unico modo per connettersi alla macchina è tramite prese locali. Suppongo che tu sia su Linux. In caso contrario, potrebbe essere necessario modificare qualcosa di diverso da local / ident su quella prima riga, a qualcosa come host ... il tuo nome utente.

Ora dovresti essere in grado di fare:

psql postgres
drop database mydatabase;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.