Bagaimana cara menjatuhkan semua koneksi ke database tertentu tanpa menghentikan server?

45

Saya ingin menghapus semua koneksi (sesi) yang saat ini dibuka untuk database PostgreSQL tertentu tetapi tanpa me-restart server atau memutuskan koneksi ke database lain.

Bagaimana saya bisa melakukan itu?

Sorin
sumber
Saya membaca di suatu tempat bahwa Anda dapat menggunakan lowth.com/cutter untuk mencapai ini.

Jawaban:

22

Inilah jawaban saya untuk pertanyaan yang sangat mirip tentang StackOverflow.

Bergantung pada versi postgresql Anda, Anda mungkin mengalami bug, yang membuat Anda pg_stat_activitymenghilangkan koneksi aktif dari pengguna yang terputus. Koneksi ini juga tidak ditampilkan di dalam pgAdminIII.

Jika Anda melakukan pengujian otomatis (di mana Anda juga membuat pengguna) ini mungkin skenario yang memungkinkan.

Dalam hal ini Anda harus kembali ke kueri seperti:

 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');
jb.
sumber
8
GALAT: hilang entri FROM-klausa untuk tabel "pg_stat_activity" (psql (9.6.1))
user1767316
4
ini tidak berfungsi lagi .... dapatkan kesalahan di atas ^
ringan
Lihat jawaban di bawah oleh Szymon Guz
Dfranc3373
Hilang dari Klausul, tidak berfungsi
Vipul
78

Kueri seperti ini seharusnya membantu (dengan asumsi database bernama 'db'):

select pg_terminate_backend(pid) from pg_stat_activity where datname='db';

piddulu dipanggil procpid, jadi jika Anda menggunakan versi postgres yang lebih tua dari 9,2 Anda bisa mencoba yang berikut:

select pg_terminate_backend(procpid) from pg_stat_activity where datname='db';

Namun Anda harus menjadi pengguna super untuk memutuskan pengguna lain.

Mungkin juga berguna REVOKE CONNECT ON DATABASE FROM PUBLICatau serupa, dan kemudian GRANTsesudahnya.

Paul White mengatakan GoFundMonica
sumber
3

Ini dapat digunakan untuk "membebaskan" database dari koneksi klien, sehingga Anda misalnya dapat mengganti nama:

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;

Ketahuilah bahwa ini dapat menyebabkan perilaku bermasalah ke aplikasi klien Anda. Sebenarnya data tidak boleh mengalir karena menggunakan transaksi.

Coba Laugstøl
sumber