2013-07-03 19 views
54

bazı oto bağlantılarının veritabanını bırakma mümkün: Ben DB'den bağlantıyı sonaPostgresql Ben olsun veritabanını bırakma çalıştığınızda zaman çünkü DB

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

: Ben kullandığınızda

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

Ancak, bir şekilde veritabanını bırakmaya çalışırsam, birisi otomatik olarak bu veritabanına bağlanır ve bu hatayı verir. Bunu ne yapabilirdi? Kimse bu veritabanını kullanmaz, benden hariç.

cevap

54

Gelecekteki bağlantıları engelleyebilir:

REVOKE CONNECT ON DATABASE thedb FROM public; 

;

Sonrasında, kendi dışında bu db tüm bağlantıları kesebilirler (ve muhtemelen diğer kullanıcılar/rolleri psql içinde \l+ bakınız):

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

Eski sürümlerde pid, procpid olarak adlandırıldı, bununla başa çıkmak zorundasınız.

CONNECT haklarını iptal ettiğinizden beri, otomatik olarak bağlanmaya çalışılan her şey artık bunu yapamaz.

Artık DB'yi bırakabileceksiniz.

Bu, normal işlemler için süper kullanıcı bağlantılarını kullanıyorsanız işe yaramaz, ancak bunu yapıyorsanız önce sorunu çözmeniz gerekir. Ben veritabanını bırakma çalıştığınızda zaman

+2

Daha sonra aynı ada sahip başka bir veritabanını alırsanız, connect capab ver herkese açıklık: 'DATABASE GRIB BAĞLANTISI – Mike

18

Sadece bağlantı nereden geldiğini, nereden geldiğini kontrol edin. Hepsini gör:

select * from pg_stat_activity where datname = 'TARGET_DB'; 

Belki de sizin bağlantınız mı?

+4

sudo kill -9 Sonucu gördükten sonra terminalde PID –

42

alıyorum:

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

İlk You

REVOKE CONNECT ON DATABASE TARGET_DB FROM public; 

Ardından kullanmak iptal gerekir:

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

Kesinlikle çalışacaktır.

4

makinenizde diğer hizmetler üzerinde hiçbir potansiyel etkisi, sadece

5

service postgresql restart bu sorun için bir çözüm bu komutla terminali

ps -ef | grep postgres 

öldürme sürecinde bu çalıştırmayı, bulduysanız

sudo kill -9 PID 
İlgili konular