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?
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?
Jawaban:
Inilah jawaban saya untuk pertanyaan yang sangat mirip tentang StackOverflow.
Bergantung pada versi postgresql Anda, Anda mungkin mengalami bug, yang membuat Anda pg_stat_activity
menghilangkan 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');
Kueri seperti ini seharusnya membantu (dengan asumsi database bernama 'db'):
select pg_terminate_backend(pid) from pg_stat_activity where datname='db';
pid
dulu 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 PUBLIC
atau serupa, dan kemudian GRANT
sesudahnya.
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.