Şu anda belirli bir PostgreSQL veritabanına açılan, ancak sunucuyu yeniden başlatmadan veya diğer veritabanlarına bağlantıyı kesmeden tüm bağlantıları (oturumları) bırakmak istiyorum.
Bunu nasıl yapabilirim?
Şu anda belirli bir PostgreSQL veritabanına açılan, ancak sunucuyu yeniden başlatmadan veya diğer veritabanlarına bağlantıyı kesmeden tüm bağlantıları (oturumları) bırakmak istiyorum.
Bunu nasıl yapabilirim?
Yanıtlar:
İşte StackOverflow'taki benzer soruya cevabım .
Postgresql sürümünüze bağlı olarak pg_stat_activity
, bırakılan kullanıcılardan etkin bağlantıları kesmeyi sağlayan bir hatayla karşılaşabilirsiniz. Bu bağlantılar ayrıca pgAdminIII içinde gösterilmez.
Otomatik test yapıyorsanız (içinde kullanıcı da yaratırsınız), bu olası bir senaryo olabilir.
Bu durumda, aşağıdaki gibi sorgulara geri dönmeniz gerekir:
SELECT pg_terminate_backend(pg_stat_activity.procpid)
FROM pg_stat_get_activity(NULL::integer)
WHERE datid=(SELECT oid from pg_database where datname = 'your_database');
Böyle bir sorgulama yardımcı olacaktır (veritabanının 'db' olduğunu varsayarsak):
select pg_terminate_backend(pid) from pg_stat_activity where datname='db';
pid
Eskiden çağrılırdı procpid
, bu nedenle, 9.2'den daha eski bir postgres sürümü kullanıyorsanız, aşağıdakileri deneyebilirsiniz:
select pg_terminate_backend(procpid) from pg_stat_activity where datname='db';
Ancak, diğer kullanıcıların bağlantısını kesmek için süper kullanıcı olmalısınız.
Aynı zamanda yararlı olabilir REVOKE CONNECT ON DATABASE FROM PUBLIC
ya da benzer bir şey olabilir ve daha GRANT
sonra.
Bu, bir veritabanını istemci bağlantılarından "serbest bırakmak" için kullanılabilir, böylece örneğin onu yeniden adlandırabilirsiniz:
SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname='current_db';
ALTER DATABASE current_db RENAME TO old_db;
ALTER DATABASE new_db RENAME TO current_db;
Bunun müşteri uygulamalarınız için sorunlu davranışa neden olabileceğini unutmayın. İşlem kullanımı nedeniyle veri gerçekliği kesilmemelidir.