Câu hỏi PostgreSQL LRI: hủy bỏ tuyên bố do xung đột với phục hồi


Tôi nhận được lỗi sau khi chạy truy vấn trên db PostgreSQL ở chế độ chờ. Truy vấn gây ra lỗi hoạt động tốt trong 1 tháng nhưng khi bạn truy vấn hơn 1 tháng thì kết quả lỗi.

ERROR: canceling statement due to conflict with recovery
Detail: User query might have needed to see row versions that must be removed

Bất kỳ đề xuất nào về cách giải quyết? Cảm ơn


76
2018-01-29 21:15


gốc




Các câu trả lời:


Các truy vấn chạy trên máy chủ dự phòng nóng hơi phức tạp - nó có thể thất bại, bởi vì trong khi truy vấn một số hàng cần thiết có thể được cập nhật hoặc xóa trên chính. Là một tiểu học không biết rằng một truy vấn được bắt đầu vào thứ cấp nó nghĩ rằng nó có thể làm sạch (chân không) phiên bản cũ của các hàng của nó. Sau đó, trung học phải phát lại việc dọn dẹp này và buộc phải hủy tất cả các truy vấn có thể sử dụng các hàng này.

Các truy vấn dài hơn sẽ bị hủy bỏ thường xuyên hơn.

Bạn có thể làm việc xung quanh điều này bằng cách bắt đầu một giao dịch đọc lặp lại trên chính mà làm một truy vấn giả và sau đó ngồi nhàn rỗi trong khi một truy vấn thực được chạy trên thứ cấp. Sự hiện diện của nó sẽ ngăn chặn hút bụi các phiên bản hàng cũ trên phiên bản chính.

Thông tin thêm về chủ đề này và cách giải quyết khác được giải thích trong Hot Standby - Xử lý xung đột truy vấn trong tài liệu.


48
2018-01-29 23:51



Đối với người dùng PostgreSQL 9.1+: xem eradmanCâu trả lời dưới đây cho một giải pháp thực tế. - Zoltán


Không cần phải bắt đầu các giao dịch nhàn rỗi trên máy chủ. Trong postgresql-9.1, cách trực tiếp nhất để giải quyết vấn đề này là bằng cách thiết lập

hot_standby_feedback = on

Điều này sẽ làm cho các bậc thầy nhận thức được các truy vấn dài hạn. Từ tài liệu:

Tùy chọn đầu tiên là đặt tham số hot_standby_feedback, ngăn chặn   VACUUM từ việc loại bỏ các hàng gần đây đã chết và do đó các xung đột dọn dẹp không xảy ra.

Tại sao đây không phải là mặc định? Thông số này đã được thêm sau lần đầu tiên thực hiện và đó là cách duy nhất mà một chế độ chờ có thể ảnh hưởng đến chủ.


56
2018-02-10 19:34



Thông số này phải được đặt ở chế độ chờ. - Steve Kehlet
Có một số nhược điểm cho chủ trong trường hợp này Hot-Standby-Feedback - Eugene Liskovets
Kiểm tra phản ứng của tôi, điều này có vẻ không phải là một thực hành tốt - Gilles Quenot


Như đã nêu đây trong khoảng hot_standby_feedback = on :

Vâng, bất lợi của nó là chế độ chờ có thể làm nổi bật chủ,   điều này cũng có thể gây ngạc nhiên cho một số người

đây:

Với cài đặt max_standby_streaming_delay là gì? Tôi thà   mặc định là -1 hơn hot_standby_feedback mặc định. Bằng cách đó những gì   bạn thực hiện ở chế độ chờ chỉ ảnh hưởng đến chế độ chờ


Vì vậy, tôi đã thêm

max_standby_streaming_delay = -1

Và không nhiều pg_dump lỗi cho chúng tôi, cũng không phải chủ nhân sưng lên :)


37
2017-10-22 13:58



@ lennard, điều này làm việc cho tôi. Tôi đã thêm cấu hình này vào postgresql.conf của slave, sau đó khởi động lại slave. - Ardee Aram
Bạn có thể nhận được bản sao không bị lag theo cách này, tất nhiên. Và nếu bạn đang sử dụng một khe nhân rộng để kết nối bản sao để làm chủ, điều đó có thể dẫn đến việc giữ xlog quá mức trên máy chủ, do đó, nó thực sự chỉ khả thi nếu bạn đang sử dụng tính năng lưu trữ WAL. - Craig Ringer
Làm thế nào thiết lập này trên AWS RDS? - Kris MP
@KrisMP Sử dụng psql - Yehonatan
@KrisMP trong nhóm thông số - docs.aws.amazon.com/AmazonRDS/latest/UserGuide/… - r3m0t


Không cần chạm vào hot_standby_feedback. Như những người khác đã đề cập, hãy đặt nó thành on có thể sưng lên chủ. Hãy tưởng tượng mở giao dịch trên một nô lệ và không đóng nó.

Thay vào đó, hãy đặt max_standby_archive_delay và max_standby_streaming_delay với một số giá trị lành mạnh:

# /etc/postgresql/10/main/postgresql.conf on a slave
max_standby_archive_delay = 900s
max_standby_streaming_delay = 900s

Theo cách này, các truy vấn về các nô lệ có thời lượng dưới 900 giây sẽ không bị hủy. Nếu khối lượng công việc của bạn yêu cầu truy vấn dài hơn, chỉ cần đặt các tùy chọn này thành giá trị cao hơn.


15
2017-12-05 19:33





Dữ liệu bảng trên máy chủ nô lệ dự phòng nóng được sửa đổi trong khi truy vấn chạy dài đang chạy. Một giải pháp (PostgreSQL 9.1+) để đảm bảo rằng dữ liệu bảng không được sửa đổi là tạm ngừng sao chép và tiếp tục sau khi truy vấn:

select pg_xlog_replay_pause(); -- suspend
select * from foo; -- your query
select pg_xlog_replay_resume(); --resume

4
2017-10-05 08:56



Điều này đòi hỏi quyền superuser. Vì vậy, nó có thể không phải là một giải pháp trong một số trường hợp. - Joao Baltazar