Tôi đã nâng cấp Postgres DB 9.3.2 -> 10.5 bằng pg_upTHER (tại chỗ). Tôi đã làm mọi thứ theo tài liệu và hướng dẫn được cung cấp bởi pg_upTHER. Mọi thứ đều ổn nhưng sau đó tôi nhận ra rằng các chỉ mục không được sử dụng trong một trong các bảng (có thể các bảng khác cũng bị ảnh hưởng).
Vì vậy, tôi đã bắt đầu một cái ANALYZE
trên bàn hôm qua vẫn đang chạy (trong hơn 22h) ...!
Câu hỏi: Có bình thường ANALYZE
khi có thời gian thực hiện lâu như vậy không?
Bảng chứa khoảng 30M hồ sơ. Cấu trúc là:
CREATE TABLE public.chs_contact_history_events (
event_id bigint NOT NULL
DEFAULT nextval('chs_contact_history_events_event_id_seq'::regclass),
chs_id integer NOT NULL,
event_timestamp bigint NOT NULL,
party_id integer NOT NULL,
event integer NOT NULL,
cause integer NOT NULL,
text text COLLATE pg_catalog."default",
timestamp_offset integer,
CONSTRAINT pk_contact_history_events PRIMARY KEY (event_id)
);
ALTER TABLE public.chs_contact_history_events OWNER to c_chs;
CREATE INDEX ix_chs_contact_history_events_chsid
ON public.chs_contact_history_events USING hash (chs_id)
TABLESPACE pg_default;
CREATE INDEX ix_chs_contact_history_events_id
ON public.chs_contact_history_events USING btree (event_id)
TABLESPACE pg_default;
CREATE INDEX ix_history_events_partyid
ON public.chs_contact_history_events USING hash (party_id)
TABLESPACE pg_default;
CẬP NHẬT:
Tôi đã chạy truy vấn bên dưới để có được các quy trình hiện đang chạy và nhận được nhiều kết quả thú vị hơn:
SELECT pid, now() - pg_stat_activity.query_start AS duration, query, state
FROM pg_stat_activity
WHERE (now() - pg_stat_activity.query_start) > interval '5 minutes'
AND state = 'active';
Có vẻ như các nhiệm vụ bảo trì và giải trí đồng thời của bảng chỉ số bị đóng băng!
Vì vậy, câu hỏi tiếp theo: có an toàn để hủy bỏ các quy trình? Và phải làm gì tiếp theo? IMO dừng tất cả chúng và khởi động lại việc tạo chỉ mục sẽ là cần thiết nhưng tôi không chắc chắn.
PHỤ LỤC 1
Có thể các lỗi liên quan đã được sửa trong v9:
9.3.7 và 9.4.2 Khắc phục lỗi có thể xảy ra trong quá trình tách nhóm chỉ số băm, nếu các quy trình khác đang sửa đổi chỉ mục đồng thời
9.3.18 và 9.4.13 và 9.5.8 và 9.6.4 Khắc phục tham nhũng xác suất thấp của bảng băm khóa biến vị ngữ được chia sẻ trong các bản dựng Windows
9.5.4 Khắc phục việc xây dựng các chỉ mục băm lớn (lớn hơn shared_buffers) Đường dẫn mã được sử dụng cho các chỉ mục lớn có lỗi gây ra các giá trị băm không chính xác được chèn vào chỉ mục, do đó các tìm kiếm chỉ mục tiếp theo luôn thất bại, ngoại trừ các bộ dữ liệu được chèn vào chỉ mục sau khi xây dựng ban đầu.
Có thể các lỗi liên quan được sửa trong v10:
10.2 Khắc phục lỗi không đánh dấu siêu dữ liệu của chỉ số băm bẩn sau khi thêm trang tràn mới, có khả năng dẫn đến tham nhũng chỉ mục
Ngăn chặn lỗi hết bộ nhớ do sự tăng trưởng quá mức của các bảng băm đơn giản
Và cuối cùng nhưng không kém phần quan trọng khiến tôi lo ngại (vì một bản nâng cấp dường như không thực tế trên môi trường sản xuất):
10.6 Tránh vượt quá siêu dữ liệu của chỉ số băm khi BLCKSZ nhỏ hơn mặc định
Sửa lỗi cập nhật tổng kiểm tra trang bị mất trong chỉ mục băm
PHỤ LỤC 2
Hướng dẫn nâng cấp trong v10:
Các chỉ mục băm phải được xây dựng lại sau pg_upTHER-ing từ bất kỳ phiên bản PostgreQuery chính nào trước đó
Cải thiện chỉ số băm lớn đòi hỏi yêu cầu này. pg_upTHER sẽ tạo một tập lệnh để hỗ trợ việc này.
Lưu ý rằng tôi đã chạy tập lệnh đó tất nhiên tại thời điểm nâng cấp.
CREATE INDEX CONCURRENTLY
quá trình, dường như là thủ phạm ở đây. Sau đó, nếu hướng dẫn ANALYZE
và autovacuum
vẫn không hoàn thành sau một thời gian, hãy giết chúng đi. Sau đó, tôi sẽ loại trừ RAM bị lỗi trên máy chủ. Sau đó, tôi sẽ loại bỏ hoàn toàn tất cả các chỉ mục băm, khởi động lại cụm DB (nếu đó là một tùy chọn) và nâng cấp lên Postgres 10.6 mới nhất (hai bản sửa lỗi nhỏ hơn cho các chỉ mục băm) hoặc 11.1. Sau đó tạo lại tất cả các chỉ mục băm, không CONCURRENTLY
.
Starting with PostgreSQL 10, a major version is indicated by increasing the first part of the version, e.g. 10 to 11. Before PostgreSQL 10, a major version was indicated by increasing either the first or second part of the version number, e.g. 9.5 to 9.6.