2013-07-03 3 views
54

Jedes Mal, wenn ich versuche, Datenbank zu löschen, erhalte ich:Postgresql - nicht in der Lage Datenbank zu löschen, weil einige Auto Verbindungen zu DB

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

Wenn ich:

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

ich die Verbindung von der DB beendet , aber wenn ich versuche, die Datenbank danach zu löschen, verbindet sich jemand automatisch mit dieser Datenbank und gibt diesen Fehler. Was könnte das tun? Niemand benutzt diese Datenbank außer mir.

Antwort

54

können Sie zukünftige Verbindungen verhindern:

REVOKE CONNECT ON DATABASE thedb FROM public; 

(und möglicherweise andere Benutzer/Rollen, siehe \l+ in psql)

Sie können dann alle Verbindungen zu diesem db außer Ihrem eigenen beenden:

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

Bei älteren Versionen pid hieß procpid, so dass Sie damit umgehen müssen.

Da Sie die Rechte CONNECT widerrufen haben, sollte das, was versucht hat, automatisch zu verbinden, nicht mehr dazu in der Lage sein.

Sie können nun die DB löschen.

Dies funktioniert nicht, wenn Sie Superuser-Verbindungen für den normalen Betrieb verwenden, aber wenn Sie das tun, müssen Sie zuerst das Problem beheben.

+2

Wenn Sie später eine andere Datenbank mit dem gleichen Namen importieren, gewähren Sie connect capac Zurück zur öffentlichkeit: 'GRANT CONNECT ON DATABASE theDB TO public;' – Mike

18

Überprüfen Sie einfach, was die Verbindung ist, woher es kommt. Sie können all dies sehen in:

select * from pg_stat_activity where datname = 'TARGET_DB'; 

Vielleicht ist es Ihre Verbindung?

+4

sudo kill -9 PID im Terminal nach dem Anzeigen des Ergebnisses –

42

Jedes Mal, wenn ich versuche, Datenbank zu löschen, erhalte ich:

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

Zuerst Sie müssen

REVOKE CONNECT ON DATABASE TARGET_DB FROM public; 

Dann nutzen zu widerrufen:

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

Es wird sicher funktionieren.

4

Wenn keine möglichen Auswirkungen auf andere Dienste auf dem Computer, einfach service postgresql restart

5

fand ich eine Lösung für dieses Problem versuchen, diesen Befehl auszuführen in Terminal

ps -ef | grep postgres 

Prozess zu töten durch diesen Befehl

sudo kill -9 PID 
Verwandte Themen