Database/PostgreSQL

[PostgreSQL] Vacuum 이란?

요체크다 2020. 12. 24. 14:20
반응형

1. Vacuum 이란?

 Vacuum은 DB의 오래된 영역을 재사용하거나 정리 해주는 프로세스입니다.

PostgreSQL에서 특정 Row를 업데이트 할 경우, 디스크 상의 해당 Row를 물리적으로 업데이트하여 사용하지 않고, 새로운 영역을 할당해 쓰게 됩니다.

 즉, Update나 Delete 한다고 해서, 해당영역이 자동으로 재사용되거나 사라지지 않는다. 이러한, 오래된 영역을 재사용하거나 정리해주는 명령어가 Vacuum 입니다.

 

 

2. Vacuum 종류

1) Vacuum
  - 삭제 된 데이터나 Update된 데이터의 이전 버전을 마킹 하여 그 공간을 다시 사용할 수 있게 해 주는 기본 Vacuum 입니다.

 

2) Vacuum Freeze
  - 삭제 된 데이터만이 아니라 남아있는 데이터에 대해서도 XID를 2로 변경해 주어 앞으로 XID wrap around가 발생하더라도 문제가 없도록 해 줍니다.

 

3) Vacuum (prevent wrap around)
  - XID Wrap around가 다가오는 상황에서 아직 freeze 되지 않은 데이터가 남아 있을 경우 강제로 vacuum freez를 시도 하는데 이 때 실행되는 vacuum 작업이 VACUUM (prevent wrap around) 입니다.

 

4) Vacuum Full
  - 삭제된 데이터를 마킹만 하는게 아니라 아예 정상적인 데이터만으로 테이블을 새로 만들어서 빈공간까지 회수하는 작업, Table 전체에 Lock을 걸기 때문에 운영중에 실행하면 안됩니다.

 

5) Auto Vacuum
  - 내부 알고리즘으로 필요에 따라 자동으로 실행되는 Vacuum 입니다.

  - 기본적으로 실시간(주기적)으로 Vacuum 작업(ex, vacuum만 실행, vacuum full아님) 실시하며, autovacuum_freeze_max_age에 도달하면 강제로 Vacuum 작업(ex, vacuum freeze)을 실시하게 됩니다.

 

 

3. Vacuum 의 중요성

1) 변경 또는 삭제된 자료들이 차지하는 디스크 공간 재사용하기 위한 디스크 공간을 확보해 줍니다.

2) Postgresql 쿼리 실행 계획기가 사용할 통계 정보 갱신할 필요가 있어 자동적으로 갱신해 줍니다.
  - 쿼리 실행 계획기는 쿼리의 좋은 실행 계획을 짜기 위해서 각 테이블에 저장된 자료를 바탕으로 수집된 통계 정보를 이용 됩니다.

3) index 전용 검색 성능을 향상하는데 이용하는 실자료(Visibility Map, vm) 정보를 갱신하는 작업을 해줍니다.

4) 트랜잭션 ID(XID) 겹침이나, 다중 트랜잭션 ID 겹침 상황으로 오래된 자료가 손실 될 가능성을 방지하여 줍니다.
  - XID 겹침오류(wraparound)을 방지하기 위해서 주기적으로 Vacuum이 반드시 실행 되어야 하며, XID 겹침방지를 위해 Vacuum은 오래된 XID 값을 FrozenXID(XID 2)로 바꾸는 방식으로 XID 겹침 오류를 방지하게 됩니다. (vacuum_freeze_min_age 파라미터값에 도달하면 Vacuum이 해당 옛 XID를 FrozenXID로 변경한다.)
 - 이렇게 오래된 XID 값을 "영구 보관용" 자료로 바꿔 놓으면, 트랜잭션 XID 비교 작업에서 항상 제외 되기 때문에, XID 겹침 오류를 피해갈 수 있게 되며, 결국 이 XID 변경 작업을 바로 Vacuum 명령으로 하게 됩니다.

 

 

4. Vacuum 명령어

1) 옵 션
 가) 표준 Vacuum (옵션 없이 수행)
  - Vacuum 수행 중에도, SELECT, DML 작업이 가능 합니다.
  - 단순히 사용 가능한 공간을 Free Space Map에 반환되는 것이며, 실제 다스크 공간 확보 안됩니다.
 나) Full
  - 디스크상의 여유공간이 확보됩니다. 하지만 시간이 오래 걸리며, 수행되는 테이블에 대한 exclusive Lock이 발생하게 됩니다.
  - 데이터베이스가 잠김(Lock)처리가 되므로 운영중인 데이터베이스에서는 Full 옵션으로 사용 금지.
 다) Analyze
  - 통계 메타데이터를 업데이트하므로 쿼리 옵티마이저가 더 정확한 쿼리 계획을 생성할 수 있어 vacuum 명령어시 같이 실행하는 것이 좋습니다.

 

2) 명령어
 가) DB 전체 풀 실행
   #vacuum full analyze;

 

 나) DB 전체 간단하게 실행
   #vacuum verbose analyze;

 

 다) 특정 테이블만 간단하게 실행
   #vacuum analyse [테이블 명];

 

 라) 특정 테이블만 풀 실행
   #vacuum full [테이블명];

 

 

반응형