PostgreSQL - Rinomina database


127

Devo rinominare il database ma quando lo faccio mi PGAdmin : ALTER DATABASE "databaseName" RENAME TO "databaseNameOld"ha detto che non è possibile.

Come posso farlo?

( Versione 8.3 su WindowsXP )

Aggiornare

  • Il primo messaggio di errore: impossibile perché ero connesso ad esso. Quindi ho selezionato un altro database e ho eseguito le query.

  • Ricevo un secondo messaggio di errore che mi dice che è arrivato user connect. Vedo sullo PGAdminschermo che ne ha tanti PIDma sono inattivi ... non vedo come ucciderli.


1
Potresti spiegare perché non può. L'ho appena fatto (su una piattaforma diversa però) e ha funzionato
Vinko Vrsalovic,

1
Qual è il messaggio di errore esatto e hai cercato questo errore nei documenti di postgres? Forse c'è una ragione perfetta per quel comportamento. Normalmente la ridenominazione dovrebbe funzionare.
inesistente il

Aggiornato vedere la domanda
Patrick Desjardins

Perché non riavviare semplicemente il database?
inesistente il

Qual è il messaggio di errore esatto e hai cercato questo errore nei documenti di postgres? Forse c'è una ragione perfetta per quel comportamento. Normalmente la ridenominazione dovrebbe funzionare. Se hai problemi con connessioni in sospeso o morte, riavvia il database per eliminarli.
inesistente il

Risposte:


190

Prova a non citare il nome del database:

ALTER DATABASE people RENAME TO customers;

Assicurarsi inoltre che non vi siano altri client connessi al database in quel momento. Infine, prova a pubblicare il messaggio di errore che restituisce in modo da poter ottenere un po 'più di informazioni.


18
la citazione è richiesta quando il nome contiene una lettera maiuscola.
Patrick Desjardins,

7
Questo non è il caso, ma la citazione è necessaria anche quando il nome ha un .o @.
omar

6
La citazione è richiesta anche quando il nome contiene un-
GreenTurtle

I suggerimenti di cui sopra mi fanno pensare che sia meglio mantenere i nomi delle tabelle limitati solo a lettere minuscole e trattini bassi se possibile!
Aswin Sanakan

La citazione è richiesta anche quando il nome contiene uno spazio vuoto
Loaderon

86

Per riferimento futuro, dovresti essere in grado di:

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

Notare che la pg_stat_activitycolonna della tabella pidera denominata come procpidnelle versioni precedenti alla 9.2. Quindi, se la tua versione di PostgreSQL è inferiore alla 9.2, usa procpidinvece di pid.


3
ha funzionato per me, grazie! ma il nome della colonna in pg_stat_activity è pid e non 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

Mi sono appena imbattuto in questo e di seguito è quello che ha funzionato:

1) pgAdminè una delle sessioni. Usa psqlinvece.
2) Arrestare i servizi pgBouncere / o scheduler su Windows poiché anche questi creano sessioni


3

Unexist mi ha detto nel commento di riavviare il database e funziona! Il riavvio del database interrompe tutte le connessioni esistenti, quindi mi collego a un altro database e sono riuscito a rinominarlo con la mia query iniziale.

Grazie a tutti.


3

Invece di distribuire una bomba atomica (riavviando il server) dovresti provare a chiudere quelle connessioni che ti infastidiscono trovando da dove provengono e chiudendo i processi client o usando il pg_cancel_backend() funzione.


0

Per chiunque si imbatta in questo problema utilizzando DBeaver e riceve un messaggio di errore come questo:

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

Disconnetti la tua connessione corrente e riconnettiti allo stesso server con una connessione che non ha come destinazione il database che stai rinominando.

La modifica del database attivo non è sufficiente.

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.