web-dev-qa-db-fra.com

Supprimer la base de données PostgreSQL via la ligne de commande

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?

284
iman453

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';
410
csano

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

http://blog.gahooa.com/2010/11/03/how-to-force-drop-a-postgresql-database-by-killing-off-connection-processes/

107
Eugene

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>';
61
Bohemian

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;
15
Scott Marlowe