PostgreSQL - Datenbank umbenennen

126

Ich muss die Datenbank umbenennen, aber als ich PGAdmin : ALTER DATABASE "databaseName" RENAME TO "databaseNameOld"darin war, sagte mir, dass dies nicht möglich ist.

Wie kann ich es tun?

( Version 8.3 unter Windows XP )

Aktualisieren

  • Die erste Fehlermeldung: Kann nicht, weil ich eine Verbindung hergestellt habe. Also habe ich eine andere Datenbank ausgewählt und die Abfragen durchgeführt.

  • Ich erhalte eine zweite Fehlermeldung, die mich darüber informiert, dass eine Benutzerverbindung hergestellt wurde. Ich sehe auf dem PGAdminBildschirm, dass es viele gibt, PIDaber sie sind inaktiv ... Ich sehe nicht, wie man sie tötet.

Patrick Desjardins
quelle
1
Sie könnten erläutern, warum dies nicht möglich ist. Ich habe es gerade gemacht (auf einer anderen Plattform) und es hat funktioniert
Vinko Vrsalovic
1
Was ist die genaue Fehlermeldung und haben Sie diesen Fehler in den Postgres-Dokumenten nachgeschlagen? Vielleicht gibt es einen perfekten Grund für dieses Verhalten. Normalerweise sollte das Umbenennen funktionieren.
vorhanden
Aktualisiert siehe die Frage
Patrick Desjardins
Warum nicht einfach die Datenbank neu starten?
vorhanden
Was ist die genaue Fehlermeldung und haben Sie diesen Fehler in den Postgres-Dokumenten nachgeschlagen? Vielleicht gibt es einen perfekten Grund für dieses Verhalten. Normalerweise sollte das Umbenennen funktionieren. Wenn Sie Probleme mit ausstehenden oder toten Verbindungen haben, starten Sie die Datenbank einfach neu, um sie zu entfernen.
vorhanden

Antworten:

189

Versuchen Sie, den Datenbanknamen nicht anzugeben:

ALTER DATABASE people RENAME TO customers;

Stellen Sie außerdem sicher, dass zu diesem Zeitpunkt keine anderen Clients mit der Datenbank verbunden sind. Versuchen Sie zum Schluss, die zurückgegebene Fehlermeldung zu veröffentlichen, damit wir ein bisschen mehr Informationen erhalten.

bmdhacks
quelle
18
Anführungszeichen sind erforderlich, wenn der Name einen Großbuchstaben enthält.
Patrick Desjardins
7
Dies ist nicht der Fall, aber ein Anführungszeichen ist auch erforderlich, wenn der Name ein .oder hat @.
Omar
6
Ein Zitat ist auch erforderlich, wenn der Name eine-
GreenTurtle
Die obigen Vorschläge lassen mich denken, dass es besser ist, Tabellennamen auf Kleinbuchstaben zu beschränken und wenn möglich zu unterstreichen !
Aswin Sanakan
Ein Zitat ist auch erforderlich, wenn der Name Leerzeichen enthält
Loaderon
86

Zum späteren Nachschlagen sollten Sie in der Lage sein:

-- disconnect from the database to be renamed
\c postgres

-- force disconnect all other clients from the database to be renamed
SELECT pg_terminate_backend( pid )
FROM pg_stat_activity
WHERE pid <> pg_backend_pid( )
    AND datname = 'name of database';

-- rename the database (it should now have zero clients)
ALTER DATABASE "name of database" RENAME TO "new name of database";

Beachten Sie, dass Tabelle pg_stat_activitySpalte pidals benannte procpidin Versionen vor 9.2. Wenn Ihre PostgreSQL-Version niedriger als 9.2 ist, verwenden Sie procpidstattdessen anstelle von pid.

gsiems
quelle
3
es hat bei mir funktioniert, danke! Der Spaltenname in pg_stat_activity ist jedoch pid und nicht procpid. ( PostgreSQL 9.3.5 on x86_64-apple-darwin, compiled by i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.9.00), 64-bit)
Bodman
7

Ich bin gerade darauf gestoßen und unten ist, was funktioniert hat:

1) pgAdminist eine der Sitzungen. Verwenden Sie psqlstattdessen.
2) Beenden Sie die pgBouncerund / oder Scheduler-Dienste unter Windows, da diese auch Sitzungen erstellen

smoore4
quelle
3

Unexist hat mir in einem Kommentar gesagt, dass ich die Datenbank neu starten soll und es funktioniert! Durch einen Neustart der Datenbank wird die gesamte vorhandene Verbindung beendet. Anschließend stelle ich eine Verbindung zu einer anderen Datenbank her und konnte diese mit meiner ersten Abfrage umbenennen.

Danke an alle.

Patrick Desjardins
quelle
3

Anstatt einen Nuke bereitzustellen (den Server neu zu starten), sollten Sie versuchen, die Verbindungen zu schließen, die Sie stören, indem Sie entweder herausfinden, woher sie stammen, die Client-Prozesse herunterfahren oder die pg_cancel_backend()Funktion verwenden.

Milen A. Radev
quelle
0

Für alle, die mit DBeaver auf dieses Problem stoßen und eine Fehlermeldung wie die folgende erhalten:

ERROR: database "my_stubborn_db" is being accessed by other users
  Detail: There is 1 other session using the database.

Trennen Sie Ihre aktuelle Verbindung und stellen Sie mit einer Verbindung, die nicht auf die Datenbank abzielt, die Sie umbenennen, erneut eine Verbindung zum selben Server her.

Das Ändern der aktiven Datenbank reicht nicht aus.

Rovyko
quelle