Làm cách nào để lấy lại không gian được lấy bởi một chỉ mục được xây dựng một phần và bị chấm dứt khi mất điện


9

Tôi đang chạy postgres (postgis) 9.4.2 trên máy mac (10.10.4).

Tôi đã có một vài bàn lớn (vài TB).

Trong quá trình xây dựng chỉ mục trên một trong số đó mất khoảng một tuần, tôi đã xem sự sụt giảm không gian HD có sẵn như bạn mong đợi gần đến thời điểm chỉ số sẽ kết thúc khi mất điện kéo dài hơn đơn vị pin và hệ thống đi xuống. Tôi đã tắt bộ đệm và fillfactor=100trong quá trình xây dựng vì đó là nguồn dữ liệu tĩnh. Khi khởi động lại, không gian còn trống trên ổ đĩa chính xác là nơi nó đã ở gần cuối của quá trình xây dựng chỉ mục. Phân tích chân không không giải phóng không gian.

Tôi đã thử thả bàn và ăn lại, và điều đó đã không làm rơi không gian. Bây giờ tôi đang ở một nơi mà tôi không có đủ không gian để xây dựng chỉ mục.

Có phải các tệp được tạo trong quá trình xây dựng chỉ mục bị kẹt trong một số limbo nơi hệ thống không thể bị xóa do hệ thống bị hỏng trong thời gian mất điện?

Khi tôi nhìn vào kích thước bảng + chỉ mục trong db (là dữ liệu duy nhất trên ổ đĩa đó), chúng thêm tối đa khoảng 6TB . Ổ đĩa có dung lượng 8TB và còn lại dưới 500 GB trên ổ đĩa, vì vậy có vẻ như đã mất khoảng 1,5TB ở đâu đó có kích thước tương đương với chỉ số.

Có ý kiến ​​gì không?


Là chỉ mục vẫn được liệt kê với một truy vấn như thế này? SELECT r.relname, r.relkind, n.nspname FROM pg_class r INNER JOIN pg_namespace n ON r.relnamespace = n.oid WHERE relkind = 'i';
Kassandry

Không, nó không hiển thị trong kết quả từ truy vấn đó.
dkitchel

1
Bạn có bất cứ điều gì trong danh sách SELECT indexrelid::regclass, indrelid::regclass FROM pg_catalog.pg_index WHERE NOT indisvalid;cung cấp cho bạn?
dezso

Không, điều đó đến trống rỗng.
dkitchel

Câu trả lời:


5

Thông thường, chúng tôi hy vọng rằng khi postgres được khởi động lại, quá trình khôi phục sự cố sẽ xóa các tệp liên quan đến chỉ mục rollback'ed khỏi thư mục dữ liệu.

Hãy giả sử rằng nó không hoạt động, hoặc ít nhất là nó phải được kiểm tra thủ công.

Danh sách các tệp nên có trong datadir có thể được thiết lập với một truy vấn như thế này:

select pg_relation_filenode(oid)
   from pg_class
  where relkind in ('i','r','t','S','m')
    and reltablespace=0
  order by 1;

reltablespace=0dành cho không gian bảng mặc định. Nếu chỉ mục có vấn đề được tạo trong một không gian bảng không mặc định, thì chỉ mục này 0phải được thay thế bằng OID của nó pg_tablespace.

i, r, t, S, m relkindtương ứng với các chỉ mục, bảng, không gian bánh mì nướng, trình tự, các khung nhìn cụ thể hóa. Tất cả các đối tượng này có dữ liệu của họ trong các tệp có tên trùng khớp pg_relation_filenode(oid).

Trên đĩa, các tập tin dữ liệu dưới $PGDATA/base/oid/nơi oidoidcơ sở dữ liệu thu được bằng select oid,datname from pg_database. Nếu chúng ta không nói về không gian bảng mặc định, basethay PG_version_somelabelvào đó sẽ được thay thế .

Liệt kê và sắp xếp các tệp phù hợp với relfilenodes trong thư mục đó:

ls | grep -E '^[0-9]+$' | sort -n > /tmp/list-of-relations.txt

(thực tế chỉ giữ phân đoạn đầu tiên cho các mối quan hệ lớn hơn 1Gb. Nếu có các phân đoạn kéo dài không được gắn với bất cứ điều gì, chúng nên được xem xét riêng)

và diff tệp đó với kết quả của truy vấn ở trên.

Nếu có các tệp dữ liệu còn sót lại không tương ứng với bất kỳ đối tượng nào mà db biết, chúng sẽ xuất hiện trong diff đó.


Tuyệt vời! Tôi tìm thấy 1 tệp trong datadir không hiển thị trong danh sách chọn. Tôi có thể gỡ bỏ tập tin đó một cách an toàn không?
dkitchel

Trên thực tế, nó tương ứng với khoảng 800 tệp có số lần lặp sau dấu chấm - tất cả giống như 499807.484, v.v ... Tôi có thể gỡ bỏ các tệp đó một cách an toàn không?
dkitchel

@dkitchel: đó sẽ là các phân đoạn 1Gb cho mỗi chỉ số khổng lồ. Có thể kiểm tra xem dấu thời gian của chúng có trùng với khi chỉ mục tạo đang chạy không. Đối với việc xóa chúng, tôi hy vọng lý do của tôi ở trên là chính xác, nhưng đó là dữ liệu của bạn, vì vậy cuối cùng đó là quyết định của bạn!
Daniel Vérité

Có, dấu thời gian phù hợp với khi chỉ mục được xây dựng và tổng kích thước tệp tương ứng với mức độ lớn của chỉ mục. Lý luận của bạn có vẻ vững chắc. Tôi sẽ cho nó đi với sự tự tin cao. Cảm ơn rất nhiều.
dkitchel

Chỉ cần theo dõi để những người khác thấy mình trong tình trạng khó khăn tương tự có thể sử dụng giải pháp của @ DanielVerite một cách tự tin. Giải pháp của anh ấy thực sự đã làm việc hoàn hảo cho tôi.
dkitchel
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.