๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์—‘์…ˆ ๊ฒฝ์Ÿ๋ ฅ/DB ์ธ์‚ฌ์ด๋“œ

DB ์ธ์‚ฌ์ด๋“œ | PostgreSQL Vacuum - 2. Transaction ID

by EXEM 2022. 4. 29.

๐Ÿ“ข ๋ณธ ๋ฌธ์„œ์—์„œ๋Š” MVCC ๋ชจ๋ธ์„ ํ†ตํ•ด ์†Œ๊ฐœํ•œ Transaction ID(์ดํ•˜ XID)์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ์„  โ‘ XID์˜ ์ •์˜์™€ ์šฉ๋„๋ฅผ ํ™•์ธํ•˜๊ณ , โ‘ก๋ถ€์กฑํ•œ XID๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด PostgreSQL์ด ์„ ํƒํ•œ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Transaction ID

XID ๋ž€?

์šฐ๋ฆฌ๋Š” ๋ฏธ๋ž˜์— ์ผ์–ด๋‚  ์‚ฌ๊ฑด์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•˜์ง€๋งŒ ๊ณผ๊ฑฐ์— ์ผ์–ด๋‚ฌ๋˜ ์‚ฌ๊ฑด๋“ค์€ ์ถฉ๋ถ„ํžˆ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์‹ค์ด ์•„๋‹Œ DBMS์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ๋ จ์˜ ์‚ฌ๊ฑด๋“ค์„ ํŠธ๋žœ์žญ์…˜์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ํŠธ๋žœ์žญ์…˜์ด ๋ฐœ์ƒํ•œ ์‹œ์ ์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ์ •๋ณด๋กœ XID๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, XID๋ž€ ์ผ์ข…์˜ ์‹œ๊ฐ„ ์ •๋ณด๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

XID๋Š” ํŠธ๋žœ์žญ์…˜์ด ์ผ์–ด๋‚  ๋•Œ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€ํ•˜๋ฉฐ, MVCC๋ชจ๋ธ์˜ ๊ตฌํ˜„ ๋ฐ ์ฝ๊ธฐ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

XID ์‚ฌ์šฉ์šฉ๋„

ํŠธ๋žœ์žญ์…˜์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์ฆ๊ฐ€ํ•˜๋Š” XID๋ฅผ ์–ด๋””์—, ์–ด๋–ป๊ฒŒ ์ ์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ์ •๋ณด ์™€๋„ ๊ฐ™์€ XID๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ์ด ์ƒ๊ธธ ๋•Œ๋งˆ๋‹ค ๊ทธ ์‹œ์ ์„ ๊ธฐ๋กํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • relfrozenxid : Object ์ƒ์„ฑ ์‹œ์ ์˜ XID๋ฅผ Object์— ํ• ๋‹น (+ Vacuum ์ˆ˜ํ–‰ ์‹œ ์‹œ์  ๊ฐฑ์‹ )
  • XMIN, XMAX : Row(๋ ˆ์ฝ”๋“œ)๊ฐ€ ์ž…๋ ฅ๋˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ๋œ ์‹œ์ ์˜ XID๋ฅผ Row๋‹จ์œ„๋กœ ํ• ๋‹น

์ด์ฒ˜๋Ÿผ ์˜ค๋ธŒ์ ํŠธ, ๊ทธ๋ฆฌ๊ณ  Row ๋‹จ์œ„๋กœ ํ• ๋‹น๋˜๋Š” XID๋Š” ์กฐํšŒ ์‹œ์ ์˜ XID์™€ ๋น„๊ตํ•˜์—ฌ ์ฝ์„ ๋Œ€์ƒ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ๋„ ์“ฐ์ด๋ฉฐ, ๋„ˆ๋ฌด ์˜ค๋ž˜๋œ XID๋ฅผ ๊ฐ–๋Š” Object๋Š” Vacuum์˜ ๋Œ€์ƒ์ด ๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ตฌ์กฐ์ ์ธ ํ•œ๊ณ„์™€ ๋ณด์™„ ๋Œ€์ฑ…

๋ถ€์กฑํ•œ XID

XID๊ฐ€ ์‹œ๊ฐ„ ์ •๋ณด๋กœ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์€ ๊ทธ ๊ฐ’ ์ž์ฒด๋งŒ์œผ๋กœ ์‹œ์ ์„ ํŠน์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ๋‚ดํฌ๋˜์–ด ์žˆ์Œ์„ ์˜๋ฏธํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ์‚ด๊ณ  ์žˆ๋Š” 2022๋…„์ด ๋ฏธ๋ž˜์— ๋‹ค์‹œ ๋ฐ˜๋ณต๋˜์ง€ ์•Š์œผ๋ฆฌ๋ผ๋Š” ํ™•์‹ ๊ณผ๋„ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

PostgreSQL์˜ XID์™€ ๋น„๊ต ๊ฐ€๋Šฅํ•œ Oracle SCN์˜ ํ‘œํ˜„ ๋ฒ”์œ„๋Š” 2^63(19c ๊ธฐ์ค€)์œผ๋กœ, ๋ช‡ ์ฒœ๋…„ ์ด์ƒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ˆซ์ž๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œํ•œ์€ ์žˆ์œผ๋‚˜ ์‚ฌ์‹ค์ƒ ๊ทธ ์ˆ˜์น˜์— ๋„๋‹ฌํ•  ๋ฆฌ ๋งŒ๋ฌดํ•˜๋ฏ€๋กœ ์ž ์ •์ ์œผ๋กœ ์ถฉ๋ถ„ํ•œ ์ˆซ์ž๋ผ๊ณ  ๊ฒฐ๋ก  ๋‚ด๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

- DB ์ธ์‚ฌ์ด๋“œ | PostgreSQL Vacuum - 1. MVCC ๋‚ด์šฉ ไธญ -
๊ฐ ๋ ˆ์ฝ”๋“œ(row) ๋ณ„๋กœ 4 Byte์˜ ๋ฒ„์ „ ์ •๋ณด(XID)๋ฅผ ๋‘์–ด ์‹œ์ ์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค

ํ•˜์ง€๋งŒ PostgreSQL์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ์˜ ์ž…๋ ฅ ๋ฐ ๋ณ€๊ฒฝ ์‹œ Row ๋‹จ์œ„๋กœ XID๋ฅผ ํ• ๋‹นํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ณต๊ฐ„ ์‚ฌ์šฉ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค.

์ฆ‰, ๊ณต๊ฐ„ ์ ˆ์•ฝ์˜ ์ธก๋ฉด๊นŒ์ง€ ๊ณ ๋ คํ•ด ์ •์˜๋œ 4 Byte์˜ XID๊ฐ’์ด ์ด๋ฒˆ์—๋Š” ํ‘œํ˜„ ๊ฐ€๋Šฅํ•œ XID์˜ ๋ฒ”์œ„๋ฅผ ์ œ์•ฝํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 4 Byte๋กœ๋Š” ์•ฝ 43์–ต์˜ XID๋ฐ–์— ํ‘œํ˜„ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์ด๋Š” TPS๊ฐ€ ๋†’์€ ์‹œ์Šคํ…œ์—์„œ ๋ถˆ๊ณผ ๋ช‡ ๋‹ฌ์ด๋ฉด ๋ชจ๋‘ ์†Œ์ง„ํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์น˜์ž…๋‹ˆ๋‹ค.

์ˆœํ™˜ ๊ตฌ์กฐ

์ด์ฒ˜๋Ÿผ ์ ˆ๋Œ€์ ์ธ XID ๊ฐœ์ˆ˜๊ฐ€ ๋ถ€์กฑํ•œ ๊ตฌ์กฐ์ ์ธ ๋ฌธ์ œ๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ PostgreSQL์€ XID๋ฅผ ์ˆœํ™˜๊ตฌ์กฐ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํ˜„์žฌ ์‹œ์ ์„ ๊ธฐ์ค€์œผ๋กœ ์ด XID(40์–ต)์˜ ์ ˆ๋ฐ˜(20์–ต)์— ๋Œ€ํ•ด์„œ๋Š” ๋ฏธ๋ž˜์— ๋ฐœ์ƒํ•  ํŠธ๋žœ์žญ์…˜์„ ์œ„ํ•ด ์‚ฌ์šฉ๋  ์˜ˆ์•ฝ๋œ XID๊ณต๊ฐ„(Newer)์œผ๋กœ, ๋‚˜๋จธ์ง€ ์ ˆ๋ฐ˜(20์–ต)์€ ๊ณผ๊ฑฐ ๋ฐœ์ƒํ–ˆ๋˜ ํŠธ๋žœ์žญ์…˜์˜ ์ฝ๊ธฐ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ XID๊ณต๊ฐ„(Older)์œผ๋กœ ๋ถ„๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ PostgreSQL์˜ ์‹ค์ œ XID๋Š” ์•ฝ 43์–ต์ด๋ฉฐ, Newer/Older ์˜์—ญ์˜ XID๋Š” ๊ฐ๊ฐ ์•ฝ 21์–ต์ด์ง€๋งŒ, ๋ณธ ๋ฌธ์„œ์—์„œ๋Š” ๊ฐ„๋žตํ•œ ํ‘œํ˜„ ๋ฐ ์‰ฌ์šด ๊ณ„์‚ฐ์„ ์œ„ํ•ด ๊ฐ๊ฐ 40์–ต๊ณผ 20์–ต์œผ๋กœ ํ‘œํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

์ˆœํ™˜ ๊ตฌ์กฐ๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ๊ทธ๋ฆผ์„ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์•ž์„œ ์ด์•ผ๊ธฐํ•œ Newer/Older ์˜์—ญ์— ํฌํ•จ๋˜๋Š” XID๋Š” ๊ณ ์ •๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Newer/Older ์˜์—ญ์€ ๋‹จ์ˆœํžˆ ๊ณ ์ •๋œ ์ฐฝ๋ฌธ๊ณผ ๊ฐ™์ด(Window) ๊ฐ๊ฐ 20์–ต ๊ฐœ์˜ XID๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ์—ญํ• ๋งŒ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด์™€ ๋ฐ˜๋Œ€๋กœ XID๋Š” ํŠธ๋žœ์žญ์…˜์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ์ฒ˜๋Ÿผ ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ ์›€์ง์ด๋ฉฐ, ๋ ˆ์ผ์˜ ๋์— ๋„๋‹ฌํ•˜๋ฉด ๋‹ค์‹œ Newer์˜์—ญ์˜ ๋์œผ๋กœ ์ถ”๊ฐ€๋˜๋Š” ์‹์œผ๋กœ ์ˆœํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰ ํ˜„์žฌ ์‹œ์ ์— ๋”ฐ๋ผ Newer/Older ์˜์—ญ์— ํฌํ•จ๋˜๋Š” XID๋Š” ๋Š˜ ๋ณ€๊ฒฝ๋˜๋ฉฐ, ๋™์ผํ•œ ์ด์œ ๋กœ XID๊ฐ’ ์ž์ฒด์˜ ํฌ๊ณ  ์ž‘์Œ์ด Newer/Older๋ฅผ ๋ถ„๋ฅ˜ํ•˜๋Š” ๊ธฐ์ค€์ด ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

Anti-Wraparound์™€ Data Freezing

์—ฌ๊ธฐ๊นŒ์ง€ ์ดํ•ดํ–ˆ๋‹ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜๋ฌธ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

40์–ต์„ ์ฃผ๊ธฐ๋กœ ํ•˜๋‚˜์˜ Cycle์„ ๋„๋Š” ์ˆœํ™˜๊ตฌ์กฐ์—์„œ๋Š” ์–ด๋Š ์ˆœ๊ฐ„ ๋™์ผํ•œ XID๋กœ ์ธํ•œ ์‹œ์  ์‹๋ณ„์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋Š” ์•Š์„๊นŒ?

 

์˜ˆ๋ฅผ ๋“ค์–ด XID=3์ธ ์‹œ์ ์— ์ž…๋ ฅ๋œ ํ›„ ๋ณ€ํ™”๊ฐ€ ์—†๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐ„์ด ํ˜๋Ÿฌ Current XID๊ฐ€ 40์–ต ์‹œ์ ์ด ๋์„ ๋•Œ, XID=3์— ์ž…๋ ฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ๋ถ„๋ช… ๊ณผ๊ฑฐ์— ์ž…๋ ฅ๋˜์—ˆ์ง€๋งŒ ๊ทธ XID๋Š” Newer ์˜์—ญ์— ์œ„์น˜ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น XID๋ฅผ ๊ฐ–๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๊ณผ๊ฑฐ์˜ ๊ฒƒ์ธ์ง€ ๋ฏธ๋ž˜์˜ ๊ฒƒ์ธ์ง€ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ๊ทธ๋ฆผ์—์„œ XID์˜ ํ‘œํ˜„์„ 3๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ ์ด์œ ๊ฐ€ ์—ฌ๊ธฐ ์žˆ๋Š”๋ฐ, 0,1,2๋Š” ํŠน์ˆ˜ํ•œ ์˜๋ฏธ๋ฅผ ์ง€๋‹Œ ์˜ˆ์•ฝ๋œ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ์ค‘, XID=2๋ฅผ Frozen XID๋ผ๊ณ  ํ•˜๋ฉฐ, ์‹ค์ œ ํŠธ๋žœ์žญ์…˜์— ์‚ฌ์šฉ๋˜๋Š” ์ผ๋ฐ˜ XID์˜ ๋ฒ”์œ„๋Š” 3~40์–ต ์ด๋ฏ€๋กœ Frozen XID๋Š” ํ•ญ์ƒ ์–ด๋–ค ์ผ๋ฐ˜ XID๋ณด๋‹ค ์ž‘์Œ(์˜ค๋ž˜๋จ)์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ํšŒํ”ผํ•˜๊ณ ์ž PostgreSQL์€ “Current XID - ์ƒ์„ฑ(์ž…๋ ฅ) ์‹œ์ ์˜ XID๊ฐ€ ํ•œ Cycle์˜ ์ ˆ๋ฐ˜์ธ ์•ฝ 20์–ต(=Older ์˜์—ญ์— ์œ„์น˜ํ•˜๋Š” ๊ธฐ๊ฐ„)์„ ๋ฒ—์–ด๋‚˜๊ธฐ ์ „์— ํ•ด๋‹น ์ž๋ฃŒ๋“ค์˜ XID๋ฅผ ํŠน์ˆ˜ํ•œ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ๋˜ ํ•˜๋‚˜ ์•Œ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์‹ค์€ 40์–ต ๊ฐœ์˜ XID ์ค‘ ์‹ค์ œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ XID๋Š” 20์–ต ๊ฐœ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ด์ฒ˜๋Ÿผ XID Wraparound๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ์ผ๋ จ์˜ ์ž‘์—…์„ Data Freezing์ด๋ผ ๋ถ€๋ฅด๋ฉฐ, ๋‚ด๋ถ€์ ์œผ๋กœ XID๊ฐ’์„ Frozen XID๋ผ๋Š” ํŠน์ˆ˜ํ•œ ๊ฐ’์œผ๋กœ ํ‘œ์‹œํ•˜์—ฌ ์˜๊ตฌ์ ์ธ ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ์ž„์„ ํ‘œ์‹œํ•˜๋Š” ์ผ๋ จ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿด ๊ฒฝ์šฐ XID=3 ์‹œ์ ์— ์ž…๋ ฅ๋˜์—ˆ๋˜ ๋ฐ์ดํ„ฐ๋Š” Current XID๊ฐ€ 20์–ต์ด ๋˜๊ธฐ ์ „์— ์ด๋ฏธ Frozen XID๋กœ์˜ ๋ณ€๊ฒฝ์ด ๋ณด์žฅ๋˜๋ฏ€๋กœ ์ดํ›„์— XID=3 ์‹œ์ ์— ์ž…๋ ฅ๋˜๋Š” ๋ฐ์ดํ„ฐ์™€์˜ ์‹๋ณ„ ๋ฌธ์ œ์—์„œ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ธฐํš ๋ฐ ๊ธ€ | ๊ธฐ์ˆ ๊ธฐํšํŒ€

์ด๋ฏธ์ง€ ์ œ์ž‘ | ๋””์ž์ธ๊ทธ๋ฃน ์ด๋ฏผ์„

 

 

 

๋Œ“๊ธ€0