[PostgreSQL] Vacuum 이란?

목적


Vacuum 이란?

  • Vacuum 은 다른 RDBMS에 없는 PostgreSQL의 고유의 명령입니다.
  • PostgreSQL에서 특정 Row를 업데이트 할 경우, 디스크 상의 해당 Row를 물리적으로 업데이트하여 사용하지 않고, 새로운 영역을 할당해 사용합니다.
  • 즉, Update 나 Delete 한다고 해서 해당 영역이 자동으로 재사용되거나 사라지지 않습니다.
  • 이렇게 오래된 영역을 재사용하거나 정리해주는 명령어가 Vacuum 입니다.
  • shell command 상의 vacuumdb 라는 명령으로 여러가지 옵션으로 정리할 수도 있고, 서버 구동시 postgresql.conf 파일내의 AUTOVACUUM PARAMETERS 관련 옵션을 지정하여 사용할 수도 있습니다.
  • PostgreSQL 9.0 부터는 Vacuum이 Default로 On 되어 있습니다.

Vacuum 실행 구조

  • PostgreSQL 에서는 특정 Row 나 Update나 Delete 되어도, 물리적인 저장공잔은 삭제되지 않고 남게 됩니다.
  • 이런 오랜 행 중에서도 어느 곳에서도 참조되지 않는 안전하게 재사용할 수 있는 행을 찾아, FSM 즉 Free Space Map 이라는 메모리 공간에 그 위치와 크기를 기록합니다.
  • Insert 및 Update 등 새로운 행을 추가할 경우 FSM 영역에서 검색하여 새로운 데이터를 저장할 수 있는 적당한 크기의 행이 발견되면, 그곳을 재사용하게 합니다.

Vacummdb Command 활용

  • Vacuum 실행하는 클라이언트 명령어인 vacuumdb를 활용하여 주기적으로 정리할 때 활용할 수 있습니다.
  • vacuumdb 명령어
root@507921f450c2:/# vacuumdb --help
vacuumdb cleans and analyzes a PostgreSQL database.

Usage:
  vacuumdb [OPTION]... [DBNAME]

Options:
  -a, --all                       vacuum all databases
  -d, --dbname=DBNAME             database to vacuum
      --disable-page-skipping     disable all page-skipping behavior
  -e, --echo                      show the commands being sent to the server
  -f, --full                      do full vacuuming
  -F, --freeze                    freeze row transaction information
      --force-index-cleanup       always remove index entries that point to dead tuples
  -j, --jobs=NUM                  use this many concurrent connections to vacuum
      --min-mxid-age=MXID_AGE     minimum multixact ID age of tables to vacuum
      --min-xid-age=XID_AGE       minimum transaction ID age of tables to vacuum
      --no-index-cleanup          don't remove index entries that point to dead tuples
      --no-process-toast          skip the TOAST table associated with the table to vacuum
      --no-truncate               don't truncate empty pages at the end of the table
  -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available
  -q, --quiet                     don't write any messages
      --skip-locked               skip relations that cannot be immediately locked
  -t, --table='TABLE[(COLUMNS)]'  vacuum specific table(s) only
  -v, --verbose                   write a lot of output
  -V, --version                   output version information, then exit
  -z, --analyze                   update optimizer statistics
  -Z, --analyze-only              only update optimizer statistics; no vacuum
      --analyze-in-stages         only update optimizer statistics, in multiple
                                  stages for faster results; no vacuum
  -?, --help                      show this help, then exit

Connection options:
  -h, --host=HOSTNAME       database server host or socket directory
  -p, --port=PORT           database server port
  -U, --username=USERNAME   user name to connect as
  -w, --no-password         never prompt for password
  -W, --password            force password prompt
  --maintenance-db=DBNAME   alternate maintenance database

Read the description of the SQL command VACUUM for details.
  • full 옵션 없이 vacuum 실행할 경우는 단순히 가능한 공간만 반환하고, 다시 사용할 수 있도록 합니다.
  • 반면, -f 또는 -full 통해 full 옵션 실행한 경우는 빈 영역에 tuple 을 옮기는 등 디스크 최적화 작업을 하게 됩니다. 따라서, 시간이 오래 걸리고 실행되는 동안 table Lock 이 걸리게 되므로 주의해서 사용해야 합니다. 이 옵션을 사용하면 더 많은 공간을 활용할 수 있으면, 최적화가 됩니다.
728x90

이 글을 공유하기

댓글

Designed by JB FACTORY