Jika saya memiliki permintaan Postgres yang sudah berjalan lama, dan "kill [pid]" yang biasa tidak berfungsi, dan pg_cancel_backend tidak berfungsi, apa yang harus saya lakukan?
Jika saya memiliki permintaan Postgres yang sudah berjalan lama, dan "kill [pid]" yang biasa tidak berfungsi, dan pg_cancel_backend tidak berfungsi, apa yang harus saya lakukan?
Jawaban:
Anda tidak boleh membunuh -9 proses postgres apa pun kecuali jika tujuan Anda adalah untuk menjatuhkan seluruh server secara paksa. Anda dapat membunuh proses apa pun yang tidak menanggapi panggilan pg_cancel_backend () dari shell with
kill <pid>
yaitu tidak -9. Perhatikan bahwa saya telah melihat beberapa kali di mana bahkan itu tidak berhasil karena proses digantung menunggu dalam beberapa lingkaran untuk data pada koneksi jaringan. Jika saya ingat dengan benar, membunuh proses klien akan menanganinya.
http://www.postgresql.org/docs/current/static/server-shutdown.html
pg_cancel_backend sama dengan mengirim SIGINT ke proses.
pg_terminate_backend juga untuk SIGTERM, tetapi jika pg_cancel_backend tidak berfungsi, saya tidak mengerti mengapa pg_terminate_backend mau.
Jika Anda sudah mencoba opsi itu, Anda bisa mencoba SIGQUIT. Dokumen mengatakan, " Ini direkomendasikan hanya dalam keadaan darurat. "
(Jika Anda membenci data Anda dan berharap itu mati, Anda bisa menggunakan SIGKILL. Tapi saya tidak akan melakukannya.)
Anda dapat menggunakan secara kill
langsung atau pg_ctl kill
.
jika Anda memiliki Postgres terbaru, Anda dapat mencobanya pg_terminate_backend
.
suap benar dalam pernyataannya di atas ...
JIKA Anda mencoba ke SHUTDOWN
server, bagi saya:
Saya hanya mencoba untuk menghapus Pensiunan Database / Skema, yang masih memiliki koneksi tetap yang tidak akan dilepaskan.
Jadi, untuk menjawab pertanyaanmu,
Jika saya memiliki permintaan Postgres yang sudah berjalan lama ...
pg_cancel_backend tidak berfungsi ...
apa yang harus saya lakukan?
TIDAK TERKAIT untuk mematikan server dengan cara apa pun.
Saya juga melihat perilaku pg_cancel_backend()
tidak bekerja ini. Dan ingin berbagi solusi kerja saya.
Saya belum melihat masalah sejauh ini, dengan segala jenis "kehilangan" data.
Sekali lagi, saya juga tidak mencoba untuk membunuh Active
permintaan.
- Saya masuk sebagai PENGGUNA "A" dengan sesi atau PID dari 777777.
- Dan akan mencoba dan memutuskan koneksi sesi lain dari USER "A" terbuka sebagai 123456789
- Yang merupakan koneksi tidur, dan itulah sebabnya saya juga mencari
idle
dalam pertanyaan saya di bawah ini.
SELECT *
FROM pg_stat_activity
WHERE pid = 123456789
AND STATE = 'idle';
- Mencoba 1
SELECT pg_cancel_backend(pid)
FROM pg_stat_activity
WHERE pid = 123456789
AND STATE = 'idle';
- Hasil yang cukup menarik menyatakan bahwa pembatalan itu BENAR tetapi masih ada.
SELECT *
FROM pg_stat_activity
WHERE pid = 123456789
AND STATE = 'idle';
- Mencoba 2
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE pid = 123456789
AND STATE = 'idle';
- Dan Sekarang tidak ada ..
SELECT *
FROM pg_stat_activity
WHERE pid = 123456789
AND STATE = 'idle';
- CATATAN: Saya mencoba menggunakan pid # konyol untuk membantu mencegah orang dari menyalin & menempel dan menghancurkan hidup mereka.
- CATATAN: Secara default postgres HANYA akan memungkinkan Anda untuk mematikan proses yang berjalan di bawah pendataan ANDA di USER,
- CATATAN: tetapi Anda sudah tahu itu.
Semoga ini membantu. =)
~ Jay