PostgreSQL: Löschen Sie die PostgreSQL-Datenbank über die Befehlszeile [geschlossen]

321

Ich versuche, meine Datenbank zu löschen und über die Befehlszeile eine neue zu erstellen.

Ich melde mich mit an psql -U usernameund mache dann a \connect template1, gefolgt von a DROP DATABASE databasename;.

Ich bekomme den Fehler

Datenbank Datenbankname wird von anderen Benutzern aufgerufen

Ich habe Apache heruntergefahren und es erneut versucht, aber ich erhalte immer noch diesen Fehler. Mache ich etwas falsch?

iman453
quelle
2
Was passiert, wenn Sie den dropdb databasenameBefehl nur über die Befehlszeile ausführen ?
Dylan Markow
1
Es heißt "FEHLER: Die aktuell geöffnete Datenbank kann nicht
gelöscht
4
Verwendung psql -U <user> -c "drop database protodb"(ohne Datenbanknamen)
Benutzer
3
Dadurch wird postgres neu gestartet und alle werden getrennt: sudo service postgresql restart Führen Sie dann Folgendes aus: dropdb -h localhost -p 5432 -U "youruser" "testdb" Beachten Sie das "", um sicherzustellen, dass Sonderzeichen problemlos eingegeben werden.
Unom
drop database <dataabase_name>;Vergiss das Komma nicht.
Sandip Subedi

Antworten:

455

Sie können den Befehl dropdb über die Befehlszeile ausführen :

dropdb 'database name'

Beachten Sie, dass Sie ein Superuser oder der Datenbankeigentümer sein müssen, um ihn löschen zu können.

Sie können auch in der Ansicht pg_stat_activity überprüfen, welche Art von Aktivität derzeit für Ihre Datenbank ausgeführt wird, einschließlich aller inaktiven Prozesse.

SELECT * FROM pg_stat_activity WHERE datname='database name';
csano
quelle
3
Ich benutze den dropuserBefehl, um auch den Benutzer zu entfernen.
Pl1nk
6
Keine hilfreiche Antwort wie für Version 9. Der Fehler bei geöffneten Verbindungen wird weiterhin angezeigt.
Pavel Vlasov
4
Dadurch wird postgres neu gestartet und alle werden getrennt: sudo service postgresql restart Führen Sie dann Folgendes aus: dropdb -h localhost -p 5432 -U "youruser" "testdb" Beachten Sie das "", um sicherzustellen, dass Sonderzeichen problemlos eingegeben werden.
Unom
1
Verwenden des Postgres-Benutzers: sudo -u postgres dropdb 'Datenbankname'
leszek.hanusz
\lum alle Datenbanken zu sehen, die Sie haben.
Sandip Subedi
115

Das hat bei mir funktioniert:

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

für postgresql vor 9.2 ersetzen piddurchprocpid

DROP DATABASE "YourDatabase";

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

Eugene
quelle
12
Musste es ein wenig ändern, um zu arbeiten:select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';
mrt
column "procpid" does not existfür Amazon RDS Postgres 9.6 Instanz
anon58192932
Hm. Dies wurde ausgeführt, aber die Verbindung wurde sofort wieder hergestellt, nachdem gesagt wurde: "Die SSL-Verbindung wurde unerwartet [...] beim Zurücksetzen geschlossen: Erfolgreich." Annnd, ich bin zurück.
mlissner
67

Versuche dies. Beachten Sie, dass keine Datenbank angegeben ist - sie wird nur "auf dem Server" ausgeführt.

psql -U postgres -c "drop database databasename"

Wenn das nicht funktioniert, habe ich ein Problem mit Postgres gesehen, die an verwaisten vorbereiteten Aussagen festhalten.
Gehen Sie folgendermaßen vor, um sie zu bereinigen:

SELECT * FROM pg_prepared_xacts;

Führen Sie dann für jede ID, die Sie sehen, Folgendes aus:

ROLLBACK PREPARED '<id>';
Böhmisch
quelle
Es tut mir leid, dass ich neu in Datenbanken bin. Das ist wahrscheinlich eine dumme Frage, aber wo schreibe ich das aus? Vor dem Anmelden in der Datenbank richtig? Und ich sollte den Datenbanknamen durch den Namen meiner Datenbank ersetzen, oder?
Iman453
@ iman453: Du würdest das direkt von deiner Shell / Kommandozeile aus ausführen.
Mu ist zu kurz
2
Es gibt keine "nur auf dem Server" für postgresql. Sie müssen eine Verbindung zu einer Datenbank herstellen. In diesem Fall stellen Sie eine Verbindung zur Postgres-Datenbank her, die nur für solche Fälle verfügbar ist. Und ein guter Punkt für vorbereitete Transaktionen, aber in diesem Fall sollten Sie eine Fehlermeldung erhalten, die besagt, dass dies das Problem ist.
Scott Marlowe
1
Sorry Bohemian, aber du bist derjenige, der sich irrt. Hier ist pg_stat_activity beim Ausführen von createdb über die Befehlszeile: postgres = # select * from pg_stat_activity; 11564 | postgres | 22223 | 16384 | smarlowe | CREATE DATABASE-Test; | 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 Beachten Sie, dass dies geschieht, während createdb über die Befehlszeile in einem anderen Terminal ausgeführt wird. Dieses erste Feld ist die Datenbank, mit der mein erstelltes Skript verbunden war
Scott Marlowe
1
Warum ist das nicht die beste Antwort?
Henley Chiu
16

Wenn die Meldung lautet, dass Benutzer verbunden sind, was bedeutet die Abfrage "select * from pg_stat_activity"; sagen? Sind die anderen Benutzer außer Ihnen jetzt verbunden? In diesem Fall müssen Sie möglicherweise Ihre Datei pg_hba.conf bearbeiten, um Verbindungen von anderen Benutzern abzulehnen, oder die App herunterfahren, die auf die pg-Datenbank zugreift, um sie löschen zu können. Ich habe dieses Problem gelegentlich in der Produktion. Stellen Sie pg_hba.conf so ein, dass es zwei Zeilen wie folgt enthält:

local   all         all                               ident
host    all         all         127.0.0.1/32          reject

und weisen Sie pgsql an, neu zu laden oder neu zu starten (dh entweder sudo /etc/init.d/postgresql reload oder pg_ctl reload). Jetzt können Sie nur noch über lokale Sockets eine Verbindung zu Ihrem Computer herstellen. Ich gehe davon aus, dass Sie unter Linux sind. Wenn nicht, muss dies möglicherweise an etwas anderem als local / ident in dieser ersten Zeile angepasst werden, an etwas wie host ... yourusername.

Jetzt sollten Sie in der Lage sein:

psql postgres
drop database mydatabase;
Scott Marlowe
quelle