PostgreSQL: déposer la base de données PostgreSQL via la ligne de commande [fermé]


321

J'essaie de supprimer ma base de données et d'en créer une nouvelle via la ligne de commande.

Je me connecte en utilisant psql -U usernamepuis fais un \connect template1, suivi d'un DROP DATABASE databasename;.

Je reçois l'erreur

les autres utilisateurs accèdent au nom de la base de données de la base de données

J'ai arrêté Apache et réessayé mais j'obtiens toujours cette erreur. Est-ce que je fais quelque chose de mal?


2
Que se passe-t-il si vous exécutez simplement la dropdb databasenamecommande à partir de la ligne de commande?
— Dylan Markow

1
Il dit "ERREUR: impossible de supprimer la base de données actuellement ouverte"
— iman453

4
Utilisation psql -U <user> -c "drop database protodb"(sans nom de base de données)
— utilisateur

3
Cela redémarrera postgres et déconnectera tout le monde: sudo service postgresql restart Ensuite, faites: dropdb -h localhost -p 5432 -U "youruser" "testdb" Notez le "" pour vous assurer que les caractères spéciaux entrent sans accroc.
— unom

drop database <dataabase_name>;N'oubliez pas la virgule.
— Sandip Subedi

Réponses:


455

Vous pouvez exécuter la commande dropdb à 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 le supprimer.

Vous pouvez également vérifier la vue pg_stat_activity pour voir quel type d'activité se déroule actuellement sur votre base de données, y compris tous les processus inactifs.

SELECT * FROM pg_stat_activity WHERE datname='database name';

3
J'utilise la dropusercommande pour supprimer également l'utilisateur.
— pl1nk

6
Réponse non utile comme pour la version 9. L'erreur sur les connexions ouvertes apparaît toujours.
— Pavel Vlasov

4
Cela redémarrera postgres et déconnectera tout le monde: sudo service postgresql restart Ensuite, faites: dropdb -h localhost -p 5432 -U "youruser" "testdb" Notez le "" pour vous assurer que les caractères spéciaux entrent sans accroc.
— unom

1
en utilisant l'utilisateur postgres: sudo -u postgres dropdb 'nom de la base de données'
— leszek.hanusz

\lpour voir toutes les bases de données dont vous disposez.
— Sandip Subedi

115

Cela a fonctionné pour moi:

select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';

pour postgresql antérieur à 9.2 remplacer pidparprocpid

DROP DATABASE "YourDatabase";

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


12
J'ai dû changer un peu pour travailler:select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';
— mrt

column "procpid" does not existpour l'instance amazon RDS postgres 9.6
— anon58192932

Hm. Ran this, mais il vient juste de se reconnecter immédiatement, après avoir dit, "La connexion SSL s'est fermée de façon inattendue [...] en essayant de réinitialiser: Réussi." Annnd, je suis de retour.
— mlissner

67

Essaye ça. 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 les postgres qui s'accrochent aux déclarations préparées orphelines.
Pour les nettoyer, procédez comme suit:

SELECT * FROM pg_prepared_xacts;

puis pour chaque identifiant que vous voyez, exécutez ceci:

ROLLBACK PREPARED '<id>';

Désolé, je suis nouveau dans les bases de données, donc c'est probablement une question stupide, mais où dois-je taper cela? Avant de vous connecter à la base de données, non? Et je devrais remplacer databasename par le nom de ma base de données non?
— iman453

@ iman453: Vous l'exécuteriez directement depuis votre shell / ligne de commande.
— mu est trop court

2
Il n'y a rien de tel que «juste sur le serveur» pour postgresql. Vous devez vous connecter à une base de données. Dans ce cas, vous vous connecterez à la base de données postgres qui est à peu près là uniquement pour des cas comme celui-ci. Et un bon point sur les transactions préparées, mais dans ce cas, vous devriez obtenir un message d'erreur indiquant que c'est le problème.
— Scott Marlowe

1
Désolé Bohème, mais tu es celui qui a tort. Voici pg_stat_activity lors de l'exécution de createdb à partir de la ligne de commande: postgres = # select * from pg_stat_activity; 11564 | postgres | 22223 | 16384 | smarlowe | Test CREATE DATABASE; | f | 19/08/2011 16: 18: 26.918933-06 | 19/08/2011 16: 18: 26.918933-06 | 19/08/2011 16: 18: 26.916578-06 | | -1 Notez que cela se produit lors de l'exécution de createdb à partir de la ligne de commande dans un autre terminal. Ce premier champ est le db auquel mon script createdb était connecté
— Scott Marlowe

1
Pourquoi n'est-ce pas le premier, la réponse n ° 1?
— Henley Chiu

16

Quand il indique 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 maintenant connectés? Si tel est le cas, vous devrez peut-être modifier votre fichier pg_hba.conf pour rejeter 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 en 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 est via des sockets locaux. Je suppose que vous êtes sous Linux. Si ce n'est pas le cas, il faudra peut-être l'ajuster à autre chose que local / ident sur cette première ligne, à quelque chose comme host ... yourusername.

Vous devriez maintenant pouvoir faire:

psql postgres
drop database mydatabase;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.