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?

iman453
la source
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';
csano
la source
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/

Eugène
la source
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>';
Bohème
la source
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;
Scott Marlowe
la source