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.