Diğer tüm kullanıcıları postgres veritabanından nasıl ayırırım?


13

Bir veritabanına özel erişime ihtiyacım var. Bir postgres veritabanından diğer tüm kullanıcıları "ayırmak" için bir SQL komutu kullanmak mümkün mü? Ya da belki diğer tüm bağlantıları kapatıp sonra özel erişim elde edebilirsiniz.

Bu birim testi içindir ve testler sadece manuel olarak yapılır, bu nedenle herhangi bir tehlike söz konusu değildir. Sadece eski ölü bağlantılar etkilenecektir.

Bu unittest veritabanlarına bağlanan başka kullanıcı yok.

Eski ölü bağlantılar gelişmekten gelir. Bu, yazılan veya başarısız olan bir testin temiz çıkmadığı her zaman olur.


Birisinin bir üretim senaryosunda bağlantısını kestikten sonra diğer kullanıcıları da bir süre kilitli tutması gerekiyorsa, aşağıdaki Scott Marlowe'un cevabına bakın: /dba//a/6184/2024


Ayrıca dba ile ilgili bu benzer soruya bakın: Sunucuyu durdurmadan belirli bir veritabanına tüm bağlantılar nasıl bırakılır?

Yanıtlar:


14

Postgres kullanıcısı olarak veritabanına bağlanmayı ve çalışmayı deneyebilirsiniz:

SELECT pg_terminate_backend( procpid )
FROM pg_stat_activity
WHERE procpid <> pg_backend_pid( )    -- 1. don't terminate your own session
    AND datname =                     -- 2. don't terminate connections to 
    (SELECT datname                   --    other databases in the cluster
       FROM pg_stat_activity
      WHERE procpid = pg_backend_pid( )
    );

Güncelleme Daha da iyi bir sorgu alt seçenekten kurtulur:

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

2
CONNECT izinlerini iptal etmeyi unutmayın, aksi takdirde kullanıcılar özel erişiminiz olmadan önce yeni bağlantılar oluşturur.
Frank Heikens

@Frank Heikens - İyi yakala. Ben "manuel birim testi" girmişti ama birim testi yapan kişi yanında bağlayan başkaları varsa "<datname> üzerinden bağlantıyı iptal ..." gerekli olacaktır.
gsiems

1
PostgreSQL 9.2, procpidyeniden adlandırıldı pid, bu yüzden dikkat edin.
Craig Ringer

Söz konusu kullanıcı ile bir REVOKE yapmanın ötesinde, ben de REVOKE ..... kamu vardı - dikkat edilmesi gereken bir şey!
David N. Welton

9.3 üzerinde görülüyor ki pg_stat_activity.procpid şimdi denir pg_stat_activity.pid . aksi takdirde A-OK çalıştı.
JL Peyret

4

Buradaki sorun iki yönlüdür, önce bu kullanıcıların bağlantısını kesmeniz ve ikinci olarak onları sunucunuzdan uzak tutmanız gerekir. Bağlantı izinlerini iptal etmek yerine, genellikle belirli makinelerden ve / veya kullanıcılardan yeni bağlantıları reddetmek için pg_hba.conf kullanıyorum, sonra sadece bir pg_ctl -m hızlı durdurma yapıyorum; pg_ctl mevcut tüm bağlantıları bırakmaya başlar. Slony ile DDL değişiklikleri yapmak bu hemen hemen bir zorunluluktur ya da her yerde kilitlenmeler alırsınız.


6
Her zaman CONNECT'a izin veren ve diğer tüm roller tarafından devralınan tek bir rol kullanırım. Bu tek rol için REVOKE bağlanın ve işiniz bitti. Pg_terminate_backend () ile bir fonksiyona sarın ve mevcut tüm bağlantıları durdurmanız gerektiğinde kontrol sizde.
Frank Heikens
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.