Apa yang saya lakukan ketika pg_cancel_backend tidak berfungsi?

8

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?


sumber

Jawaban:

8

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.

mage2k
sumber
8

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 killlangsung atau pg_ctl kill.

Suap
sumber
+1 PostgreSQL menggunakan proses per koneksi, sehingga Anda dapat mematikan suatu proses tanpa banyak bahaya yang mempengaruhi koneksi lain. Saya tidak yakin apakah ada kemungkinan korupsi data, tetapi saya benar-benar meragukannya.
David Pashley
Saya pikir mengirim kill -9 ke proses postgres adalah bencana, karena bisa membuat database dalam mode pemulihan yang mungkin mengeluarkannya dari komisi selama beberapa menit.
1
stackoverflow.com/questions/920956/... Sepertinya saya salah.
Bribles
Tautan itu berkaitan dengan pengiriman kill -9 ke server . Saya sedang berbicara tentang pid satu permintaan. Atau apakah itu hal yang sama?
2
@Bribles harap tambahkan peringatan ke pos Anda! SIGQUIT akan menyebabkan MASALAH SERIUS jika dicoba. Saya baru saja melakukannya dan itu menyebabkan banyak masalah - saya berharap saya bisa kembali ke masa lalu dan menghentikan diri saya dari menekan tombol Enter!
ADTC
3

jika Anda memiliki Postgres terbaru, Anda dapat mencobanya pg_terminate_backend.

Vitaly Kushner
sumber
1

suap benar dalam pernyataannya di atas ...

JIKA Anda mencoba ke SHUTDOWNserver, 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 Activepermintaan.

- 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 idledalam 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

JayRizzo
sumber