PostgreSQL - Renommer la base de données

127

J'ai besoin de renommer la base de données, mais quand je le fais, PGAdmin : ALTER DATABASE "databaseName" RENAME TO "databaseNameOld"cela m'a dit que ce n'était pas possible.

Comment puis-je le faire?

( Version 8.3 sur WindowsXP )

Mettre à jour

  • Le premier message d'erreur: impossible car je m'y suis connecté. J'ai donc sélectionné une autre base de données et effectué les requêtes.

  • J'obtiens un deuxième message d'erreur m'indiquant que l'utilisateur s'est connecté. Je vois sur l' PGAdminécran qu'il en a beaucoup PIDmais ils sont inactifs ... Je ne vois pas comment les tuer.

Patrick Desjardins
la source
1
Vous pourriez expliquer pourquoi il ne le peut pas. Je viens de le faire (sur une plate-forme différente cependant) et cela a fonctionné
Vinko Vrsalovic
1
Quel est le message d'erreur exact et avez-vous recherché cette erreur dans la documentation postgres? Il y a peut-être une raison parfaite à ce comportement. Normalement, le changement de nom devrait fonctionner.
unexist le
Mise à jour voir la question
Patrick Desjardins
Pourquoi ne pas simplement redémarrer la base de données?
unexist le
Quel est le message d'erreur exact et avez-vous recherché cette erreur dans la documentation postgres? Il y a peut-être une raison parfaite à ce comportement. Normalement, le changement de nom devrait fonctionner. Si vous rencontrez des problèmes de connexions en attente ou mortes, redémarrez simplement la base de données pour vous en débarrasser.
unexist le

Réponses:

190

Essayez de ne pas citer le nom de la base de données:

ALTER DATABASE people RENAME TO customers;

Assurez-vous également qu'aucun autre client n'est connecté à la base de données à ce moment-là. Enfin, essayez de publier le message d'erreur qu'il renvoie afin que nous puissions obtenir un peu plus d'informations.

bmdhacks
la source
18
la citation est requise lorsque le nom contient une lettre majuscule.
Patrick Desjardins
7
Ce n'est pas le cas, mais la citation est également requise lorsque le nom a un .ou @.
omar
6
La citation est également requise lorsque le nom contient un-
GreenTurtle
Les suggestions ci-dessus me font penser qu'il est préférable de limiter les noms de table aux lettres minuscules et aux traits de soulignement si possible!
Aswin Sanakan le
La citation est également requise lorsque le nom contient un espace vide
Loaderon
86

Pour référence future, vous devriez être en mesure de:

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

Notez que la pg_stat_activitycolonne de table a pidété nommée comme procpiddans les versions antérieures à 9.2. Donc, si votre version de PostgreSQL est inférieure à 9.2, utilisez à la procpidplace de pid.

gsiems
la source
3
cela a fonctionné pour moi, merci! mais le nom de la colonne dans pg_stat_activity est pid et 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

Je viens de rencontrer ceci et voici ce qui a fonctionné:

1) pgAdminest l'une des sessions. Utilisez psqlplutôt.
2) Arrêtez les services pgBounceret / ou planificateur sous Windows car ils créent également des sessions

smoore4
la source
3

Unexist m'a dit en commentaire de redémarrer la base de données et ça marche! Le redémarrage de la base de données a tué toute connexion existante, puis je me suis connecté à une autre base de données et j'ai pu la renommer avec ma requête initiale.

Merci à tous.

Patrick Desjardins
la source
3

Au lieu de déployer une arme nucléaire (redémarrage du serveur), vous devriez essayer de fermer les connexions qui vous dérangent soit en trouvant d'où elles viennent et en fermant les processus clients, soit en utilisant la pg_cancel_backend()fonction.

Milen A. Radev
la source
0

Pour toute personne rencontrant ce problème en utilisant DBeaver et recevant un message d'erreur comme celui-ci:

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

Déconnectez votre connexion actuelle et reconnectez-vous au même serveur avec une connexion qui ne cible pas la base de données que vous renommez.

Changer la base de données active ne suffit pas.

Rovyko
la source