J'essaie de supprimer ma base de données et d'en créer une nouvelle via la ligne de commande.
Je me connecte à l'aide de psql -U username
puis je fais un \connect template1
, suivi d'un DROP DATABASE databasename;
.
Je reçois l'erreur
la base de données nom_base est utilisée par d'autres utilisateurs
J'ai arrêté Apache et essayé encore mais je reçois toujours cette erreur. Est-ce que je fais quelque chose de mal?
Vous pouvez exécuter la commande dropdb à partir de la ligne de commande:
dropdb 'database name'
Notez que vous devez être superutilisateur ou propriétaire de la base de données pour pouvoir le supprimer.
Vous pouvez également consulter la vue pg_stat_activity pour voir le type d'activité en cours dans votre base de données, y compris tous les processus inactifs.
SELECT * FROM pg_stat_activity WHERE datname='database name';
Cela a fonctionné pour moi:
select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';
pour postgresql antérieure à 9.2, remplacez pid
par procpid
DROP DATABASE "YourDatabase";
Essaye ça. Notez qu'il n'y a pas de base de données spécifiée - elle s'exécute simplement "sur le serveur"
psql -U postgres -c "drop database databasename"
Si cela ne fonctionne pas, je vois un problème avec postgres qui conserve des déclarations préparées orphelines.
Pour les nettoyer, procédez comme suit:
SELECT * FROM pg_prepared_xacts;
alors pour chaque identifiant que vous voyez, lancez ceci:
ROLLBACK PREPARED '<id>';
Quand on dit que les utilisateurs sont connectés, qu'est-ce que la requête "select * from pg_stat_activity;" dire? Les autres utilisateurs que vous sont-ils maintenant connectés? Si tel est le cas, vous devrez peut-être éditer votre fichier pg_hba.conf pour refuser les connexions d'autres utilisateurs, ou fermer l'application qui accède à la base de données pg pour pouvoir la supprimer. J'ai ce problème à l'occasion dans la production. Définissez 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 soit Sudo /etc/init.d/postgresql reload ou pg_ctl reload) et maintenant, le seul moyen de se connecter à votre machine consiste à utiliser des sockets locaux. Je suppose que vous êtes sur Linux. Si ce n'est pas le cas, il faudra peut-être modifier quelque chose d'autre que local/ident sur la première ligne, quelque chose comme Host ... yourusername.
Maintenant vous devriez pouvoir faire:
psql postgres
drop database mydatabase;