Nếu tôi có một truy vấn Postgres dài hạn và "kill [pid]" thông thường không hoạt động và pg_cattery_backend không hoạt động, tôi nên làm gì?
Nếu tôi có một truy vấn Postgres dài hạn và "kill [pid]" thông thường không hoạt động và pg_cattery_backend không hoạt động, tôi nên làm gì?
Câu trả lời:
Bạn không bao giờ nên giết -9 bất kỳ quy trình xử lý hậu kỳ nào trừ khi mục tiêu của bạn là đưa toàn bộ máy chủ xuống một cách cưỡng bức. Bạn có thể giết bất kỳ quy trình nào không đáp ứng với lệnh gọi pg_cattery_backend () từ trình bao với
kill <pid>
tức là không -9. Lưu ý rằng tôi đã thấy một vài lần thậm chí nó không hoạt động do quá trình bị treo chờ trong một số vòng lặp cho dữ liệu trên kết nối mạng. Nếu tôi nhớ lại một cách chính xác, việc giết quá trình khách hàng sẽ giải quyết vấn đề đó.
http://www.postgresql.org/docs/civerse/static/server-shutdown.html
pg_cattery_backend tương đương với việc gửi SIGINT đến quy trình.
pg_terminate_backend tương tự cho SIGTERM, nhưng nếu pg_cattery_backend không hoạt động tôi không hiểu tại sao pg_terminate_backend sẽ.
Nếu bạn đã thử các tùy chọn đó, bạn có thể thử SIGQUIT. Các tài liệu nói, " Điều này chỉ được khuyến nghị trong trường hợp khẩn cấp. "
(Nếu bạn ghét dữ liệu của mình và hy vọng nó chết, bạn có thể sử dụng SIGKILL. Nhưng tôi sẽ không.)
Bạn có thể sử dụng kill
trực tiếp hoặc pg_ctl kill
.
thay vào đó, nếu bạn có một Postgres gần đây, bạn có thể thử pg_terminate_backend
thay thế.
hối lộ là chính xác trong tuyên bố của mình ở trên ...
NẾU bạn đang cố gắng đến SHUTDOWN
máy chủ, mặc dù đối với tôi:
Tôi chỉ đang cố gắng loại bỏ Cơ sở dữ liệu / Lược đồ đã nghỉ hưu, mà vẫn có một kết nối còn sót lại mà nó sẽ không cho phép.
Để trả lời câu hỏi của bạn,
Nếu tôi có một truy vấn Postgres dài hạn ...
pg_cattery_backend không hoạt động ...
tôi nên làm gì?
KHÔNG LIÊN QUAN để tắt máy chủ bằng mọi cách.
Tôi cũng đã thấy hành vi này pg_cancel_backend()
không hoạt động. Và muốn chia sẻ giải pháp làm việc của tôi.
Tôi chưa thấy một vấn đề nào cho đến nay, với bất kỳ loại "mất" dữ liệu nào.
Một lần nữa, tôi cũng không cố giết Active
các truy vấn.
- Tôi đang đăng nhập với tên NGƯỜI DÙNG "A" với phiên hoặc PID là 777777.
- Và sẽ thử và buộc ngắt kết nối một phiên khác khỏi USER "A" mở dưới dạng 123456789
- Đó là một kết nối ngủ, và đó là lý do tại sao tôi cũng tìm kiếm
idle
trong các truy vấn của mình dưới đây.
SELECT *
FROM pg_stat_activity
WHERE pid = 123456789
AND STATE = 'idle';
- Cố gắng 1
SELECT pg_cancel_backend(pid)
FROM pg_stat_activity
WHERE pid = 123456789
AND STATE = 'idle';
- Điều thú vị là Kết quả cho thấy việc hủy bỏ là ĐÚNG nhưng vẫn tồn tại.
SELECT *
FROM pg_stat_activity
WHERE pid = 123456789
AND STATE = 'idle';
- Cố gắng 2
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE pid = 123456789
AND STATE = 'idle';
- Và bây giờ nó không tồn tại ..
SELECT *
FROM pg_stat_activity
WHERE pid = 123456789
AND STATE = 'idle';
- LƯU Ý: Tôi đã cố gắng sử dụng pid # lố bịch để giúp mọi người sao chép và dán và phá hỏng cuộc sống của họ.
- LƯU Ý: Theo mặc định, các postgres sẽ CHỈ cho phép bạn tiêu diệt các tiến trình đang chạy trong phần đăng nhập CỦA BẠN,
- LƯU Ý: nhưng bạn đã biết điều đó rồi.
Hi vọng điêu nay co ich. =)
~ Jay