web-dev-qa-db-fra.com

PostgreSQL - Renommer la base de données

J'ai besoin de renommer la base de données mais quand je le fais dans PGAdmin : ALTER DATABASE "databaseName" RENAME TO "databaseNameOld" il m'a dit que non.

Comment puis-je le faire?

(Version 8.3 sur WindowsXP)

Mise à jour

  • Le premier message d'erreur: impossible parce que j'y étais connecté. J'ai donc sélectionné une autre base de données et fait les requêtes.

  • Je reçois un deuxième message d'erreur m'informant que l'utilisateur est connecté. Je vois dans l'écran PGAdmin qu'il y a beaucoup PID mais ils sont inactifs ... Je ne vois pas comment les tuer.

111
Patrick Desjardins

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. Enfin, essayez de publier le message d'erreur qu'il renvoie afin que nous puissions obtenir un peu plus d'informations.

168
bmdhacks

Pour référence future, vous devriez pouvoir:

-- 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 le tableau pg_stat_activity la colonne pid était nommée procpid dans les versions antérieures à 9.2. Donc, si votre version PostgreSQL est inférieure à 9.2, utilisez procpid au lieu de pid.

74
gsiems

Je suis juste tombé sur ceci et voici ce qui a fonctionné:

1) pdAdmin est l'une des sessions. Utilisez psql à la place.
2) Arrêtez les services pgBouncer et/ou le planificateur sous Windows car ils créent également des sessions

7
smoore4

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 tue toutes les connexions existantes, puis je me connecte à une autre base de données et j'ai pu la renommer avec ma requête initiale.

Merci à tous.

3
Patrick Desjardins

Au lieu de déployer un Nuke (redémarrage du serveur), vous devez essayer de fermer les connexions qui vous dérangent soit en trouvant d'où elles viennent et en arrêtant les processus client, soit en utilisant pg_cancel_backend() = fonction.

2
Milen A. Radev