PostgreSQL - Zmień nazwę bazy danych

126

Muszę zmienić nazwę bazy danych, ale kiedy to zrobiłem PGAdmin : ALTER DATABASE "databaseName" RENAME TO "databaseNameOld", powiedział mi, że nie może.

Jak mogę to zrobić?

( Wersja 8.3 na WindowsXP )

Aktualizacja

  • Pierwszy komunikat o błędzie: Nie można, ponieważ byłem z nim połączony. Więc wybrałem inną bazę danych i wykonałem zapytania.

  • Otrzymuję drugi komunikat o błędzie z informacją, że nastąpiło połączenie użytkownika. Widzę na PGAdminekranie, że ma ich wiele, PIDale są nieaktywne ... Nie wiem, jak je zabić.

Patrick Desjardins
źródło
1
Możesz wyjaśnić, dlaczego nie może. Właśnie to zrobiłem (chociaż na innej platformie) i zadziałało
Vinko Vrsalovic
1
Jaki jest dokładny komunikat o błędzie i czy sprawdziłeś ten błąd w dokumentach postgres? Może jest doskonały powód takiego zachowania. Zwykle zmiana nazwy powinna działać.
nieistniejący
Zaktualizowano zobacz pytanie
Patrick Desjardins
Dlaczego nie zrestartować bazy danych?
nieistniejący
Jaki jest dokładny komunikat o błędzie i czy sprawdziłeś ten błąd w dokumentach postgres? Może jest doskonały powód takiego zachowania. Zwykle zmiana nazwy powinna działać. Jeśli masz problemy z oczekującymi lub martwymi połączeniami, po prostu zrestartuj bazę danych, aby się ich pozbyć.
nieistniejący

Odpowiedzi:

189

Staraj się nie cytować nazwy bazy danych:

ALTER DATABASE people RENAME TO customers;

Upewnij się również, że w danym momencie nie ma innych klientów połączonych z bazą danych. Na koniec spróbuj opublikować komunikat o błędzie, który zwraca, abyśmy mogli uzyskać więcej informacji.

bmdhacks
źródło
18
cytowanie jest wymagane, gdy nazwa zawiera dużą literę.
Patrick Desjardins
7
Tak nie jest, ale cytowanie jest również wymagane, gdy nazwa ma .lub @.
omar
6
Cytowanie jest również wymagane, gdy nazwa zawiera-
GreenTurtle,
Powyższe sugestie sprawiają, że myślę, że lepiej jest ograniczyć nazwy tabel do małych liter i podkreślenia, jeśli to możliwe!
Aswin Sanakan
Cytowanie jest również wymagane, gdy nazwa zawiera puste miejsce
Loaderon
86

Na przyszłość powinieneś umieć:

-- 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";

Zauważ, że pg_stat_activitykolumna tabeli pidzostała nazwana tak, jak procpidw wersjach wcześniejszych niż 9.2. Więc jeśli twoja wersja PostgreSQL jest niższa niż 9.2, użyj procpidzamiast pid.

gsiems
źródło
3
to zadziałało dla mnie, dzięki! ale nazwa kolumny w pg_stat_activity to pid, a nie 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

Właśnie natknąłem się na to, a poniżej działa:

1) pgAdminjest jedną z sesji. Użyj psqlzamiast tego.
2) Zatrzymaj usługi pgBounceri / lub usługi harmonogramu w systemie Windows, ponieważ te również tworzą sesje

smoore4
źródło
3

Unexist powiedział mi w komentarzu, żebym zrestartował bazę danych i to działa! Ponowne uruchomienie bazy danych zabija wszystkie istniejące połączenia, a następnie łączę się z inną bazą danych i mogłem zmienić jej nazwę za pomocą mojego początkowego zapytania.

Dzięki wszystkim.

Patrick Desjardins
źródło
3

Zamiast wdrożyć nuke (zrestartować serwer), powinieneś spróbować zamknąć te połączenia, które ci przeszkadzają, albo znajdując skąd one pochodzą i zamykając procesy klienta, albo używając tej pg_cancel_backend()funkcji.

Milen A. Radev
źródło
0

Dla każdego, kto napotka ten problem przy użyciu DBeavera i otrzyma taki komunikat o błędzie:

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

Odłącz bieżące połączenie i połącz się ponownie z tym samym serwerem, korzystając z połączenia, które nie jest przeznaczone dla bazy danych, której nazwę zmieniasz.

Zmiana aktywnej bazy danych nie wystarczy.

rovyko
źródło