진공 정지 vs. 진공 완전


18

VACUUMPostgreSQL에서 이러한 유형의 차이점을 설명 할 수 있습니까 ?

나는 문서를 읽었지만 그것은 단지 FULL테이블 을 잠그고 FREEZE튜플을 "고정시킨다" 고 말합니다 . 나는 그것이 같다고 생각합니다. 내가 잘못?


문서를 읽었습니까? 그것은 당신이 읽은 것에 대한 링크를 포함시키는 완벽한 기회가 될 것입니다 ...
Erwin Brandstetter

답변:


12

다음은 간단한 답변입니다.

Vacuum full은 독점 잠금을 해제하고 빈 블록이 없도록 테이블을 재구성합니다 (현재 채우기 비율은 100 % 인 것으로 가정합니다).

진공 동결은 테이블 내용에 매우 특별한 트랜잭션 타임 스탬프를 표시하여 postgres에 진공 청소기로 청소할 필요가 없음을 알려줍니다. 다음으로이 고정 ID를 업데이트하면 사라집니다.

예를 들어, template0 데이터베이스는 변경되지 않으므로 정지됩니다 (기본적으로 연결할 수 없음).

autovacuum 데몬은 종종 데이터베이스와 해당 테이블을 검사하여 정리해야 할 항목을 확인합니다. 테이블이 진공 동결되고 업데이트되지 않은 경우 autovacuum 데몬은 단순히이를 통과합니다. 또한 postgresql의 "랩 어라운드"보호는 해당 테이블에서 시작되지 않습니다.

tl; dr 동결은 테이블을 autovac 유지 보수가 필요하지 않은 것으로 표시합니다. 다음 업데이트는 고정을 해제합니다.


그렇다면 VACUUM FREEZE테이블에 독점 잠금 이 필요합니까? 그렇지 않으면 활성 트랜잭션의 행을 전 세계에 갑자기 표시 할 위험이 있습니다. 나는 그것을 오해 할지도 모릅니다.
Parthian Shot

진공 동결이없고 진공이 가득 찼습니다.
Scott Marlowe

6

Jayadevan이 쓴 내용을 자세히 설명합니다.

Postgres가 트랜잭션을 처리하고 가시적 인 데이터를 추적하는 방법은 내부 트랜잭션 ID를 비교하는 것입니다. 그러나 이러한 트랜잭션은 조만간 32 비트 정수이므로 래핑되므로 새 트랜잭션은 과거에 작성된 것처럼 보이고 (따라서 현재 트랜잭션에서는 보이지 않아야 함) 오래된 트랜잭션은 미래에 수행되고있는 것처럼 보일 것입니다 (미래가 존재하지 않기 때문에 해당 데이터는 더 이상 표시되지 않습니다).

이 문제를 해결하기 위해 Postgres 가하는 일은이 랩 어라운드로 고통받을 위험이있을만큼 오래된 각 행을 항상 모든 트랜잭션보다 오래된 특수 트랜잭션 ID를 할당하는 것입니다. 유효한 트랜잭션 ID의 범위가 0에서 2147483647 인 것처럼 모든 현재 행의 트랜잭션 ID를 -1로 설정합니다.

그러나 진공은 기본적으로 재사용을 위해 빈 공간을 표시하기 때문에 변경된 데이터 페이지에서만 작동합니다.

무엇 VACUUM FREEZE그들이 그렇게 현재의 모든 행이 모든 새로운 거래에 대한 이전으로 간주됩니다, 수정되거나되지 않은 경우 기본적으로 상관없이 모든 페이지에 대한 트랜잭션 ID를 동결되지 않습니다.

그러나 버전 8.2부터는 VACUUM FREEZE더 이상 사용되지 않으며 사용해서는 안됩니다. 대신 매개 변수가 vacuum_freeze_table_ageautovacuum_freeze_max_age전체 검사 테이블에서 수행되고 전에 많은 트랜잭션이 발생할 수있는 방법을 지정합니다 (효과적으로 내부 할 VACUUM FREEZE테이블에).


3
문서 VACUUM FREEZE에서 더 이상 사용되지 않거나 감지 되지 않는 것은 어떻습니까?
dezso

흥미 롭군 8.2와 9.0 사이의 버전에서 수행되었습니다. 아마도 더 이상 사용되지 않는 기능이 더 이상 사용되지 않을 것입니다.
Jimmy Stenke

1

같은 질문을 할 때 대답에서 복사 / 붙여 넣기- "정규 진공은 재사용을 위해 빈 공간을 표시하고 관계가 끝날 때 빈 공간을 되 찾습니다. 따라서 빈 공간이 중간에 있으면 방금 재사용했습니다.

vacuum full은 모든 빈 공간을 회수하는 관계를 압축합니다. 독점 잠금이 필요하며 이로 인해 일반적으로 프로덕션 시스템에 좋지 않습니다.

따라서 REGULAR 진공의 목적은 테이블에서 공간을 회수하는 것이 아니라 나중에 재사용 할 수 있도록하는 것입니다. 진공 FULL의 목적은 발생하는 동안 독점 잠금 및 DB 성능을 희생하여 모든 낭비되는 공간을 회수하는 것입니다.

따라서 정기적 인 진공은 모든 것을 회수하도록 설계되지 않았으므로 실제로 모든 것을 회수하지 않았다는 사실에 놀라지 않아야합니다. 더 많은 무작위 삭제 등을 통해 더 큰 데이터 세트를 실험 해보면 일반 진공 청소기와 완전 진공 청소기의 차이를 확인할 수 있습니다. "

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

이것에 추가하기 위해 vacuum full은 실제로 테이블의 새 파일을 만듭니다 (기존 파일의 크기가 0으로 줄어 듭니다). 따라서 OS는 공간을 확보 할 수 있습니다.


2
질문은 VACUUM FREEZE특히 요구합니다 .
Erwin Brandstetter

True- "PostgreSQL에서이 진공 유형의 차이점"-진공 유형의 차이점에 대한 질문이 있다고 생각했습니다.
Jayadevan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.