J’essaie de supprimer ma base de données et d’en créer une nouvelle par le biais de la ligne de commande.
Je me connecte en utilisant psql -U nom d'utilisateur
et ensuite je fais un connect template1
, suivi d'un DROP DATABASE nom de la base de données;
.
J'obtiens l'erreur suivante
La base de données databasename est accessible par d'autres utilisateurs.
J'ai arrêté Apache et j'ai réessayé, mais j'obtiens toujours cette erreur. Est-ce que je fais quelque chose de mal ?
Vous pouvez exécuter la commande [dropdb][1] à partir de la ligne de commande :
dropdb 'database name'
Notez que vous devez être un superutilisateur ou le propriétaire de la base de données pour pouvoir la supprimer.
Vous pouvez également consulter la vue pg_stat_activity pour voir quel type d'activité a lieu actuellement sur votre base de données, y compris tous les processus inactifs.
SELECT * FROM pg_stat_activity WHERE datname='database name';
[1] : http://www.postgresql.org/docs/8.3/static/app-dropdb.html
Essayez ceci. Notez qu’aucune base de données n’est spécifiée - elle s’exécute simplement sur le serveur ;
psql -U postgres -c "drop database databasename"
Si cela ne fonctionne pas, j'ai vu un problème avec postgres qui conservait les instructions préparées orphelines.
Pour les nettoyer, faites ceci :
SELECT * FROM pg_prepared_xacts;
puis pour chaque identifiant que vous voyez, faites ceci :
ROLLBACK PREPARED '<id>';
Quand il est dit que les utilisateurs sont connectés, que dit la requête "select * from pg_stat_activity;" ? Les autres utilisateurs, à part vous, sont-ils maintenant connectés ? Si c'est le cas, vous devrez peut-être modifier votre fichier pg_hba.conf pour rejeter les connexions des autres utilisateurs, ou arrêter l'application qui accède à la base de données pg pour pouvoir l'abandonner. Je rencontre ce problème à l'occasion en production. Configurez pg_hba.conf pour avoir deux lignes comme ceci :
local all all ident
host all all 127.0.0.1/32 reject
et dites à pgsql de recharger ou de redémarrer (c'est-à-dire sudo /etc/init.d/postgresql reload ou pg_ctl reload) et maintenant la seule façon de se connecter à votre machine est via des sockets locaux. Je suppose que vous êtes sous linux. Si ce n'est pas le cas, il faudra peut-être modifier la configuration pour obtenir quelque chose d'autre que local / ident sur la première ligne, et quelque chose comme host ... yourusername.
Maintenant vous devriez être capable de faire :
psql postgres
drop database mydatabase;