Việc hủy bỏ một quy trình VACUUM (AUTO) trong PostgreSQL có khiến tất cả công việc trở nên vô dụng không?


13

Trong một số trường hợp, và sau khi tạo ra một khối lượng lớn update, inserthoặc deletetừ một cái bàn, tôi đã bắt đầu VACUUM FULL ANALYZEđể đảm bảo rằng DB không bị quá tải. Làm điều đó trong cơ sở dữ liệu sản xuất đã cho tôi khám phá ra rằng đây không phải là một ý tưởng hay, bởi vì tôi có thể chặn bảng trong một thời gian dài. Vì vậy, tôi đã hủy quá trình, có thể thử chỉ VACUUM(không đầy đủ) hoặc để AUTOVACUUMsau này làm bất cứ điều gì nó có thể làm.

Câu hỏi là: nếu tôi dừng VACUUM hoặc AUTOVACUUM "giữa chừng", tất cả quá trình xử lý đã bị mất chưa?

Chẳng hạn, nếu VACUUMđã tìm thấy 1 M hàng chết và tôi dừng nó, liệu tất cả thông tin này có bị mất không? VACUUM có hoạt động theo cách giao dịch đầy đủ ("tất cả hoặc không có gì", giống như một số lượng rất lớn các quy trình PostgreQuery)?

Nếu VACUUM có thể bị gián đoạn một cách an toàn mà không làm mất tất cả công việc, có cách nào để làm cho vacuumcông việc tăng dần không? [Làm việc trong 100 ms, dừng lại, đợi 10 ms để cho phép không chặn phần còn lại của thế giới ... và cứ thế]. Tôi biết bạn có thể thực hiện một phần của việc này bằng cách điều chỉnh các tham số tự động, nhưng tôi đang suy nghĩ về khả năng kiểm soát điều này theo chương trình, để có thể thực hiện nó trong một số thời điểm nhất định / trong một số điều kiện nhất định.


LƯU Ý: Dừng / hủy / hủy quy trình có nghĩa trong bối cảnh này:

  • Nếu sử dụng pgAdmin, nhấn nút "Hủy truy vấn".
  • Nếu làm việc theo chương trình, hãy gọi pg_cattery_backend ().

Tôi cho rằng cả hai đều tương đương. Tôi chưa sử dụng bất kỳ lệnh kill shell / system-level nào.

Câu trả lời:


8

Công việc được thực hiện bởi VACUUM FULL bị gián đoạn sẽ bị mất hoàn toàn, vì nó sẽ chỉ đơn giản trở lại sử dụng phiên bản trước của bảng và loại bỏ phiên bản đang thực hiện của bảng.

Công việc được thực hiện bởi một VACUUM thông thường (không đầy đủ) có thể không bị mất hoàn toàn. Nó làm sạch các chỉ mục theo từng đợt và bất kỳ lô nào được làm sạch hoàn toàn sẽ không cần phải được làm sạch lại. Họ sẽ vẫn cần được kiểm tra lại, nhưng sẽ được tìm thấy sạch sẽ vào lần tới. Vì vậy, bạn có thể lưu một số IO viết mà sẽ không cần phải lặp lại.


1
Rất thích chi tiết hơn về điều này, đặc biệt là trên autovacuum. Tôi có các máy chủ bận rộn với nhiều cơ sở dữ liệu và đôi khi tự động có thể mất nhiều thời gian. Khi điều đó xảy ra, việc tạo một chỉ mục mới, chẳng hạn, là không thể vì autovacuum có khóa. Sẽ là lý tưởng trong một số trường hợp để tiêu diệt autovacuum và áp dụng chỉ số và sau đó hy vọng khi autovacuum chạy lại, nó không phải chạy trong thời gian gần như vậy. Bất kỳ cách nào để xem chi tiết về những gì autovacuum đã làm / đang làm với một bảng và các chỉ mục?
Kurt Koller

3
9.6 giới thiệu một quan điểm để theo dõi tiến trình chân không: postgresql.org/docs/civerse/static/proTHER-reporting.html . Tôi đã không chơi xung quanh với nó một mình, vì vậy không biết nó sẽ làm việc tốt như thế nào cho bạn. Autovacuum sẽ tự động nhường khóa, trừ khi nó được thực hiện để bọc xung quanh. Các cài đặt mặc định cho chế độ tự động được điều chỉnh rất nhiều, vì vậy nó có thể không chạy nhanh hơn vào lần tới chỉ vì nó được điều chỉnh với cùng tốc độ. Tôi thường xuyên đặt vacuum_cost_page_hitvacuum_cost_page_missvề không.
jjanes
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.