J'ai besoin d'écrire un script qui supprimera une base de données PostgreSQL. Il peut y avoir beaucoup de connexions, mais le script doit ignorer cela.
La DROP DATABASE db_name
requête standard ne fonctionne pas lorsqu'il existe des connexions ouvertes.
Comment puis-je résoudre le problème?
postgresql
Roman Prykhodchenko
la source
la source
Réponses:
Cela supprimera les connexions existantes, sauf la vôtre:
Recherchez
pg_stat_activity
et obtenez les valeurs pid que vous voulez tuer, puis entrez-SELECT pg_terminate_backend(pid int)
les.PostgreSQL 9.2 et supérieur:
PostgreSQL 9.1 et versions antérieures:
Une fois que vous avez déconnecté tout le monde, vous devrez vous déconnecter et émettre la commande DROP DATABASE à partir d'une connexion d'une autre base de données aka pas celle que vous essayez de supprimer.
Notez le changement de nom de la
procpid
colonne enpid
. Voir ce fil de liste de diffusion .la source
; drop database TARGET_DB;
a bien fonctionné dans mon cas pour m'assurer que la base de données avait disparu au moment où les choses ont recommencé.dropdb --force
.Dans PostgreSQL 9.2 et supérieur, pour tout déconnecter sauf votre session de la base de données à laquelle vous êtes connecté:
Dans les anciennes versions, c'est la même chose, passez simplement
pid
àprocpid
. Pour vous déconnecter d'une autre base de données, changez simplementcurrent_database()
le nom de la base de données dont vous souhaitez déconnecter les utilisateurs.Vous pouvez
REVOKE
leCONNECT
droit des utilisateurs de la base de données avant de déconnecter les utilisateurs, sinon les utilisateurs simplement continuer à vous reconnecter et vous ne serez jamais la chance de laisser tomber le DB. Voir ce commentaire et la question à laquelle il est associé, comment détacher tous les autres utilisateurs de la base de données .Si vous souhaitez simplement déconnecter les utilisateurs inactifs, consultez cette question .
la source
Vous pouvez tuer toutes les connexions avant de supprimer la base de données à l'aide de la
pg_terminate_backend(int)
fonction.Vous pouvez obtenir tous les backends en cours d'exécution en utilisant la vue système
pg_stat_activity
Je ne suis pas entièrement sûr, mais ce qui suit tuerait probablement toutes les sessions:
Bien sûr, vous ne pouvez pas vous connecter à cette base de données
la source
En fonction de votre version de postgresql, vous pourriez rencontrer un bogue, ce qui fait que
pg_stat_activity
les connexions actives des utilisateurs abandonnés sont omises. Ces connexions ne sont pas non plus affichées dans pgAdminIII.Si vous effectuez des tests automatiques (dans lesquels vous créez également des utilisateurs), cela peut être un scénario probable.
Dans ce cas, vous devez revenir à des requêtes telles que:
REMARQUE: dans 9.2+, vous devrez passer
procpid
àpid
.la source
procpid
pourpid
cet extrait, fonctionne sur 9.3.J'ai remarqué que postgres 9.2 appelle maintenant la colonne pid plutôt que procpid.
J'ai tendance à l'appeler depuis le shell:
J'espère que cela vous sera utile. Merci à @JustBob pour le sql.
la source
Je viens de redémarrer le service dans Ubuntu pour déconnecter les clients connectés.
la source
Dans l'invite de commande Linux, j'arrêterais d'abord tous les processus postgresql en cours d'exécution en liant cette commande sudo /etc/init.d/postgresql restart
tapez la commande bg pour vérifier si d'autres processus postgresql sont toujours en cours d'exécution
puis suivi de dropdb dbname pour supprimer la base de données
Cela fonctionne pour moi sur l'invite de commande Linux
la source
PostgreSQL 9.2 et supérieur:
SELECT pg_terminate_backend(pid)FROM pg_stat_activity WHERE datname = 'YOUR_DATABASE_NAME_HERE'
la source
Voici mon hack ... = D
Je mets cette réponse car inclure une commande (ci-dessus) pour bloquer les nouvelles connexions et parce que toute tentative avec la commande ...
... ne fonctionne pas pour bloquer de nouvelles connexions!
Merci à @araqnid @GoatWalker! = D
https://stackoverflow.com/a/3185413/3223785
la source
PostgreSQL 13 à venir présentera une
FORCE
option.la source
Dans mon cas, j'ai dû exécuter une commande pour supprimer toutes les connexions, y compris ma connexion administrateur active
qui a mis fin à toutes les connexions et m'affiche un message '' erreur '' fatal:
FATAL: terminating connection due to administrator command SQL state: 57P01
Après cela, il a été possible de supprimer la base de données
la source
Rien n'a fonctionné pour moi sauf, j'ai ouvert une session à l'aide de pgAdmin4 et sur le tableau de bord, j'ai déconnecté toutes les connexions, sauf pgAdmin4, puis j'ai pu renommer par un clic droit sur la base de données et les propriétés et tapé un nouveau nom.
la source