Tôi phải làm gì khi pg_cattery_backend không hoạt động?


8

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:


8

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 đề đó.


8

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 killtrực tiếp hoặc pg_ctl kill.


+1 PostgreSQL sử dụng một quy trình trên mỗi kết nối, do đó bạn có thể giết chết một quy trình mà không có nhiều nguy cơ ảnh hưởng đến các kết nối khác. Tôi không chắc có bất kỳ cơ hội tham nhũng dữ liệu nào không, nhưng tôi thực sự nghi ngờ điều đó.
David Pashley

Tôi nghĩ rằng việc gửi kill -9 đến một quá trình postgres là thảm họa, ở chỗ nó có thể đưa cơ sở dữ liệu vào chế độ phục hồi, điều này có thể khiến nó ngừng hoạt động trong nhiều phút.


Liên kết đó liên quan đến việc gửi kill -9 đến máy chủ . Tôi đang nói về một truy vấn duy nhất. Hay đó là những điều tương tự?

2
@Bribles vui lòng thêm một cảnh báo cho bài viết của bạn! SIGQUIT sẽ gây ra VẤN ĐỀ NGHIÊM TRỌNG nếu đã thử. Tôi vừa mới làm và nó đã gây ra rất nhiều vấn đề - tôi ước tôi có thể quay ngược thời gian và ngăn mình khỏi việc nhấn phím Enter đó!
ADTC

3

thay vào đó, nếu bạn có một Postgres gần đây, bạn có thể thử pg_terminate_backendthay thế.


1

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 SHUTDOWNmá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 Activecá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 idletrong 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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.