263 votes

Postgresql - Impossible de supprimer la base de données en raison de certaines connexions automatiques à la base de données.

Chaque fois que j'essaie d'abandonner la base de données, j'obtiens :

ERROR:  database "pilot" is being accessed by other users
DETAIL:  There is 1 other session using the database.

Quand je l'utilise :

SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'TARGET_DB';

J'ai mis fin à la connexion de cette base de données, mais si j'essaie de supprimer la base de données après cela, quelqu'un se connecte automatiquement à cette base de données et donne cette erreur. Qu'est-ce qui peut provoquer cela ? Personne n'utilise cette base de données, sauf moi.

2voto

D'abord :

sudo systemctl restart postgresql

alors :

drop database DATABASE_NAME;

2voto

ian Points 384

Si vous utilisez docker pour exécuter le serveur postgresql, redémarrez le conteneur.

1voto

hlongmore Points 728

Bien que j'aie trouvé les deux réponses les plus votées utiles en d'autres occasions, aujourd'hui, la façon la plus simple de résoudre le problème était de réaliser que PyCharm pouvait garder une session ouverte, et si je cliquais sur Stop dans PyCharm, cela pourrait aider. Avec pgAdmin4 ouvert dans le navigateur, je l'ai fait, et j'ai presque immédiatement vu les statistiques des sessions de base de données tomber à 0, et j'ai alors pu abandonner la base de données.

1voto

Simon Bachmann Points 805

Si vous rencontrez cette erreur dans IntelliJ, assurez-vous de fermer la connexion dans tous les Windows en cliquant sur le bouton ci-dessous. enter image description here

1voto

ngAlchemist Points 51

Dans mon cas, j'ai continué à obtenir l'erreur même après avoir utilisé la commande ci-dessous - parce qu'une autre connexion utilisateur a été créée immédiatement après l'exécution.

REVOKE CONNECT ON DATABASE <db_name> FROM public;

Ce qui a réglé le problème pour moi a été d'utiliser la solution d'Inferno ci-dessus (également ci-dessous) pour empêcher les connexions.

ALTER DATABASE <db_name> allow_connections = off

Cela m'a permis de mettre fin au processus sans que le processus soit immédiatement recréé.

SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = 'TARGET_DB' -- change this to your DB AND pid <> pg_backend_pid();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X