Vacuum 이란 ?
Vacuum 은 PostgreSQL 에서만 (다른 RDBMS에 없는) 고유 명령이다.
PostgreSQL에서 특정 Row를 업데이트 할 경우, 디스크 상의 해당 Row를 물리적으로 업데이트하여 사용하지 않고, 새로운 영역을 할당해 쓴다.
Update 또는 Delete 가 된 후, 해당영역이 자동으로 재사용되거나 사라지지 않는다.
이렇게 오래된 영역을 재사용하거나 정리해주는 명령어가 Vacuum 이다.
따라서 Update, Delete, Insert 가 많이 일어나는 DB 의 경우는 Vacuum 을 주기적으로 해주는 것이 좋다.
Vacuum 실행 구조
PostgreSQL에서는 특정 Row가 Update나 Delete 되어도, 물리적인 저장공간은 삭제되지 않고 남게 된다.
이런 오래된 행 중에서 어느 곳에서도 참조되지 않는 안전하게 재사용할 수 있는 행을 찾아, FSM 즉, Free Space Map 라는 메모리 공간에 그 위치와 크기를 기록한다.
Insert 및 Upadte 등 새로운 행을 추가할 경우 FSM영역에서 검색하여 새로운 데이터를 저장할 수 있는 적당한 크기의 행이 발견되면, 그곳을 재사용하게 한다.
Vacuumdb Command 활용
· vacuum 실행하는 클라이언트 명령어인 vacuumdb를 활용하여 주기적으로 정리할 때 활용할 수 있다.
· vacuumdb명령어
사용법:
vacuumdb [옵션]... [DB이름]
옵션들:
-a, --all 모든 데이터베이스 청소
-d, --dbname=DBNAME DBNAME 데이터베이스 청소
-e, --echo 서버로 보내는 명령들을 보여줌
-f, --full 대청소
-F, --freeze 행 트랜잭션 정보 동결
-q, --quiet 어떠한 메시지도 보여주지 않음
-t, --table='TABLE[(COLUMNS)]' 지정한 특정 테이블만 청소
-v, --verbose 작업내역의 자세한 출력
-V, --version output version information, then exit
-z, --analyze update optimizer statistics
-Z, --analyze-only only update optimizer statistics
-?, --help show this help, then exit
연결 옵션들:
-h, --host=HOSTNAME 데이터베이스 서버 호스트 또는 소켓 디렉터리
-p, --port=PORT 데이터베이스 서버 포트
-U, --username=USERNAME 접속할 사용자이름
-w, --no-password 암호 프롬프트 표시 안 함
-W, --password 암호 프롬프트 표시함
--maintenance-db=DBNAME alternate maintenance database
· full옵션 없이 vacuum 실행할 경우는 단순히 가능한 공간만 반환하고, 다시 사용할 수 있도록 한다.
· 반면 -f 또는–full 통해 full 옵션 실행한 경우는 빈 영역에 tuple을 옮기는 등 디스크 최적화 작업을 하게 된다.
따라서, 시간이 오래 걸리고, 실행되는 동안 table LOCK이 걸리게 되므로 주의해서 사용해야 한다.
이 옵션을 사용하면 더 많은 공간을 활용할 수 있고, 최적화가 된다.
autovacuum configuration 활용
· PostreSQL 서버 실행시 참고하는 configuration 파일( postgresql.conf ) 의 AUTOVACUUM PARAMETERS 를 지정하여 설정이 가능하다. 9.0 이상의 버전에서 부터는 해당 파라미터들이 #(disable) 되어 있어도, default 실행이 되게 되어 있다.
edb=# show autovacuum;
autovacuum
------------
on
(1 row)
AUTOVACUUM PARAMETERS (postgresql.conf)
#---------------------------------------------------------------------------
# AUTOVACUUM PARAMETERS
#---------------------------------------------------------------------------
#vacuum_cost_delay = 0ms # 0-100 milliseconds
#vacuum_cost_page_hit = 1 # 0-10000 credits
#vacuum_cost_page_miss = 10 # 0-10000 credits
#vacuum_cost_page_dirty = 20 # 0-10000 credits
#vacuum_cost_limit = 200 # 1-10000 credits
#vacuum_defer_cleanup_age = 0 # number of xacts by which cleanup is delayed
#autovacuum = on # Enable autovacuum subprocess? 'on'
#log_autovacuum_min_duration = -1 # -1 disables, 0 logs all actions and
#autovacuum_max_workers = 3 # max number of autovacuum subprocesses
#autovacuum_naptime = 1min # time between autovacuum runs
#autovacuum_vacuum_threshold = 50 # min number of row updates before
# vacuum
#autovacuum_analyze_threshold = 50 # min number of row updates before
#autovacuum_vacuum_scale_factor = 0.2 # fraction of table size before vacuum
#autovacuum_analyze_scale_factor = 0.1 # fraction of table size before analyze
#autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum
#autovacuum_vacuum_cost_delay = 20ms # default vacuum cost delay for
# autovacuum, in milliseconds;
# -1 means use vacuum_cost_delay
#autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for
# autovacuum, -1 means use
# vacuum_cost_limit
#vacuum_freeze_min_age = 50000000
#vacuum_freeze_table_age = 150000000
posted by 김득은
'2. DBMS이야기 > 01. PostgreSQL' 카테고리의 다른 글
SQL_DUMP VS SQL_DUMPALL (0) | 2014.07.24 |
---|---|
[Postgresql] Lock Session 확인 및 정리 가이드 (0) | 2014.07.23 |
[Admin] 3.Server Configuration : Parameter 종류(Resource Consumption) (0) | 2014.07.15 |
[Postgresql] Postgresql 백업 (pg_dump) (0) | 2014.07.12 |
PostgreSQL Privileges Part.3 (0) | 2014.07.09 |