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.

296voto

Craig Ringer Points 72371

Vous pouvez empêcher de futures connexions :

REVOKE CONNECT ON DATABASE thedb FROM public;

(et éventuellement d'autres utilisateurs/rôles ; voir \l+ sur psql )

Vous pouvez alors mettre fin à toutes les connexions à cette base de données, sauf les vôtres :

SELECT pid, pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE datname = current_database() AND pid <> pg_backend_pid();

Sur les anciennes versions pid s'appelait procpid donc tu devras faire avec.

Puisque vous avez révoqué CONNECT les droits, ce qui essayait de se connecter automatiquement ne devrait plus pouvoir le faire.

Vous pourrez maintenant déposer le DB.

Cela ne fonctionnera pas si vous utilisez des connexions de superutilisateur pour les opérations normales, mais si c'est le cas, vous devez d'abord résoudre ce problème.


Après avoir abandonné la base de données, si vous créez à nouveau la base de données, vous pouvez exécuter la commande suivante pour restaurer l'accès.

GRANT CONNECT ON DATABASE thedb TO public;

220voto

Suneel Kumar Points 3399

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.

D'abord, vous devez révoquer

REVOKE CONNECT ON DATABASE TARGET_DB FROM public;

Alors utilisez :

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

Cela marchera sûrement.

50voto

Dinesh Pallapa Points 609

J'ai trouvé une solution pour ce problème, essayez d'exécuter cette commande dans le terminal.

ps -ef | grep postgres

tuer le processus par cette commande

sudo kill -9 PID

45voto

Suman Astani Points 510

Cela signifie qu'un autre utilisateur accède à la base de données. Il suffit de redémarrer PostgreSQL. Cette commande fera l'affaire

root@kalilinux:~#sudo service postgresql restart

Essayez ensuite d'abandonner la base de données :

postgres=# drop database test_database;

Cela fera l'affaire.

42voto

Vérifiez simplement quelle est la connexion, d'où elle vient. Vous pouvez voir tout cela dans :

SELECT * FROM pg_stat_activity WHERE datname = 'TARGET_DB';

Peut-être est-ce votre connexion ?

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