Bagaimana cara melepaskan semua pengguna lain dari database postgres?

13

Saya perlu akses eksklusif ke database. Apakah mungkin menggunakan perintah SQL untuk "melepaskan" semua pengguna lain dari database postgres. Atau mungkin menutup semua koneksi lain dan kemudian mendapatkan akses eksklusif.

Ini untuk pengujian unit, dan tes hanya dijalankan secara manual, sehingga tidak ada bahaya yang terlibat. Hanya koneksi lama yang mati yang akan terpengaruh.

Tidak ada pengguna lain yang terhubung ke basis data yang belum dikirim.

Koneksi lama yang mati berasal dari pengembangan. Ini terjadi setiap saat ketika tes yang sedang ditulis atau gagal tidak keluar bersih.


Jika seseorang juga perlu tetap terkunci dari pengguna lain untuk sementara waktu setelah memutuskan sambungan mereka dalam skenario produksi, lihat jawaban Scott Marlowe di bawah ini: /dba//a/6184/2024


Lihat juga pertanyaan serupa ini di dba: Bagaimana cara menjatuhkan semua koneksi ke database tertentu tanpa menghentikan server?

mit
sumber

Jawaban:

14

Anda dapat mencoba menghubungkan ke database sebagai pengguna postgres dan menjalankan:

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( )
    );

pembaruan Query yang lebih baik menghilangkan subselect:

SELECT pg_terminate_backend( procpid )
FROM pg_stat_activity
WHERE procpid <> pg_backend_pid( )
    AND datname = current_database( );
gsiems
sumber
2
jangan lupa untuk MEMERLIHATKAN kembali CONNECT, jika tidak, pengguna akan membuat koneksi baru sebelum Anda memiliki akses eksklusif.
Frank Heikens
@ Frank Heikens - Tangkapan bagus. Saya telah mengetik "tes unit manual" tetapi jika ada orang lain yang terhubung selain individu yang melakukan tes unit maka "cabut koneksi pada <datname> dari ..." akan sangat penting.
gsiems
Di PostgreSQL 9.2, procpiddiganti namanya menjadi pid, jadi waspadalah untuk itu.
Craig Ringer
Selain melakukan REVOKE dengan pengguna yang bersangkutan, saya juga harus REVOKE ..... publik - sesuatu yang harus diperhatikan!
David N. Welton
pada 9.3 tampaknya pg_stat_activity.procpid sekarang disebut pg_stat_activity.pid . bekerja A-OK kalau tidak.
JL Peyret
4

Masalahnya di sini ada dua, pertama Anda harus memutuskan pengguna tersebut, dan kedua Anda harus menjaga mereka keluar dari server Anda. Alih-alih mencabut perms connect, saya biasanya menggunakan pg_hba.conf untuk menolak koneksi baru dari mesin dan / atau pengguna tertentu, kemudian lakukan saja pg_ctl -m fast stop; pg_ctl mulai untuk menjatuhkan semua koneksi saat ini. Dengan slony melakukan perubahan DDL ini cukup banyak keharusan atau Anda akan mendapatkan kebuntuan di semua tempat.

Scott Marlowe
sumber
5
Saya selalu menggunakan satu peran yang memungkinkan CONNECT dan diwarisi oleh semua peran lainnya. REVOKE terhubung untuk peran tunggal ini dan Anda selesai. Bungkus dengan fungsi dengan pg_terminate_backend () dan Anda memegang kendali saat Anda harus menghentikan semua koneksi saat ini.
Frank Heikens