제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

51
EXEM technical report no.012 Ver. 0.1 2016.07.28 PostgreSQL Deep Internal (PostgreSQL 9.4)

Upload: exem

Post on 13-Apr-2017

344 views

Category:

Education


3 download

TRANSCRIPT

Page 1: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

EXEM technical report no.012 Ver. 0.12016.07.28

PostgreSQL Deep Internal

(PostgreSQL 9.4)

Page 2: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal목차

1) Vacuum 정의 및 필요성

2) Vacuum 실행 구조

3) 표준 Vacuum VS Vacuum full

4) XID Wraparound 와 Freeze

5) Autovacuum

02. PostgreSQL 아키텍쳐

01. PostgreSQL의 역사

04. Vacuum

03. Page Layout

Page 3: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

01. PostgreSQL의 역사

Page 4: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep InternalPostgreSQL의 역사

Year Name Developer Features

1977-1985 IngresThe University of

California at Berkeley

• Research prototype• Relational Technologies• Established the company Ingres in 1980• Purchased by Computer Associates in 1994

1986-1994 Postgres Michael Stonebraker• Research Prototype• Spawned Illustra• Purchased by Informix

1994-1995 Postgres95 Jolly Chen, Andrew Yu• Added SQL• Spawned PostgreSQL

1996- PostgreSQL(6.0)• Renamed to PostgreSQL to reflect its support for

SQL

출처• https://drive.google.com/folderview?id=0B4hWvkMs8fCPWG44dDBITHpMc0U

&usp=sharing_eid&ts=5702089b&tid=0B4hWvkMs8fCPeU9oWEhHNnItVkk• https://momjian.us/main/writings/pgsql/history.pdf

Page 5: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep InternalPostgreSQL의 역사

PostgreSQL Core TeamJolly ChenAndrew Yu

Michael StonebrakerThe University of

California at Berkeley

Page 6: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

02. PostgreSQL 아키텍쳐

Page 7: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep InternalPostgreSQL Architecture

‘추기형(追記型) 스토리지 아키텍처’

레코드의 갱신 처리를 할 때, 블록의 이전 레코드를 덮어 쓰는 대신 다른 레코드로 만드는 것

출처http://pgsqldeepdive.blogspot.kr/2012/12/postgresql_16.htmlhttp://ikubo.x0.com/PostgreSQL/pdf/IK09_mvcc.pdf

testdb = # UPDATE t1 SET uname = 'update 1'WHERE uid = 101;

UPDATE 1

testdb = # SELECT lp, lp_off, lp_flags, lp_len, t_xmin, t_xmax FROM heap_page_items (get_raw_page ( 't1', 0));

lp | lp_off | lp_flags | lp_len | t_xmin | t_xmax

---- + -------- + ---------- + -------- + -------- + ---------

1 | 8152 | 1 | 37 | 1859 | 1860

2 | 8112 | 1 | 37 | 1860 | 0

(2 rows) testdb = #

Insert

Delete

Update

transaction ID

Page 8: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

03. Page Layout

Page 9: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep InternalOverall Page Layout

Page Header Data (24 bytes)

Item id Data

Free Space

Items

Special space

Page 10: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal

• Page Dump를 보면 Page Header Data, Item Id Data, Free Space, Items, Special space가 있다.

• Page Header Data: 페이지에 대한 전반적 정보

• Item Id Data: 실제 아이템을 가리키는 포인터로 offset, length에 대한 정보, 아이템 당 4bytes

• Items: 실제 아이템에 대한 정보

Dump

Overall Page Layout

Page 11: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep InternalPage Header Data Layout

Page Header Data (24 bytes)

Item id Data

Free Space

Items

Special space

Page 12: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal

• Page Header Data Layout에는 free space의 시작을 가리키는 pd_lower와 끝을 가리키는 pd_upper가 있다.

• pd_upper는 free space의 끝이자 item의 시작이기도 하다.

Dump

Page Header Data Layout

Page 13: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep InternalPage Header Data Layout

Page Header Data (24 bytes)

Item id Data

Free Space

Items

Special space

Page 14: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep InternalItem Id Data

• 실제 아이템을 가리키는 Item Id Data는 lp_off(15bit), lp_flags(2bit), lp_len(15bit) 총 4byte로 구성되어 있다.

• 예를 들어, Item Id Data인 ‘c0 9f 7c 00’ 은 순서를 거꾸로 하여 ‘00 7c 9f c0’ 에서 뒤의 4자리에서 앞의 1bit 를 제외한 ‘1fc0’을 통해 Item을 찾아갈 수 있다.

Dump 00 7c 9f c0 00 7c 9f 80

• lp: 블록 내의 아이템 offset id

• lp_off: 튜플의 offset (주소)

• lp_flags: 아이템 포인터의 상태

• lp_len: 튜플의 길이

lp_unused: 0lp_normal: 1lp_redirect: 2lp_dead: 3

‘00 7c 9f c0’= 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0

lp_len lp_flags lp_off

Page 15: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep InternalHeap Tuple Header Data Layout

• Heap Tuple Header Data Layout의 t_xmin과 t_xmax는 각각 insert시의 XID, delete 시의 XID를 나타낸다.

Dump 00 7c 9f 80

Page 16: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal

SELECT * from heap_page_items(get_raw_page('t2', 0));

Heap Tuple Header Data Layout

• t_cid: 튜플을 생성한 명령 id

• t_xvac: vacuum full로 튜플을 옮긴 트랜잭션 id

• t_ctid: 같은 트랜잭션 내에서 시퀀스를 추적하는internal command id

• t_infomask2: 튜플에 포함된 속성의 수와 튜플의 부가정보 flag

• t_infomask: 튜플의 부가정보 flag

• t_hoff: 사용자 데이터의 시작 위치에 대한 오프셋

Page 17: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep InternalHeap Tuple Header Data Layout

t_xmin t_xmax/t_cmin t_cmax/t_xvact_ctid 중

block id data

4bytes 4bytes 4bytes 4bytes

t_ctid 중

offsett_infomas

k2t_infomask t_hoff 사용자

2 bytes 2 bytes 2 bytes 1 bytes 9bytes

001380 69 31 00 00 6b 31 00 00 00 00 00 00 00 00 00 00 >i1..k1..........<

001390 64 00 01 20 02 01 18 00 11 31 39 39 20 20 20 20 >d.. .....199 <

ex)

Page 18: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

04. Vacuum

1) Vacuum 정의 및 필요성

2) Vacuum 실행 구조

3) 표준 Vacuum VS Vacuum full

4) XID Wraparound 와 Freeze

5) Autovacuum

Page 19: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal1) Vacuum 정의 및 필요성

1) 변경 및 삭제된 자료들이 차지하고 있는 디스크 공간을 확보하기 위해서

2) Query Planner가 사용할 자료의 통계 정보를 갱신하기 위해서

3) 실자료 지도(visibility map, VM)의 정보를 갱신하기 위해서 (VM은

인덱스 전용의 검색 성능을 향상시키기 위해 사용함)

4) 트랜잭션 id가 겹침으로 인해 오래된 자료의 손실이 발생하는 것을 방지하기 위해서

2. Vacuum의 필요성

1. Vacuum의 정의

PostgreSQL에서 특정 튜플을 update 하거나 delete 한다고 해서 해당 영역이 자동으로 재사용되거나 사라지지 않는다.

이렇게 오래된 영역을 정리하여 공간을 반환하는 명령어가 Vacuum이다. ≒디스크 조각 모음

VM (Visibility Map)

실제 사용하는 자료의 정보만 보관,

FSM과 반대로 사용 공간에 대한 정보를 저장

Page 20: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal

FSM(Free Space Map)

2) Vacuum 실행 구조

FSM (Free Space Map) : Vacuum의 기준

• 페이지의 빈 공간에 대한 정보를 보관

• 데이터베이스 내에 사용하지 않은 공간의 위치를 추적

• Oracle과 InnoDB는 undo(rollback) segment를 사용하여 MVCC를 구현하는 반면, PostgreSQL는 내부 페이지를

사용한다. 즉, update, delete된 행을 즉시 제거하지 않고, 이 공간을 VACUUM 작업을 통해서 반환한다.

기존 테이블

ID NAME

1 Test1

2 Test2

3 Test3

4 Test4

5 Test5

변경 테이블

ID NAME

1 Test1

2 Test2

3 Test3

4 Test4

5 Test5

3 Test03•‘Test3’을 ‘Test03’으로 변경

•‘Test5’를 삭제

참고: http://blog.gaerae.com/2015/09/postgresql-vacuum-fsm.html

Page 21: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal

FSM(Free Space Map)

2) Vacuum 실행 구조

기존 테이블

ID NAME

1 Test1

2 Test2

3 Test3

4 Test4

5 Test5

3 Test03

변경 테이블

ID NAME

1 Test1

2 Test2

3 Test3

4 Test4

6 Test6

3 Test03

•‘Test 6’ 추가6 Test6

• 새로운 데이터 insert시, FSM 확인 후 빈 공간에 데이터를 추가한다.

참고: http://blog.gaerae.com/2015/09/postgresql-vacuum-fsm.html

Page 22: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal

변경 테이블

ID NAME

1 Test1

2 Test2

4 Test4

6 Test6

3 Test03

기존 테이블

ID NAME

1 Test1

2 Test2

3 Test3

4 Test4

6 Test6

3 Test03

• Vacuum을 실행하면 불필요한 정보가 삭제된다.

Vacuum

참고: http://blog.gaerae.com/2015/09/postgresql-vacuum-fsm.html

2) Vacuum 실행 구조

Page 23: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal3) 표준 vacuum VS Vacuum full

표준 vacuum Vacuum full

처리 방식• 다른 자료가 저장될 수 있도록 빈 공간으로 표시

• OS 입장에서는 디스크의 여유 공간 확보가 불가

• 새 파일에 저장하는 방식

(pg_class의 relfilenode값이 변경)

• OS 입장에서 디스크의 여유 공간 확보가 가능

• 최적의 물리적 크기로 테이블 생성

처리 속도 Vacuum full 보다는 시간이 적게 걸림 처리 속도가 매우 느려 시간이 오래 걸림

Lock 여부여러 다른 작업들과 함께 사용 가능select, update, insert, delete (단, ALTER TABLE는 안됨)

해당 테이블에 배타적 잠금을 지정하기 때문에 어떤 작업도함께 사용할 수 없음

Page 24: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal

표준 Vacuum과 Vacuum full 비교 시나리오

순서 command 순서 command

1. Database 생성 create database vac; 9. 총 사이즈 확인 select pg_total_relation_size(‘myt’);

2. oid 확인 oid2name | grep vac 10. myt 테이블에 vacuum 작업 vacuum myt;

3. 테이블 생성 create table myt(id char(7)); 11. 총 사이즈 확인 select pg_total_relation_size(‘myt’);

4. pg_relation_path 확인 select pg_relation_filepath(‘myt’); 12. myt 테이블에 200부터 11건 삽입insert into myt select generate_series(200,210);

5. 총 사이즈 확인 select pg_total_relation_size(‘myt’); 13. 총 사이즈 확인 select pg_total_relation_size(‘myt’);

6. myt 테이블에 100건 삽입insert into myt select generate_series(100,199);

14. myt 테이블에 vacuum full 작업 vauum full myt;

7. 총 사이즈 확인 select pg_total_relation_size(‘myt’); 15. 총 사이즈 확인 select pg_total_relation_size(‘myt’);

8. myt 테이블에서 id가 150이상이면 삭제 delete from myt where id>=‘150’; 16. pg_relation_path 확인 select pg_relation_filepath(‘myt’);

3) 표준 vacuum VS Vacuum full

Page 25: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal3) 표준 vacuum VS Vacuum full

• vac 데이터베이스 생성

[postgres@153_40 base]$ createdb vac

[postgres@153_40 base]$ oid2name | grep vac

1254094 vac pg_default

[postgres@153_40 base]$ cd 1254094/

• vac로 접속

[postgres@153_40 1254094]$ psql -d vac

(postgres@[local]:5432) [vac] > \! pwd

/usr/local/pgsql/data/base/1254094

(postgres@[local]:5432) [vac] > \! ls | head -5

1273512735_fsm12735_vm1273712737_fsm

• myt 테이블 생성

(postgres@[local]:5432) [vac] > create table myt(id char(7));

CREATE TABLE

• myt filepath 확인(postgres@[local]:5432) [vac] > select pg_relation_filepath('myt');pg_relation_filepath

----------------------base/ 1254094/1254095

(1 row)

(postgres@[local]:5432) [vac] > \! ls -lt 123*-rw------- 1 postgres postgres 0 Jun 21 16:10 1254094

(postgres@[local]:5432) [vac] > select pg_total_relation_size('myt');pg_total_relation_size

------------------------0

(1 row)

표준 Vacuum과 Vacuum full 비교 시나리오

Page 26: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal3) 표준 vacuum VS Vacuum full

12735 12755 12775 12793_fsm 12809 12825_fsm 12845 12862_vm 12910 12925 12949 12968_vm 12988_fsm

12735_fsm 12756 12776 12793_vm 12809_fsm 12825_vm 12846 12864 12910_fsm 12925_fsm 12953 12970 12988_vm

12735_vm 12757 12776_fsm 12795 12809_vm 12827 12847 12865 12910_vm 12925_vm 12953_fsm 12972 12990

12737 12757_fsm 12776_vm 12796 12811 12828 12847_fsm 12866 12912 12927 12953_vm 12973 12992

12737_fsm 12757_vm 12778 12797 12812 12828_fsm 12847_vm 12866_fsm 12913 12928 12955 12973_fsm 12993

12737_vm 12759 12780 12797_fsm 12813 12828_vm 12849 12866_vm 12913_fsm 12929 12956 12973_vm 12995

12739 12761 12781 12797_vm 12814 12830 12851 12868 12913_vm 12931 12957 12975 12997

12740 12762 12782 12799 12814_fsm 12830_fsm 12852 12869 12915 12932 12957_fsm 12977 pg_filenode.map

12741 12763 12783 12800 12814_vm 12830_vm 12853 12870 12916 12933 12957_vm 12978 PG_VERSION

12741_fsm 12764 12784 12801 12816 12832 12853_fsm 12871 12917 12935 12959 12978_fsm

12741_vm 12764_fsm 12785 12801_fsm 12817 12833 12853_vm 12871_fsm 12917_fsm 12936 12960 12978_vm

12743 12764_vm 12787 12801_vm 12818 12834 12855 12871_vm 12917_vm 12937 12962 12980

12744 12766 12788 12803 12818_fsm 12835 12856 12873 12919 12939 12963 12982

12749 12767 12789 12804 12818_vm 12837 12857 12874 12920 12940 12963_fsm 12983

12751 12768 12789_fsm 12805 12820 12839 12859 12906 12921 12942 12963_vm 12983_fsm

12752 12769 12789_vm 12805_fsm 12821 12840 12860 12906_fsm 12921_fsm 12943 12965 12983_vm

12753 12771 12791 12805_vm 12822 12841 12861 12906_vm 12921_vm 12944 12967 12985

12753_fsm 12773 12792 12807 12824 12842 12862 12908 12923 12946 12968 12987

12753_vm 12774 12793 12808 12825 12843 12862_fsm 12909 12924 12948 12968_fsm 12988

DB 생성 후, 무엇이 생성되는가?

DB 생성 시 생성되는 파일들

select * from pg_class where relfilenode='12735’;

Page 27: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal

• myt에 100~199 (100건) insert

(postgres@[local]:5432) [vac] > insert into myt select generate_series(100,199);

INSERT 0 100

• myt의 사이즈 확인

(postgres@[local]:5432) [vac] > select pg_total_relation_size('myt');

pg_total_relation_size

------------------------8192

(1 row)

• /base/database/table 확인

(postgres@[local]:5432) [vac] > \! ls –l 1254095

-rw------- 1 postgres postgres 8192 Jun 24 13:59

/usr/local/pgsql/data/base/1254094/1254095

3) 표준 vacuum VS Vacuum full

000000 07 00 00 00 08 0f 0b 1a 00 00 00 00 a8 01 80 13 >................<

0001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................<

001380 69 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >i1..............<

001390 64 00 01 00 02 08 18 00 11 31 39 39 20 20 20 20 >d........199 <

0013a0 69 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >i1..............<

0013b0 63 00 01 00 02 08 18 00 11 31 39 38 20 20 20 20 >c........198 <

001980 69 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >i1..............<

001990 34 00 01 00 02 08 18 00 11 31 35 31 20 20 20 20 >4........151 <

0019a0 69 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >i1..............<

0019b0 33 00 01 00 02 08 18 00 11 31 35 30 20 20 20 20 >3........150 <

001fe0 69 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >i1..............<

001ff0 01 00 01 00 02 08 18 00 11 31 30 30 20 20 20 20 >.........100 <

Page Header Data+

Item Id Data

Items

시나리오 dump

⇒ Items에는 100건이 insert된 정보 추가됨

Page 28: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal

• myt에서 150 이상 삭제

(postgres@[local]:5432) [vac] > delete from myt where id>='150';

DELETE 50

• myt의 사이즈 확인

(postgres@[local]:5432) [vac] > select pg_total_relation_size('myt');

pg_total_relation_size

------------------------8192

(1 row)

3) 표준 vacuum VS Vacuum full

000000 07 00 00 00 08 0f 0b 1a 00 00 00 00 a8 01 80 13 >................<

0001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................<

001380 69 31 00 00 6b 31 00 00 00 00 00 00 00 00 00 00 >i1..k1..........<

001390 64 00 01 20 02 01 18 00 11 31 39 39 20 20 20 20 >d.. .....199 <

0013a0 69 31 00 00 6b 31 00 00 00 00 00 00 00 00 00 00 >i1..k1..........<

0013b0 63 00 01 20 02 01 18 00 11 31 39 38 20 20 20 20 >c.. .....198 <

001980 69 31 00 00 6b 31 00 00 00 00 00 00 00 00 00 00 >i1..k1..........<

001990 34 00 01 20 02 01 18 00 11 31 35 31 20 20 20 20 >4.. .....151 <

0019a0 69 31 00 00 6b 31 00 00 00 00 00 00 00 00 00 00 >i1..k1..........<

0019b0 33 00 01 20 02 01 18 00 11 31 35 30 20 20 20 20 >3.. .....150 <

001fe0 69 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >i1..............<

001ff0 01 00 01 00 02 08 18 00 11 31 30 30 20 20 20 20 >.........100 <

Page Header Data+

Item Id Data

Items

시나리오 dump

⇒ Items에는 delete 후, 150부터 199까지 t_xmax가 표시되고, t_natts, t_infomask가 변경됨

Page 29: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal

• myt 표준 vacuum 작업

(postgres@[local]:5432) [vac] > vacuum myt;

VACUUM

• myt의 사이즈 확인

(postgres@[local]:5432) [vac] > select pg_total_relation_size('myt');

pg_total_relation_size

------------------------40960

(1 row)

• /base/database/table 확인

(postgres@[local]:5432) [vac] > \! ls –l 1254095

-rw------- 1 postgres postgres 8192 Jun 24

14:00/usr/local/pgsql/data/base/1254094/1254095

-rw------- 1 postgres postgres 24576 Jun 24 14:00

/usr/local/pgsql/data/base/1254094/1254095_fsm

-rw------- 1 postgres postgres 8192 Jun 24 14:00

/usr/local/pgsaql/data/base/1254094/1254095_vm

3) 표준 vacuum VS Vacuum full

000000 07 00 00 00 08 0f 0b 1a 00 00 00 00 a8 01 80 13 >................<

0000e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................<

001380 69 31 00 00 6b 31 00 00 00 00 00 00 00 00 00 00 >i1..k1..........<

001390 64 00 01 20 02 01 18 00 11 31 39 39 20 20 20 20 >d.. .....199 <

0013a0 69 31 00 00 6b 31 00 00 00 00 00 00 00 00 00 00 >i1..k1..........<

0013b0 63 00 01 20 02 01 18 00 11 31 39 38 20 20 20 20 >c.. .....198 <

001980 69 31 00 00 6b 31 00 00 00 00 00 00 00 00 00 00 >i1..k1..........<

001990 34 00 01 20 02 01 18 00 11 31 35 31 20 20 20 20 >4.. .....151 <

0019a0 69 31 00 00 6b 31 00 00 00 00 00 00 00 00 00 00 >i1..k1..........<

0019b0 33 00 01 20 02 01 18 00 11 31 35 30 20 20 20 20 >3.. .....150 <

001fe0 69 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >i1..............<

001ff0 01 00 01 00 02 08 18 00 11 31 30 30 20 20 20 20 >.........100 <

Page Header Data+

Item Id Data

Items

시나리오 dump

⇒ 표준 vacuum 작업을 하면 delete된 50건의 Item Id Data가 삭제되나Items에는 변경된 사항이 없음 또한 fsm과 vm 파일 생성

Page 30: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal

• myt에 11건 insert

(postgres@[local]:5432) [vac] > insert into myt select generate_series(200,210);

INSERT 0 11

(postgres@[local]:5432) [vac] > select pg_total_relation_size('myt');

pg_total_relation_size

------------------------40960

(1 row)

• /base/database/table 확인

(postgres@[local]:5432) [vac] > \! ls –l 1254095

-rw------- 1 postgres postgres 8192 Jun 24 14:01

/usr/local/pgsql/data/base/1254094/1254095

-rw------- 1 postgres postgres 24576 Jun 24 14:01

/usr/local/pgsql/data/base/1254094/1254095_fsm

-rw------- 1 postgres postgres 8192 Jun 24 14:01

/usr/local/pgsql/data/base/1254094/1254095_vm

3) 표준 vacuum VS Vacuum full

000000 07 00 00 00 08 0f 0b 1a 00 00 00 00 a8 01 80 13 >................<

000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................<

001380 69 31 00 00 6b 31 00 00 00 00 00 00 00 00 00 00 >i1..k1..........<

001390 64 00 01 20 02 01 18 00 11 31 39 39 20 20 20 20 >d.. .....199 <

001840 69 31 00 00 6b 31 00 00 00 00 00 00 00 00 00 00 >i1..k1..........<

001850 3e 00 01 20 02 05 18 00 11 31 36 31 20 20 20 20 >>.. .....161 <

001860 6c 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >l1..............<

001870 3d 00 01 00 02 08 18 00 11 32 31 30 20 20 20 20 >=........210 <

0019a0 6c 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >l1..............<

0019b0 33 00 01 00 02 08 18 00 11 32 30 30 20 20 20 20 >3........200 <

0019c0 69 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >i1..............<

0019d0 32 00 01 00 02 09 18 00 11 31 34 39 20 20 20 20 >2........149 <

001fe0 69 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >i1..............<

001ff0 01 00 01 00 02 08 18 00 11 31 30 30 20 20 20 20 >.........100 <

Page Header Data+

Item Id Data

Items

시나리오 dump

⇒ Item id Data에 insert된 11건에 대한 정보 추가됨, Items에는200~210이 delete 된 150 자리부터 reuse 됨

다른 자료가 저장될 수 있도록 빈 공간으로 표시그래서 Insert 1000건을 해도 용량의 변화가 없음

Page 31: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal

000000 07 00 00 00 50 60 0b 1a 00 00 05 00 a8 01 c0 19 >....P`..........<

000010 00 20 04 20 00 00 00 00 e0 9f 40 00 c0 9f 40 00 >. . ......@...@.<

000020 a0 9f 40 00 80 9f 40 00 60 9f 40 00 40 9f 40 00 >..@...@.`.@.@.@.<

000030 20 9f 40 00 00 9f 40 00 e0 9e 40 00 c0 9e 40 00 > .@...@...@...@.<

000040 a0 9e 40 00 80 9e 40 00 60 9e 40 00 40 9e 40 00 >..@...@.`.@.@.@.<

000050 20 9e 40 00 00 9e 40 00 e0 9d 40 00 c0 9d 40 00 > .@...@...@...@.<

000060 a0 9d 40 00 80 9d 40 00 60 9d 40 00 40 9d 40 00 >..@...@.`.@.@.@.<

000070 20 9d 40 00 00 9d 40 00 e0 9c 40 00 c0 9c 40 00 > .@...@...@...@.<

000080 a0 9c 40 00 80 9c 40 00 60 9c 40 00 40 9c 40 00 >..@...@.`.@.@.@.<

000090 20 9c 40 00 00 9c 40 00 e0 9b 40 00 c0 9b 40 00 > .@...@...@...@.<

0000a0 a0 9b 40 00 80 9b 40 00 60 9b 40 00 40 9b 40 00 >..@...@.`.@.@.@.<

0000b0 20 9b 40 00 00 9b 40 00 e0 9a 40 00 c0 9a 40 00 > .@...@...@...@.<

0000c0 a0 9a 40 00 80 9a 40 00 60 9a 40 00 40 9a 40 00 >..@...@.`.@.@.@.<

0000d0 20 9a 40 00 00 9a 40 00 e0 99 40 00 c0 99 40 00 > .@...@...@...@.<

0000e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................<

000000 07 00 00 00 78 aa 0b 1a 00 00 01 00 a8 01 60 18 >....x.........`.<

000010 00 20 04 20 00 00 00 00 e0 9f 40 00 c0 9f 40 00 >. . ......@...@.<

000020 a0 9f 40 00 80 9f 40 00 60 9f 40 00 40 9f 40 00 >..@...@.`.@.@.@.<

000030 20 9f 40 00 00 9f 40 00 e0 9e 40 00 c0 9e 40 00 > .@...@...@...@.<

000040 a0 9e 40 00 80 9e 40 00 60 9e 40 00 40 9e 40 00 >..@...@.`.@.@.@.<

000050 20 9e 40 00 00 9e 40 00 e0 9d 40 00 c0 9d 40 00 > .@...@...@...@.<

000060 a0 9d 40 00 80 9d 40 00 60 9d 40 00 40 9d 40 00 >..@...@.`.@.@.@.<

000070 20 9d 40 00 00 9d 40 00 e0 9c 40 00 c0 9c 40 00 > .@...@...@...@.<

000080 a0 9c 40 00 80 9c 40 00 60 9c 40 00 40 9c 40 00 >..@...@.`.@.@.@.<

000090 20 9c 40 00 00 9c 40 00 e0 9b 40 00 c0 9b 40 00 > .@...@...@...@.<

0000a0 a0 9b 40 00 80 9b 40 00 60 9b 40 00 40 9b 40 00 >..@...@.`.@.@.@.<

0000b0 20 9b 40 00 00 9b 40 00 e0 9a 40 00 c0 9a 40 00 > .@...@...@...@.<

0000c0 a0 9a 40 00 80 9a 40 00 60 9a 40 00 40 9a 40 00 >..@...@.`.@.@.@.<

0000d0 20 9a 40 00 00 9a 40 00 e0 99 40 00 c0 99 40 00 > .@...@...@...@.<

0000e0 a0 99 40 00 80 99 40 00 60 99 40 00 40 99 40 00 >..@...@.`.@.@.@.<

0000f0 20 99 40 00 00 99 40 00 e0 98 40 00 c0 98 40 00 > .@...@...@...@.<

000100 a0 98 40 00 80 98 40 00 60 98 40 00 00 00 00 00 >..@...@.`.@.....<

000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................<

11건 추가된 Item Id Data

insert into myt select generate_series(200,210);

11건 추가됨

Page Header

3) 표준 vacuum VS Vacuum full

Page 32: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal

000000 07 00 00 00 78 aa 0b 1a 00 00 01 00 a8 01 60 18 >....x.........`.<

000010 00 20 04 20 00 00 00 00 e0 9f 40 00 c0 9f 40 00 >. . ......@...@.<

000020 a0 9f 40 00 80 9f 40 00 60 9f 40 00 40 9f 40 00 >..@...@.`.@.@.@.<

000030 20 9f 40 00 00 9f 40 00 e0 9e 40 00 c0 9e 40 00 > .@...@...@...@.<

000040 a0 9e 40 00 80 9e 40 00 60 9e 40 00 40 9e 40 00 >..@...@.`.@.@.@.<

000050 20 9e 40 00 00 9e 40 00 e0 9d 40 00 c0 9d 40 00 > .@...@...@...@.<

000060 a0 9d 40 00 80 9d 40 00 60 9d 40 00 40 9d 40 00 >..@...@.`.@.@.@.<

000070 20 9d 40 00 00 9d 40 00 e0 9c 40 00 c0 9c 40 00 > .@...@...@...@.<

000080 a0 9c 40 00 80 9c 40 00 60 9c 40 00 40 9c 40 00 >..@...@.`.@.@.@.<

000090 20 9c 40 00 00 9c 40 00 e0 9b 40 00 c0 9b 40 00 > .@...@...@...@.<

0000a0 a0 9b 40 00 80 9b 40 00 60 9b 40 00 40 9b 40 00 >..@...@.`.@.@.@.<

0000b0 20 9b 40 00 00 9b 40 00 e0 9a 40 00 c0 9a 40 00 > .@...@...@...@.<

0000c0 a0 9a 40 00 80 9a 40 00 60 9a 40 00 40 9a 40 00 >..@...@.`.@.@.@.<

0000d0 20 9a 40 00 00 9a 40 00 e0 99 40 00 c0 99 40 00 > .@...@...@...@.<

0000e0 a0 99 40 00 80 99 40 00 60 99 40 00 40 99 40 00 >..@...@.`.@.@.@.<

0000f0 20 99 40 00 00 99 40 00 e0 98 40 00 c0 98 40 00 > .@...@...@...@.<

000100 a0 98 40 00 80 98 40 00 60 98 40 00 00 00 00 00 >..@...@.`.@.....<

000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................<

Page Header Data + Item Id Data 001860 6c 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >l1..............<

001870 3d 00 01 00 02 08 18 00 11 32 31 30 20 20 20 20 >=........210 <

001880 6c 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >l1..............<

001890 3c 00 01 00 02 08 18 00 11 32 30 39 20 20 20 20 ><........209 <

0018a0 6c 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >l1..............<

0018b0 3b 00 01 00 02 08 18 00 11 32 30 38 20 20 20 20 >;........208 <

0018c0 6c 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >l1..............<

0018d0 3a 00 01 00 02 08 18 00 11 32 30 37 20 20 20 20 >:........207 <

0018e0 6c 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >l1..............<

0018f0 39 00 01 00 02 08 18 00 11 32 30 36 20 20 20 20 >9........206 <

001900 6c 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >l1..............<

001910 38 00 01 00 02 08 18 00 11 32 30 35 20 20 20 20 >8........205 <

001920 6c 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >l1..............<

001930 37 00 01 00 02 08 18 00 11 32 30 34 20 20 20 20 >7........204 <

001940 6c 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >l1..............<

001950 36 00 01 00 02 08 18 00 11 32 30 33 20 20 20 20 >6........203 <

001960 6c 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >l1..............<

001970 35 00 01 00 02 08 18 00 11 32 30 32 20 20 20 20 >5........202 <

001980 6c 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >l1..............<

001990 34 00 01 00 02 08 18 00 11 32 30 31 20 20 20 20 >4........201 <

0019a0 6c 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >l1..............<

0019b0 33 00 01 00 02 08 18 00 11 32 30 30 20 20 20 20 >3........200 <

Items

60 98 40 00

00 40 98 60

예를 들어, Item Id Data인 ’60 98 40 00’ 은 순서를 거꾸로 하여 ‘00 40 98 60’ 에서 뒤의 4자리에서 앞의 1bit 를 제외한 ‘1860’을 통해 Item을 찾아갈 수 있다.

3) 표준 vacuum VS Vacuum full

Page 33: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal

• myt Vacuum full 작업

(postgres@[local]:5432) [vac] > vacuum full myt;

VACUUM

(postgres@[local]:5432) [vac] > select pg_total_relation_size('myt');

pg_total_relation_size------------------------

8192(1 row)

(postgres@[local]:5432) [vac] > select pg_relation_filepath('myt');

pg_relation_filepath

----------------------

/base/1254094/1254098

(1 row)

3) 표준 vacuum VS Vacuum full

000000 07 00 00 00 08 0f 0b 1a 00 00 00 00 a8 01 80 13 >................<

000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................<

001860 6c 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >l1..............<

001870 3d 00 01 00 02 0b 18 00 11 32 31 30 20 20 20 20 >=........210 <

001880 6c 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >l1..............<

001890 3c 00 01 00 02 0b 18 00 11 32 30 39 20 20 20 20 ><........209 <

0019a0 6c 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >l1..............<

0019b0 33 00 01 00 02 0b 18 00 11 32 30 30 20 20 20 20 >3........200 <

0019c0 69 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >i1..............<

0019d0 32 00 01 00 02 0b 18 00 11 31 34 39 20 20 20 20 >2........149 <

001fe0 69 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >i1..............<

001ff0 01 00 01 00 02 0b 18 00 11 31 30 30 20 20 20 20 >.........100 <

Page Header Data+

Item Id Data

Items

시나리오 dump

⇒ Items에는 200~210 삽입된 튜플을 제외하고, 그 뒤에 161~199 삭제

원래 pg_relation_filepathbase/ 1254094/1254095

새로운 빈 공간을 만들고, 이 공간에 변경 전의 튜플들을옮기고 기존 파일에서 삭제

pg_class의 relfilenode값, relation filepath 변경

Page 34: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal3) 표준 vacuum VS Vacuum full

[postgres@153_40 1262281]$ ls

1262282 12753 12771 12791 12805_vm

1262282_fsm 12753_fsm 12773 12792 12807

1262282_vm 12753_vm 12774 12793 12808

12735 12755 12775 12793_fsm 12809

12735_fsm 12756 12776 12793_vm 12809_fsm

12735_vm 12757 12776_fsm 12795 12809_vm

12737 12757_fsm 12776_vm 12796 12811

12737_fsm 12757_vm 12778 12797 12812

12737_vm 12759 12780 12797_fsm 12813

12739 12761 12781 12797_vm 12814

12740 12762 12782 12799 12814_fsm

12741 12763 12783 12800 12814_vm

12741_fsm 12764 12784 12801 12816

12741_vm 12764_fsm 12785 12801_fsm 12817

12743 12764_vm 12787 12801_vm 12818

12744 12766 12788 12803 12818_fsm12749 12767 12789 12804 12818_vm

12751 12768 12789_fsm 12805 12820

12752 12769 12789_vm 12805_fsm 12821

<표준 Vacuum한 상태>

표준 Vacuum. Vacuum Full한 상태

<Vacuum Full한 상태>

[postgres@153_40 1262281]$ ls

1262285 12753_vm 12774 12793 12808

12735 12755 12775 12793_fsm 12809

12735_fsm 12756 12776 12793_vm 12809_fsm

12735_vm 12757 12776_fsm 12795 12809_vm

12737 12757_fsm 12776_vm 12796 12811

12737_fsm 12757_vm 12778 12797 12812

12737_vm 12759 12780 12797_fsm 12813

12739 12761 12781 12797_vm 12814

12740 12762 12782 12799 12814_fsm

12741 12763 12783 12800 12814_vm

12741_fsm 12764 12784 12801 12816

12741_vm 12764_fsm 12785 12801_fsm 12817

12743 12764_vm 12787 12801_vm 12818

12744 12766 12788 12803 12818_fsm

12749 12767 12789 12804 12818_vm

12751 12768 12789_fsm 12805 12820

12752 12769 12789_vm 12805_fsm 12821

12753 12771 12791 12805_vm 12822

12753_fsm 12773 12792 12807 12824

Page 35: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal4) XID Wraparound 와 Freeze

• 트랜잭션에 대한 MVCC 기법: XID(트랜잭션 ID)를 숫자로 처리하고 비교

• 232 까지 표현이 가능 (대략 40억)

• 40억 트랜잭션: 옛 XID(20억) + 새 XID(20억)

• 옛 XID 20억은 보이고, 새 XID 20억은 안보이게 처리

• 계속 순환하면서 사용

출처: http://www.slideshare.net/pgdayasia/introduction-to-vacuum-freezing-and-xid

새 XID(20억)

옛 XID(20억)

Visible

( Invisible )

Page 36: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal4) XID Wraparound 와 Freeze

• XID wraparound 때문에 오래된 데이터에 대한 손실 발생

• Insert–only 테이블에서만 발생

출처: http://www.slideshare.net/hadoopxnttdata/postgresql-xid-wraparound-another-issue

과거(visible)

미래(invisible)

Visible Visible Invisible

Page 37: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal4) XID Wraparound 와 Freeze

• 튜플을 “FREEZE”로 표시하고, 이 FrozenXID는 일반 XID 비교 대상에서 항상 제외되어 항상 보여짐

• 20억 트랜잭션이 생기기 전에 FrozenXID 즉, 영구 보관용 자료로 변경하면 XID 겹침 오류 방지

• 이러한 변경 작업(data freezing)은 VACUUM FREEZE 명령으로 처리

출처: http://www.slideshare.net/hadoopxnttdata/postgresql-xid-wraparound-another-issue

과거(visible)

미래(invisible)

Visible VisibleVisible

Page 38: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal4) XID Wraparound 와 Freeze

• pg_class 테이블의 relfrozenxid 칼럼값 :VACUUM 작업으로 그 테이블 전체에 대해서 XID 정리 작업을 했던 트랜잭션 ID 값

Skip 되는 블록

출처: http://www.slideshare.net/hadoopxnttdata/postgresql-xid-wraparound-another-issue

Page 39: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal4) XID Wraparound 와 Freeze

• Table age가 (vacuum_freeze_table_age – vacuum_freeze_min_age)보다 크면, 모든 페이지를 검사해서변경 작업을 진행

출처: http://www.slideshare.net/pgdayasia/introduction-to-vacuum-freezing-and-xid

20억

2억

1.5억

autovacuum 데몬에 의해 강제로 테이블의모든 페이지를 조사해서 트랜잭션 ID 겹침오류를 방지

VACUUM 작업에서 모든 페이지를 대상으로 이 XID 변경 작업을 할 것인지 결정가능

0으로 지정하면, VM 확인하지 않고 항상모든 페이지 검사

최대값: autovacuum_freeze_max_age* 0.95

Page 40: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal4) XID Wraparound 와 Freeze

출처: http://www.slideshare.net/pgdayasia/introduction-to-vacuum-freezing-and-xid

20억

2억

1.5억

이 시점에서는 표준 VACUUM이 실행됨

Page 41: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal4) XID Wraparound 와 Freeze

출처: http://www.slideshare.net/pgdayasia/introduction-to-vacuum-freezing-and-xid

20억

2억

1.5억

이 시점에서 VACUUM 작업을 하면

anti-wraparound VACUUM이 실행됨

Page 42: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal4) XID Wraparound 와 Freeze

FrozenXID로 바꾸기 전 옛 XID를

얼마나 남길 것인가 지정

anti-wraparound VACUUM 후에는

relfrozenxid 값이 업데이트됨

출처: http://www.slideshare.net/pgdayasia/introduction-to-vacuum-freezing-and-xid

Page 43: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal

20억

2억

1.5억

4) XID Wraparound 와 Freeze

• 한 테이블이 vacuum 작업 없이 계속 트랜잭션 작업할 수 있는 간격

: 마지막 vacuum 이후부터, 20억 – vacuum_freeze_min_age 값만큼의 트랜잭션

• 트랜잭션 발생, vacuum 작업 없다면 데이터 손실

Autovacuum 기능을 사용하지 않더라도, autovacuum_freeze_max_age 지정 간격으로 vacuum 작업 진행

• 한 테이블에 대해 vacuum 작업이 한번도 하지 않았다면, (Autovacuum_freeze_max_age –

vacuum_freeze_min_age) 값 만큼의 트랜잭션 발생 시, autovacuum 자동 진행

Page 44: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal5) Autovacuum

Autovacuum launcherAutovacuum_naptime 값으로 지정한 초 간격으로 한 번에 하나의 데이터베이스를 작업할 수 있도록 worker 프로세스의 실행 시간을 관리

Autovacuum workersAutovacuum_max_workers worker 프로세스 최대 개수

AUTOVACUUM이란? VACUUM 명령과 ANALYZE 명령을 주기적으로 자동 실행

• 주기적인 표준 Vacuum 작업을 하여 빈 공간을 확보하여 최대한 Vacuum Full 작업을 방지

• 최소의 디스크를 쓰는 것이 아닌 최적의 디스크 공간만 사용

출처: http://www.slideshare.net/alexeylesovsky/deep-dive-into-postgresql-statistics-60849690

Page 45: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal5) Autovacuum

• Autovacuum 데몬은 이러한 예상치 못한 상황에 대해 자동으로 Vacuum 작업을 진행하여 위와 같은 문제를 피할 수 있음

• 정확한 데이터베이스 사용량을 파악하지 않고 autovacuum을 끄면 안됨

• Autovacuum 데몬을 사용하지 않는다면, 해당 DB 서버에서 사용하고 있는 모든 DB에 대해서 Vacuum 작업을 해야 함

• Autovacuum 데몬은 테이블 자료 추가/변경/삭제 된 경우, 무조건 작업의 고려 대상으로 판단 (임시 테이블은 대상에서 제외)

Vacuum 작업은내가 직접 작업량이적은 밤 시간에 주기적으로 해야지!

갑자기 변경이 많은 작업 발생 최악의 경우, Vacuum Full

DBA

Page 46: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal5) Autovacuum

autovacuum_naptimeautovacuum 데몬에 대한 “activity rounds”간격 즉, autovacuum 데몬이 한번 작업하고, 쉬는 시간 (기본 값 1분 – 초(秒)로 설정)

autovacuum_vacuum_threshold / autovacuum_analyze_threshold한 테이블 내에서 업데이트/삭제된 튜플이 설정 값만큼 된다면 VACUUM/ANAYLZE 작업하는 수행, 작업 시작할 최소 변경 수 (기본 값 50)

autovacuum_freeze_max_age한 테이블 내에서 마지막 vacuum 작업으로 pg_class.relfrozenxid 값이 지정된 뒤로, 이 설정 값보다 더 커지면 vacuum 작업 수행

autovacuum_vacuum_cost_delayautovacuum 데몬의 초과 비용 사용시, 멈추는 최대 시간

autovacuum_vacuum_cost_limitautovacuum 데몬이 사용할 수 있는 최대 비용

autovacuum_vacuum_scale_factor한 테이블 내에서 autovacuum_vacuum_threshold 값이 초과되어 vacuum 작업을 시작하려고 할 때, 추가적으로 테이블 크기의 변화량 (기본값은 0.2 = 테이블 크기의 20%)

Page 47: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal

Autovacuum이 작업하는 기준

5) Autovacuum

1. 테이블 나이가 autovacuum_freeze_max_age 설정으로 지정한 트랜잭션 수보다 많다면, 그 테이블은 무조건 Vacuum 작업

* 테이블의 나이: relfrozenxid 칼럼 값을 age () 함수로 조사한 값

2. 테이블의 자료가 변경되어, Vacuum 임계치를 초과했다면, Vacuum 작업

* Vacuum 임계치 = Vacuum 초기 임계치 + Vacuum 배율값 * 튜플수

• Vacuum 초기 임계치: autovacuum_vacuum_threshold

• Vacuum 배율값: autovacuum_vacuum_scale_factor

• 튜플수: pg_class.reltuples

Page 48: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal5) Autovacuum

autovacuum_analyze_scale_factor = 0.1

autovacuum_analyze_threshold = 50

1) 1000건 insert

2) autovacuum_naptime=60s 이상 wait 후 확인 : autoanalyze OK.

3) autovacuum_analyze_scale_factor=0.1 인 100건 insert wait 후 확인 : autoanalyze NOT OK.

Page 49: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal5) Autovacuum

autovacuum_analyze_scale_factor = 0.1

autovacuum_analyze_threshold = 50

4) autovacuum_analyze_threshold=50 인 50건 insert wait 후 확인 : autoanalyze NOT OK.

5) Only 1건 insert wait 후 확인 : autoanalyze OK.

autovacuum analyze 대상 조건 :

변경건수(insert포함) > ( reltuples * 0.1(autovacuum_analyze_scale_factor) ) + 50(autovacuum_analyze_scale_factor)

Page 50: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

PostgreSQL Deep Internal5) Autovacuum

autovacuum_vacuum_scale_factor = 0.2

autovacuum_vacuum_threshold = 50

1) 1000건 insert wait 후 확인 : autovacuum NOT OK.

2. autovacuum_vacuum_scale_factor=0.2 인 200건 update wait 후 확인 : autovacuum NOT OK.

Page 51: 제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀

Research & Contents

Blog

Video

E-mail

NAVER http://cafe.naver.com/playexem

ITPUB http://blog.itpub.net/31135309/

Wordpress https://playexem.wordpress.com/

Slideshare http://www.slideshare.net/playexem

Youtube https://www.youtube.com/channel/UC5wKR_-A0eL_Pn_EMzoauJg

Tudou http://www.tudou.com/home/maxgauge/

교육 문의: 연구컨텐츠팀 김숙진

[email protected]

© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.