VACUUM FREEZE so với VACUUM FULL


18

Ai đó có thể giải thích sự khác biệt giữa các loại này VACUUMtrong PostgreSQL không?

Tôi đọc tài liệu nhưng nó chỉ nói rằng FULLkhóa các bảng và FREEZE"đóng băng" các bộ dữ liệu. Tôi nghĩ đó là như nhau. Tôi có lầm không?


Bạn đã đọc tài liệu? Đó sẽ là một cơ hội hoàn hảo để bao gồm một liên kết đến những gì bạn đã đọc ...
Erwin Brandstetter

Câu trả lời:


12

Đây là một câu trả lời ngắn gọn súc tích.

Máy hút bụi lấy ra một khóa độc quyền và xây dựng lại bảng để nó không có khối trống (chúng tôi sẽ giả vờ hệ số lấp đầy là 100% ngay bây giờ).

Đóng băng chân không đánh dấu nội dung của bảng với dấu thời gian giao dịch rất đặc biệt cho biết các postgres rằng nó không cần phải được hút bụi, bao giờ hết. Cập nhật tiếp theo id đông lạnh này sẽ biến mất.

Chẳng hạn, cơ sở dữ liệu template0 bị đóng băng vì nó không bao giờ thay đổi (theo mặc định bạn không thể kết nối với nó.)

Mỗi lần như vậy, trình nền tự động sẽ kiểm tra cơ sở dữ liệu và các bảng của nó để xem những gì cần được hút bụi. Nếu một bảng bị đóng băng chân không và sau đó không bao giờ được cập nhật, trình nền tự động sẽ chỉ đơn giản là vượt qua nó. Ngoài ra, bảo vệ "bọc xung quanh" trong postgresql cũng sẽ không bao giờ được sử dụng trên bảng đó.

tl; dr đóng băng đánh dấu một bảng là không cần bất kỳ bảo trì autovac. Bản cập nhật tiếp theo sẽ giải phóng nó.


Vì vậy, có VACUUM FREEZEyêu cầu một khóa độc quyền trên bàn? Có vẻ như nó nên, nếu không, bạn có nguy cơ đột nhiên tạo ra các hàng từ các giao dịch đang hoạt động trên toàn cầu. Tôi có thể đang hiểu nhầm nó ...
Parthian Shot

Không đóng băng chân không, chân không đầy đủ không.
Scott Marlowe

6

Để giải thích thêm những gì Jayadevan đã viết.

Cách mà Postgres làm việc với các giao dịch và để theo dõi dữ liệu hiển thị là bằng cách so sánh ID giao dịch nội bộ. Tuy nhiên, vì các giao dịch đó là số nguyên 32 bit, sớm hay muộn chúng sẽ bao quanh, và do đó, giao dịch mới sẽ trông giống như được thực hiện trong quá khứ (và do đó có thể nhìn thấy trong một giao dịch hiện tại trong khi không nên) các giao dịch cũ hơn sẽ trông giống như chúng đang được thực hiện trong tương lai (và vì tương lai chưa tồn tại, dữ liệu đó sẽ không còn hiển thị nữa).

Những gì Postgres làm để khắc phục vấn đề đó là chỉ định mỗi hàng đủ tuổi để có nguy cơ bị ảnh hưởng bởi một id giao dịch đặc biệt luôn cũ hơn mọi giao dịch. Bạn có thể thấy nó như thể id giao dịch hợp lệ nằm trong khoảng từ 0 đến 2147483647, nó sẽ đặt id giao dịch cho tất cả các hàng hiện tại thành -1.

Tuy nhiên, vì cơ bản là để đánh dấu không gian trống để sử dụng lại, nó chỉ hoạt động trên các trang dữ liệu đã được thay đổi.

Điều VACUUM FREEZEcơ bản là đóng băng id giao dịch cho tất cả các trang cho dù chúng có được sửa đổi hay không, để tất cả các hàng hiện tại sẽ được xem là cũ đối với tất cả các giao dịch mới.

Tuy nhiên, kể từ phiên bản 8.2 VACUUM FREEZEđã bị phản đối và không nên được sử dụng. Thay vào đó là các tham số vacuum_freeze_table_ageautovacuum_freeze_max_agechỉ định có bao nhiêu giao dịch có thể xảy ra trước khi quá trình quét hoàn thành được thực hiện trên bảng (thực hiện một cách nội bộ VACUUM FREEZEtrên bảng).


3
Làm thế nào mà các tài liệu không đề cập đến VACUUM FREEZEviệc bị phản đối / không được khuyến khích?
dezso

Hấp dẫn. Nó đã làm cho các phiên bản giữa 8.2 và 9.0. Có lẽ họ đã loại bỏ sự phản đối vì nó có thể là một tính năng tốt để có.
Jimmy Stenke

1

Sao chép / dán từ câu trả lời khi tôi hỏi cùng một câu hỏi - "chân không thông thường đánh dấu khoảng trống để sử dụng lại và lấy lại khoảng trống ở cuối mối quan hệ. Vì vậy, nếu khoảng trống ở giữa, v.v. khai hoang vừa tái sử dụng.

chân không đầy đủ tác động một mối quan hệ đòi lại tất cả các không gian trống. Nó đòi hỏi một khóa độc quyền và có hại cho các hệ thống sản xuất nói chung vì điều này.

Vì vậy, mục đích của chân không REGULAR không phải là để lấy lại không gian từ các bảng mà là để nó có sẵn để tái sử dụng sau này. Mục đích của FULL chân không là để lấy lại tất cả không gian bị lãng phí với chi phí của một khóa độc quyền và hiệu suất db trong khi nó đang diễn ra.

Vì vậy, vì máy hút bụi thông thường không được thiết kế để lấy lại mọi thứ mà bạn không nên ngạc nhiên rằng trên thực tế, nó không đòi lại mọi thứ. Hãy thử trải nghiệm trên các bộ dữ liệu lớn hơn với nhiều lần xóa ngẫu nhiên hơn, v.v ... để thấy sự khác biệt giữa chân không thông thường và toàn bộ. "

http://postgresql.1045698.n5.nabble.com/vacuuming-doubt-td5782828.html

Để thêm vào điều này, chân không đầy đủ sẽ thực sự tạo các tệp mới cho bảng (các tệp hiện có sẽ bị thu nhỏ về 0). Do đó, hệ điều hành có thể lấy lại không gian.


2
Câu hỏi yêu cầu VACUUM FREEZEđặc biệt.
Erwin Brandstetter

Đúng - "sự khác biệt giữa các loại chân không trong PostgreSQL" - Tôi nghĩ câu hỏi là về sự khác biệt giữa các loại chân không.
Jayadevan
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.