ํ”„๋กœ์ ํŠธ/DB ์ž๋™ํ™”

DBA์™€ ์†Œํ†ตํ•˜๊ธฐ ์œ„ํ•œ DB ๋ชจ๋‹ˆํ„ฐ๋ง ์ง€ํ‘œ ๊ธฐ์ดˆ

THE NICOLE 2026. 6. 16. 10:18

ํ•ต์‹ฌ ์š”์•ฝ

DB ์ผ์ผ ์ ๊ฒ€ ์ž๋™ํ™” POC๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ฐ€์žฅ ๋จผ์ € ๋ง‰ํžŒ ๋ถ€๋ถ„์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹ˆ๋ผ ์ง€ํ‘œ ๊ทธ ์ž์ฒด์˜€์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ผ DBA๊ฐ€ ๋งค์ผ ๋ณด๋Š” ์ง€ํ‘œ(Active Session, Row Lock Waits, Redo, Vacuum ๊ฐ™์€ ๊ฒƒ๋“ค)๊ฐ€ ๋ฌด์—‡์„ ๋œปํ•˜๋Š”์ง€, ์–ด๋–ค ๊ฐ’์ด ์ •์ƒ์ด๊ณ  ์–ด๋–ค ๊ฐ’์ด ์œ„ํ—˜์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ฐ’์ด ์ด์ƒํ•˜๋ฉด ๋ฌด์—‡์„ ๋“ค์—ฌ๋‹ค๋ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ์ž๋™ ์ ๊ฒ€ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค๋ ค๋ฉด ๊ฒฐ๊ตญ ์ด ์ง€ํ‘œ๋“ค์„ ์ œ๊ฐ€ ์ดํ•ดํ•˜๊ณ  ์žˆ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธ€์€ ๊ทธ ๊ณผ์ •์—์„œ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. DB ๋ชจ๋‹ˆํ„ฐ๋ง์—์„œ ์ž์ฃผ ๋ณด๋Š” ์ง€ํ‘œ๋ฅผ 9๊ฐœ ๋ฌถ์Œ(CPU·์„ธ์…˜·์—ฐ๊ฒฐ·๋ฝ·์žฅ๊ธฐ์ฟผ๋ฆฌ·์“ฐ๊ธฐ·IO·๋ฉ”๋ชจ๋ฆฌ·์Šคํ† ๋ฆฌ์ง€)์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ๊ฐ ์ง€ํ‘œ๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€, ์ผ์ƒ์ ์ธ ๋น„์œ ๋กœ ์–ด๋–ป๊ฒŒ ์ดํ•ดํ•˜๋ฉด ๋˜๋Š”์ง€, Oracle·MySQL·PostgreSQL์—์„œ ๊ฐ๊ฐ ์–ด๋–ค SQL๋กœ ์ง์ ‘ ํ™•์ธํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ์–ด๋–ค ์žฅ์•  ์ƒํ™ฉ์—์„œ ๊ทธ ์ง€ํ‘œ๊ฐ€ ๋œจ๋Š”์ง€๋ฅผ ์‚ฌ๋ก€์™€ ํ•จ๊ป˜ ์ ์—ˆ์Šต๋‹ˆ๋‹ค. DBA์™€ ๋Œ€ํ™”ํ•  ๋•Œ ์ตœ์†Œํ•œ ๊ฐ™์€ ์–ธ์–ด๋กœ ๋งํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ดˆ ์ •๋ฆฌ๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

1. ์™œ ์ง€ํ‘œ๋ถ€ํ„ฐ ์•Œ์•„์•ผ ํ–ˆ๋‚˜

์ ๊ฒ€ ์ž๋™ํ™”์˜ ๋ชฉํ‘œ๋Š” ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ์ด ๋งค์ผ ์•„์นจ ์ฝ˜์†”์„ ์—ด์–ด "์–ด์ œ ์ด DB์— ์ด์ƒํ•œ ์ผ์ด ์žˆ์—ˆ๋‚˜"๋ฅผ ๋ˆˆ์œผ๋กœ ํ™•์ธํ•˜๋˜ ์ผ์„, ์‹œ์Šคํ…œ์ด ๋Œ€์‹  ๋ณด๊ณ  ์ด์ƒํ•˜๋ฉด ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ "์ด์ƒํ•˜๋‹ค"๋ฅผ ์ฝ”๋“œ๋กœ ํŒ๋‹จํ•˜๋ ค๋ฉด ๋จผ์ € ๋ฌด์—‡์„ ์ธก์ •ํ•œ ๊ฐ’์ธ์ง€๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์–ด๋–ค ์ง€ํ‘œ๊ฐ€ 27์ด๋ผ๋Š” ๊ฐ’์„ ๊ฐ€์กŒ์„ ๋•Œ, ๊ทธ๊ฒŒ ํ‰์†Œ 0~2์ด๋˜ ๊ฐ’์ด ํŠ„ ๊ฒƒ์ธ์ง€ ์•„๋‹ˆ๋ฉด ์›๋ž˜ ์ˆ˜๋ฐฑ๊นŒ์ง€๋„ ๊ฐ€๋Š” ๊ฐ’์ธ์ง€ ๋ชจ๋ฅด๋ฉด ์ž„๊ณ„๊ฐ’์กฐ์ฐจ ์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋น„์œ ํ•˜์ž๋ฉด ๊ฑด๊ฐ•๊ฒ€์ง„ ๊ฒฐ๊ณผํ‘œ๋ฅผ ์ฒ˜์Œ ๋ฐ›์•„ ๋“  ์ƒํ™ฉ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ˜ˆ์•• 120์ด๋ผ๋Š” ์ˆซ์ž๊ฐ€ ์ •์ƒ์ธ์ง€ ์œ„ํ—˜์ธ์ง€๋Š” "์ •์ƒ ๋ฒ”์œ„๊ฐ€ ์–ผ๋งˆ์ธ๊ฐ€"๋ฅผ ์•Œ์•„์•ผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DB ์ง€ํ‘œ๋„ ๋˜‘๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ž„๊ณ„๊ฐ’ ๊ธฐ์ค€ํ‘œ๋ฅผ ๋ฐ›๊ณ , ํ•œ ๋‹ฌ์น˜ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์—ด์–ด๋ณด๊ณ , DBA๊ฐ€ ์“ฐ๋Š” ํ™•์ธ ์ฟผ๋ฆฌ๋ฅผ ํ•˜๋‚˜์”ฉ ๋”ฐ๋ผ ์ณ๋ณด๋ฉด์„œ ๊ฐ ์ง€ํ‘œ์˜ ์ •์ƒ ๋ฒ”์œ„ ๊ฐ๊ฐ์„ ์ตํ˜”์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ๊ทธ๋ ‡๊ฒŒ ์ •๋ฆฌํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

2. ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฆฌํฌํŠธ๋ฅผ ์ฝ๋Š” ๊ธฐ๋ณธ ํ‹€

๋Œ€๋ถ€๋ถ„์˜ ์ ๊ฒ€ ๋ฆฌํฌํŠธ๋Š” ์ง€ํ‘œ๋ฅผ ํ‘œ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์นธ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์นธ ์˜๋ฏธ
์ง€ํ‘œ ๋ฌด์—‡์„ ์ธก์ •ํ–ˆ๋Š”๊ฐ€ (์˜ˆ: ํ™œ์„ฑ ์„ธ์…˜ ์ˆ˜)
๋Œ€ํ‘œ๊ฐ’ ๊ทธ ์‹œ๊ฐ„๋Œ€์˜ ๋Œ€ํ‘œ ์ธก์ •๊ฐ’. ๋ณดํ†ต 1๋ถ„ ํ‰๊ท ์„ ํ•˜๋ฃจ๋กœ ๋ชจ์•˜์„ ๋•Œ์˜ ์ตœ๋Œ“๊ฐ’ ๋˜๋Š” ๋Œ€ํ‘œ ํ†ต๊ณ„
์ž„๊ณ„ ์œ„ํ—˜์œผ๋กœ ํŒ๋‹จํ•˜๋Š” ๊ฒฝ๊ณ„์„ . ์ด ๊ฐ’์„ ๋„˜์œผ๋ฉด ๊ฒฝ๊ณ 
์ „์ผ๋Œ€๋น„ ์–ด์ œ ๊ฐ™์€ ๊ฐ’ ๋Œ€๋น„ ๋ช‡ ๋ฐฐ์ธ๊ฐ€. ์ ˆ๋Œ€๊ฐ’์€ ์ •์ƒ์ด์–ด๋„ ๊ธ‰์ฆ์ด๋ฉด ์˜์‹ฌ
์ƒํƒœ ์ •์ƒ / ์ฃผ์˜ / ์œ„ํ—˜

ํ•ต์‹ฌ ํŒ๋‹จ์€ ๋‘ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ฒซ์งธ, ๋Œ€ํ‘œ๊ฐ’์ด ์ž„๊ณ„๋ฅผ ๋„˜์—ˆ๋Š”๊ฐ€(์ ˆ๋Œ€ ๊ธฐ์ค€). ๋‘˜์งธ, ์ „์ผ ๋Œ€๋น„ ๊ธ‰์ฆํ–ˆ๋Š”๊ฐ€(์ƒ๋Œ€ ๊ธฐ์ค€). ์ข‹์€ ์ ๊ฒ€์€ ์ด ๋‘˜์„ ๊ฐ™์ด ๋ด…๋‹ˆ๋‹ค. ์ž„๊ณ„๋Š” ์•ˆ ๋„˜์—ˆ์ง€๋งŒ ํ‰์†Œ์˜ ๋‹ค์„ฏ ๋ฐฐ๋กœ ๋›ฐ์—ˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ๋„ ์‹ ํ˜ธ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ง€ํ‘œ๋ฅผ ๋ณผ ๋•Œ๋Š” ํ•ญ์ƒ "์ด ๊ฐ’์˜ ํ‰์†Œ ๋ฒ”์œ„๊ฐ€ ์–ผ๋งˆ์ธ๊ฐ€"๋ฅผ ๊ฐ™์ด ๊ธฐ์–ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ 100์ด๋ผ๋„ ์–ด๋–ค ์ง€ํ‘œ๋Š” ์ •์ƒ์ด๊ณ  ์–ด๋–ค ์ง€ํ‘œ๋Š” ๋น„์ƒ์ž…๋‹ˆ๋‹ค.

3. ์ง€ํ‘œ๋ฅผ 9๊ฐœ ๋ฌถ์Œ์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ

์ง€ํ‘œ๋Š” ์ˆ˜์‹ญ ๊ฐœ์ง€๋งŒ, ๊ฒฐ๊ตญ DB๊ฐ€ ์ผํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ธก๋ฉด์„ ๋‚˜๋ˆ  ๋ณธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ 9๊ฐœ ๋ฌถ์Œ์œผ๋กœ ์ดํ•ดํ•˜๋ฉด ์ฒ˜์Œ ๋ณด๋Š” ์ง€ํ‘œ๋„ "์•„, ์ด๊ฑด ๋ฝ ์ชฝ์ด๊ตฌ๋‚˜" ํ•˜๊ณ  ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌถ์Œ ๋Œ€ํ‘œ ์ง€ํ‘œ ํ•œ ์ค„ ์˜๋ฏธ
CPU CPU ์‚ฌ์šฉ๋ฅ  ์„œ๋ฒ„๊ฐ€ ์—ฐ์‚ฐ์œผ๋กœ ์–ผ๋งˆ๋‚˜ ๋ฐ”์œ๊ฐ€
์„ธ์…˜ Active Session / Active Backend ์ง€๊ธˆ ์‹ค์ œ๋กœ ์ผํ•˜๋Š” ์ ‘์†์ด ๋ช‡ ๊ฐœ์ธ๊ฐ€
์—ฐ๊ฒฐ Connections / Threads Connected ๋งบ์–ด์ง„ ์ปค๋„ฅ์…˜์ด ๋ช‡ ๊ฐœ์ธ๊ฐ€
๋ฝ(์ž ๊ธˆ) Row Lock Waits / Locks Waiting ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‘๊ณ  ์ค„ ์„œ์„œ ๊ธฐ๋‹ค๋ฆฌ๋Š”๊ฐ€
์žฅ๊ธฐ์ฟผ๋ฆฌ Long Active / Trx Time ์˜ค๋ž˜ ๋๋‚˜์ง€ ์•Š๋Š” ์ฟผ๋ฆฌ๊ฐ€ ์žˆ๋Š”๊ฐ€
์“ฐ๊ธฐ Redo / Undo / Insert·Update ๋ณ€๊ฒฝ ์ž‘์—…์ด ์–ผ๋งˆ๋‚˜ ๋ชฐ๋ฆฌ๋Š”๊ฐ€
IO IOPS / TPS / Reads ๋””์Šคํฌ ์ฝ๊ธฐ·์“ฐ๊ธฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋งŽ์€๊ฐ€
๋ฉ”๋ชจ๋ฆฌ Free Memory ์—ฌ์œ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ถฉ๋ถ„ํ•œ๊ฐ€
์Šคํ† ๋ฆฌ์ง€ Free Storage ๋””์Šคํฌ ๊ณต๊ฐ„์ด ์ถฉ๋ถ„ํ•œ๊ฐ€

์ด์ œ ๊ฐ ๋ฌถ์Œ์„ ํ•˜๋‚˜์”ฉ, ๋น„์œ ์™€ ์‹ค์ œ ์‚ฌ๋ก€, ํ™•์ธ ์ฟผ๋ฆฌ์™€ ํ•จ๊ป˜ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ๋Š” Oracle / MySQL / PostgreSQL ์ˆœ์„œ๋กœ ์ ์—ˆ๊ณ , ํด๋ผ์šฐ๋“œ ๊ด€๋ฆฌํ˜• DB(RDS ๋“ฑ)์—์„œ๋Š” ์ผ๋ถ€ ์ง€ํ‘œ๋ฅผ SQL์ด ์•„๋‹ˆ๋ผ ํด๋ผ์šฐ๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง(์˜ˆ: CloudWatch)์—์„œ ๋ณด๋Š” ๊ฒฝ์šฐ๋„ ํ•จ๊ป˜ ์ ์—ˆ์Šต๋‹ˆ๋‹ค.

4. CPU ์‚ฌ์šฉ๋ฅ 

๋œป: ์„œ๋ฒ„ CPU๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ฐ”์œ์ง€๋ฅผ ๋ฐฑ๋ถ„์œจ๋กœ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. 80%๋ฅผ ๊พธ์ค€ํžˆ ๋„˜์œผ๋ฉด ์—ฐ์‚ฐ์ด ํ•œ๊ณ„์— ๊ฐ€๊นŒ์šด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณดํ†ต ๋ฌด๊ฑฐ์šด ์ฟผ๋ฆฌ, ๋น„ํšจ์œจ์ ์ธ ์‹คํ–‰๊ณ„ํš, ํŠธ๋ž˜ํ”ฝ ๊ธ‰์ฆ์ด ์›์ธ์ž…๋‹ˆ๋‹ค.

๋น„์œ : CPU ์‚ฌ์šฉ๋ฅ ์€ ์ฃผ๋ฐฉ์žฅ ํ•œ ๋ช…์ด ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋Š” ์ฃผ๋ฌธ๋Ÿ‰๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฃผ๋ฌธ์ด ์ ๋‹นํ•˜๋ฉด ์—ฌ์œ  ์žˆ๊ฒŒ ๋Œ์•„๊ฐ€์ง€๋งŒ, ํ•œ ๋ฒˆ์— ๋ชฐ๋ฆฌ๋ฉด ๋ชจ๋“  ์š”๋ฆฌ๊ฐ€ ๋™์‹œ์— ๋А๋ ค์ง‘๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ์ ์€ CPU๊ฐ€ ๋†’๋‹ค๋Š” ๊ฑด "๋ฐ”์˜๋‹ค"๋Š” ๊ฒฐ๊ณผ์ผ ๋ฟ, ์™œ ๋ฐ”์œ์ง€๋Š” ๋”ฐ๋กœ ๋ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ธ์ œ ๋ณด๋‚˜: ์‘๋‹ต์ด ์ „๋ฐ˜์ ์œผ๋กœ ๋А๋ ค์งˆ ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ๋ด…๋‹ˆ๋‹ค. ๋‹ค๋งŒ CPU๋Š” ๊ฒฐ๊ณผ์ด์ง€ ์›์ธ์ด ์•„๋‹Œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์„œ, CPU๊ฐ€ ๋†’์œผ๋ฉด "๋ฌด์—‡์ด CPU๋ฅผ ์“ฐ๊ณ  ์žˆ๋‚˜"(์žฅ๊ธฐ์ฟผ๋ฆฌ·์„ธ์…˜)๋ฅผ ์ด์–ด์„œ ๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ์‚ฌ๋ก€: ์–ด๋А ์˜คํ›„ CPU๊ฐ€ 50%๋Œ€์—์„œ 90%๋กœ ์˜ฌ๋ž์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ํŠธ๋ž˜ํ”ฝ์ด ๋ชฐ๋ฆฐ ์ค„ ์•Œ์•˜์ง€๋งŒ, ์ ‘์† ์ˆ˜๋Š” ํ‰์†Œ์™€ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ์žฅ๊ธฐ์ฟผ๋ฆฌ ์ง€ํ‘œ๋ฅผ ๊ฐ™์ด ๋ณด๋‹ˆ ํ†ต๊ณ„์šฉ ์ง‘๊ณ„ ์ฟผ๋ฆฌ ํ•˜๋‚˜๊ฐ€ ์ธ๋ฑ์Šค๋ฅผ ํƒ€์ง€ ๋ชปํ•˜๊ณ  ์ „์ฒด ํ…Œ์ด๋ธ”์„ ํ›‘๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. CPU๋Š” ์ฆ์ƒ์ด์—ˆ๊ณ , ๋ฒ”์ธ์€ ์ฟผ๋ฆฌ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค.

ํ™•์ธ: ๊ด€๋ฆฌํ˜• DB์—์„œ๋Š” CPU ์‚ฌ์šฉ๋ฅ ์„ ํด๋ผ์šฐ๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง ์ง€ํ‘œ๋กœ ๋ณด๋Š” ๊ฒŒ ๊ฐ€์žฅ ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค. DB ๋‚ด๋ถ€์—์„œ ๊ฐ„์ ‘ ํ™•์ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

-- Oracle: ์ตœ๊ทผ CPU ๊ด€๋ จ ์‹œ์Šคํ…œ ์ง€ํ‘œ
SELECT metric_name, value
FROM   v$sysmetric
WHERE  metric_name LIKE 'Host CPU%';

-- MySQL: CPU๋ฅผ ๋งŽ์ด ์“ฐ๋Š” ์ฟผ๋ฆฌ ํ›„๋ณด(์‹คํ–‰ ์‹œ๊ฐ„ ๋ˆ„์  ์ƒ์œ„)
SELECT digest_text, count_star, sum_timer_wait
FROM   performance_schema.events_statements_summary_by_digest
ORDER  BY sum_timer_wait DESC
LIMIT  10;

-- PostgreSQL: ํ™œ์„ฑ ์ฟผ๋ฆฌ ์ค‘ ์˜ค๋ž˜ ๋„๋Š” ๊ฒƒ(CPU ์†Œ๋น„ ํ›„๋ณด)
SELECT pid, now() - query_start AS run_time, query
FROM   pg_stat_activity
WHERE  state = 'active'
ORDER  BY run_time DESC;

5. ์„ธ์…˜๊ณผ ์—ฐ๊ฒฐ

์ด ๋‘˜์€ ์ž์ฃผ ํ—ท๊ฐˆ๋ฆฌ๋Š”๋ฐ ๊ตฌ๋ถ„์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ์—ฐ๊ฒฐ(Connection): ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด DB์— ๋งบ์–ด ๋‘” ํ†ต๋กœ. ์ผ์„ ํ•˜์ง€ ์•Š์•„๋„ ์—ด๋ ค ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ™œ์„ฑ ์„ธ์…˜(Active Session): ๊ทธ ์—ฐ๊ฒฐ ์ค‘ ์ง€๊ธˆ ์‹ค์ œ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ ์ค‘์ธ ๊ฒƒ.

๋น„์œ : ์‹๋‹น์œผ๋กœ ๋น„์œ ํ•˜๋ฉด ์—ฐ๊ฒฐ์€ "์˜ˆ์•ฝํ•ด ๋‘” ์ขŒ์„"์ด๊ณ , ํ™œ์„ฑ ์„ธ์…˜์€ "์ง€๊ธˆ ์ฃผ๋ฌธํ•ด์„œ ์š”๋ฆฌ๋ฅผ ๋ฐ›๊ณ  ์žˆ๋Š” ํ…Œ์ด๋ธ”"์ž…๋‹ˆ๋‹ค. ์ขŒ์„์„ 100๊ฐœ ์˜ˆ์•ฝํ•ด ๋‘ฌ๋„ ์‹ค์ œ ์ฃผ๋ฌธ์ด 5๊ฐœ๋ฉด ์ฃผ๋ฐฉ์€ ํ•œ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์˜ˆ์•ฝ ์ขŒ์„์ด ๊ฐ€๊ฒŒ ์ •์›์„ ๊ฝ‰ ์ฑ„์šฐ๋ฉด, ์ƒˆ ์†๋‹˜์€ ์ž๋ฆฌ๊ฐ€ ์—†์–ด ๋“ค์–ด์˜ค์ง€๋„ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์–ธ์ œ ๋ณด๋‚˜: ์—ฐ๊ฒฐ ์ˆ˜๊ฐ€ ํ•œ๊ณ„(max_connections)์— ๊ฐ€๊นŒ์šฐ๋ฉด ์ƒˆ ์ ‘์†์ด ๊ฑฐ๋ถ€๋˜์–ด ์žฅ์• ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ํ™œ์„ฑ ์„ธ์…˜์ด ํ‰์†Œ๋ณด๋‹ค ๊ธ‰์ฆํ•˜๋ฉด ์ฟผ๋ฆฌ๊ฐ€ ๋นจ๋ฆฌ ์•ˆ ๋๋‚˜๊ณ  ์Œ“์ด๊ณ  ์žˆ๋‹ค๋Š” ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค.

์‹ค์ œ ์‚ฌ๋ก€: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ํ›„ ์ปค๋„ฅ์…˜ ํ’€์ด ์—ฐ๊ฒฐ์„ ์ œ๋Œ€๋กœ ๋ฐ˜๋‚ฉํ•˜์ง€ ์•Š๋Š” ์„ค์ • ์‹ค์ˆ˜๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ์„ ๋๋‚ธ ์—ฐ๊ฒฐ์ด ๋‹ซํžˆ์ง€ ์•Š๊ณ  ๊ณ„์† ์Œ“์—ฌ, Threads_connected๊ฐ€ ์ฒœ์ฒœํžˆ ์˜ฌ๋ผ ๊ฒฐ๊ตญ max_connections์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ˆœ๊ฐ„๋ถ€ํ„ฐ ์ƒˆ ์š”์ฒญ์€ "too many connections" ์˜ค๋ฅ˜๋กœ ์ „๋ถ€ ๊ฑฐ๋ถ€๋์Šต๋‹ˆ๋‹ค. ํ™œ์„ฑ ์„ธ์…˜์€ ์ ์€๋ฐ ์—ฐ๊ฒฐ๋งŒ ๊ฐ€๋“ ์ฐฌ, ์ „ํ˜•์ ์ธ ์ปค๋„ฅ์…˜ ๋ˆ„์ˆ˜์˜€์Šต๋‹ˆ๋‹ค.
-- Oracle: ์ „์ฒด ์—ฐ๊ฒฐ / ํ™œ์„ฑ ์„ธ์…˜
SELECT status, COUNT(*) FROM v$session GROUP BY status;   -- ACTIVE / INACTIVE
SELECT resource_name, current_utilization, limit_value
FROM   v$resource_limit
WHERE  resource_name IN ('sessions','processes');

-- MySQL: ์—ฐ๊ฒฐ ์ˆ˜์™€ ์ƒํ•œ
SHOW STATUS LIKE 'Threads_connected';
SHOW VARIABLES LIKE 'max_connections';
SHOW PROCESSLIST;   -- ๊ฐ ์—ฐ๊ฒฐ์ด ๋ฌด์—‡์„ ํ•˜๋Š”์ง€

-- PostgreSQL: ์ƒํƒœ๋ณ„ ์ ‘์† ์ˆ˜
SELECT state, COUNT(*) FROM pg_stat_activity GROUP BY state;
SHOW max_connections;

๋ฆฌํฌํŠธ์—์„œ "Active Session"์ด ์ž„๊ณ„๋ฅผ ๋„˜์—ˆ๋‹ค๋ฉด, ์œ„ ์ฟผ๋ฆฌ๋กœ ์ง€๊ธˆ ๋ฌด์Šจ ์ฟผ๋ฆฌ๋“ค์ด active ์ƒํƒœ์ธ์ง€ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6. ๋ฝ(์ž ๊ธˆ)

๋œป: DB๋Š” ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ์— ๊ณ ์น˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๊นจ์ง€๋ฏ€๋กœ, ํ•œ ์ž‘์—…์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์น˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ž‘์—…์€ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด "๊ธฐ๋‹ค๋ฆผ"์ด ๋Š˜์–ด๋‚œ ๊ฒƒ์ด ๋ฝ ๋Œ€๊ธฐ ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋ฆฌํฌํŠธ์˜ Innodb Row Lock Waits(MySQL), Locks Waiting(PostgreSQL)์ด ์—ฌ๊ธฐ ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

๋น„์œ : ํ•œ ์นธ์งœ๋ฆฌ ๊ณต์šฉ ํ™”์žฅ์‹ค๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•œ ์‚ฌ๋žŒ์ด ๋“ค์–ด๊ฐ€ ๋ฌธ์„ ์ž ๊ทธ๋ฉด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ๋ฐ–์—์„œ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์‚ฌ๋žŒ์ด ๋นจ๋ฆฌ ๋‚˜์˜ค๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ, ์•ˆ์—์„œ ํ•œ์ฐธ ์•ˆ ๋‚˜์˜ค๋ฉด ์ค„์ด ๊ธธ์–ด์ง‘๋‹ˆ๋‹ค. ๋ฝ ๋Œ€๊ธฐ ์ง€ํ‘œ๊ฐ€ ๋†’๋‹ค๋Š” ๊ฑด ์ด ๋Œ€๊ธฐ ์ค„์ด ๊ธธ์–ด์กŒ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

์–ธ์ œ ๋ณด๋‚˜: ํŠน์ • ํ™”๋ฉด์ด๋‚˜ ๊ธฐ๋Šฅ๋งŒ "๋ฉˆ์ถ˜ ๊ฒƒ์ฒ˜๋Ÿผ" ๋А๋ ค์งˆ ๋•Œ ์ „ํ˜•์ ์ธ ์›์ธ์ž…๋‹ˆ๋‹ค. ํ•œ ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ์˜ค๋ž˜ ๋ถ™์žก๊ณ  ์ปค๋ฐ‹์„ ์•ˆ ํ•˜๋ฉด, ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฑด๋“œ๋ฆฌ๋ ค๋Š” ๋‹ค๋ฅธ ์ž‘์—…๋“ค์ด ์ค„์ค„์ด ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ์‚ฌ๋ก€: ํ•œ ์šด์˜์ž๊ฐ€ ๊ด€๋ฆฌ ๋„๊ตฌ์—์„œ ํŠน์ • ์ฃผ๋ฌธ ํ–‰์„ ์ˆ˜์ •ํ•˜๋Š” ํŠธ๋žœ์žญ์…˜์„ ์—ด์–ด ๋‘” ์ฑ„ ์ž๋ฆฌ๋ฅผ ๋น„์› ์Šต๋‹ˆ๋‹ค(์ปค๋ฐ‹๋„ ๋กค๋ฐฑ๋„ ํ•˜์ง€ ์•Š์€ ์ƒํƒœ). ๊ทธ ์‚ฌ์ด ๊ฐ™์€ ์ฃผ๋ฌธ์„ ๊ฐฑ์‹ ํ•˜๋ ค๋˜ ๊ฒฐ์ œ ์ฒ˜๋ฆฌ๋“ค์ด ์ „๋ถ€ ๊ทธ ํ–‰์˜ ์ž ๊ธˆ์ด ํ’€๋ฆฌ๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ๋ฉˆ์ท„์Šต๋‹ˆ๋‹ค. Row Lock Waits๊ฐ€ ํ‰์†Œ 2์—์„œ ์ˆ˜์‹ญ์œผ๋กœ ํŠ€์—ˆ๊ณ , ๊ฒฐ์ œ ํ™”๋ฉด์ด "๋ฉˆ์ถ˜ ๊ฒƒ์ฒ˜๋Ÿผ" ๋А๋ ค์กŒ์Šต๋‹ˆ๋‹ค. ๋ง‰๊ณ  ์žˆ๋˜ ํŠธ๋žœ์žญ์…˜์„ ์ฐพ์•„ ์ข…๋ฃŒํ•˜์ž ์ฆ‰์‹œ ํ’€๋ ธ์Šต๋‹ˆ๋‹ค.
-- Oracle: ๋ˆ„๊ฐ€ ๋ˆ„๊ตฌ๋ฅผ ๋ง‰๊ณ  ์žˆ๋Š”๊ฐ€(blocker / waiter)
SELECT blocking_session, sid, serial#, username, event
FROM   v$session
WHERE  blocking_session IS NOT NULL;

-- MySQL: ์ž ๊ธˆ ๋Œ€๊ธฐ ๊ด€๊ณ„์™€ ๋Œ€๊ธฐ ์ค‘์ธ ํŠธ๋žœ์žญ์…˜
SELECT * FROM performance_schema.data_lock_waits;
SELECT trx_id, trx_state, trx_started, trx_query
FROM   information_schema.innodb_trx
ORDER  BY trx_started;
-- ์ƒ์„ธ ์ง„๋‹จ: SHOW ENGINE INNODB STATUS;

-- PostgreSQL: ํ—ˆ๊ฐ€๋˜์ง€ ์•Š์€(๋Œ€๊ธฐ ์ค‘) ์ž ๊ธˆ๊ณผ ๋ง‰๋Š” ์ชฝ
SELECT pid, relation::regclass, mode, granted
FROM   pg_locks
WHERE  NOT granted;
SELECT pid, pg_blocking_pids(pid) AS blocked_by, query
FROM   pg_stat_activity
WHERE  cardinality(pg_blocking_pids(pid)) > 0;

๋ฝ์€ ๊ฑฐ์˜ ํ•ญ์ƒ "์˜ค๋ž˜ ์ปค๋ฐ‹ ์•ˆ ํ•œ ํŠธ๋žœ์žญ์…˜ ํ•˜๋‚˜"๊ฐ€ ๋ฒ”์ธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฝ ์ง€ํ‘œ๊ฐ€ ๋œจ๋ฉด ๊ทธ ๋ง‰๊ณ  ์žˆ๋Š” ์„ธ์…˜(blocker)์„ ์ฐพ์•„ ๋ฌด์Šจ ์ฟผ๋ฆฌ์ธ์ง€ ๋ณด๋Š” ๊ฒŒ ์ฒซ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

7. ์žฅ๊ธฐ ์‹คํ–‰ ์ฟผ๋ฆฌ

๋œป: ๋ณดํ†ต ์ฟผ๋ฆฌ๋Š” ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค. ๋ช‡ ๋ถ„์”ฉ ๋„๋Š” ์ฟผ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์ธ๋ฑ์Šค๋ฅผ ์•ˆ ํƒ”๊ฑฐ๋‚˜, ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ํ›‘๊ฑฐ๋‚˜, ์ž ๊ธˆ์— ๊ฑธ๋ ค ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋ฆฌํฌํŠธ์˜ Long Active Threads(MySQL), Long Active Backend(PostgreSQL), Trx Time์ด ์—ฌ๊ธฐ ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

๋น„์œ : ๋งˆํŠธ ๊ณ„์‚ฐ๋Œ€์—์„œ ์•ž ์†๋‹˜ ํ•œ ๋ช…์ด ์˜์ˆ˜์ฆ ๋ฌธ์ œ๋กœ ์˜ค๋ž˜ ๋ถ™์žก์œผ๋ฉด, ๋’ค์— ์„  ์‚ฌ๋žŒ๋“ค์ด ์ „๋ถ€ ๋ฐ€๋ฆฝ๋‹ˆ๋‹ค. ์žฅ๊ธฐ ์ฟผ๋ฆฌ ํ•˜๋‚˜๊ฐ€ ๋”ฑ ๊ทธ ์†๋‹˜ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ž๊ธฐ๋งŒ ๋А๋ฆฐ ๊ฒŒ ์•„๋‹ˆ๋ผ ๋’ค๋”ฐ๋ฅด๋Š” ์ž‘์—…๊ณผ ์ž์›์„ ๊ฐ™์ด ๋ฌถ์–ด ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

์–ธ์ œ ๋ณด๋‚˜: ์œ„์˜ CPU·๋ฝ·์„ธ์…˜ ์ง€ํ‘œ๊ฐ€ ๋–ด์„ ๋•Œ ๊ทธ ์›์ธ์„ ์ฐพ๋Š” ๋‹จ๊ณ„์—์„œ ๋ด…๋‹ˆ๋‹ค. ์žฅ๊ธฐ ์ฟผ๋ฆฌ ํ•˜๋‚˜๊ฐ€ CPU๋„ ์“ฐ๊ณ , ๋ฝ๋„ ์žก๊ณ , ์„ธ์…˜๋„ ์ ์œ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์„œ ์‚ฌ์‹ค์ƒ ์ถœ๋ฐœ์ ์ž…๋‹ˆ๋‹ค.

์‹ค์ œ ์‚ฌ๋ก€: ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๊ด€๋ฆฌ์ž ํ†ต๊ณ„ ํ™”๋ฉด์—์„œ WHERE ์กฐ๊ฑด์ด ๋น ์ง„ ์ง‘๊ณ„ ์ฟผ๋ฆฌ๊ฐ€ ๋“ค์–ด๊ฐ”์Šต๋‹ˆ๋‹ค. ์ˆ˜๋ฐฑ๋งŒ ๊ฑด ํ…Œ์ด๋ธ”์„ ํ†ต์งธ๋กœ ์Šค์บ”ํ•˜๋А๋ผ ํ•œ ๋ฒˆ ์‹คํ–‰์— 5๋ถ„์”ฉ ๊ฑธ๋ ธ๊ณ , ๊ทธ ์‹œ๊ฐ„ ๋™์•ˆ CPU์™€ ๋””์Šคํฌ ์ฝ๊ธฐ๊ฐ€ ๊ฐ™์ด ์˜ฌ๋ž์Šต๋‹ˆ๋‹ค. ์žฅ๊ธฐ์ฟผ๋ฆฌ ๋ชฉ๋ก์—์„œ ๊ทธ ์ฟผ๋ฆฌ๋ฅผ ๋ฐœ๊ฒฌํ•ด ์กฐ๊ฑด๊ณผ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์ž, ์‹คํ–‰ ์‹œ๊ฐ„์ด 5๋ถ„์—์„œ 0.2์ดˆ๋กœ ์ค„์—ˆ์Šต๋‹ˆ๋‹ค.
-- Oracle: 60์ดˆ ์ด์ƒ ์‹คํ–‰ ์ค‘์ธ ํ™œ์„ฑ ์„ธ์…˜
SELECT sid, serial#, username, last_call_et AS sec_running, sql_id
FROM   v$session
WHERE  status = 'ACTIVE' AND last_call_et > 60
ORDER  BY last_call_et DESC;
-- sql_id ๋กœ ์‹ค์ œ ์ฟผ๋ฆฌ ํ…์ŠคํŠธ ์กฐํšŒ: SELECT sql_text FROM v$sql WHERE sql_id = '...';

-- MySQL: 60์ดˆ ์ด์ƒ ๋„๋Š” ์ฟผ๋ฆฌ
SELECT id, user, time, state, info
FROM   information_schema.processlist
WHERE  command = 'Query' AND time > 60
ORDER  BY time DESC;

-- PostgreSQL: 1๋ถ„ ์ด์ƒ active ์ธ ์ฟผ๋ฆฌ
SELECT pid, now() - query_start AS run_time, state, query
FROM   pg_stat_activity
WHERE  state = 'active' AND now() - query_start > interval '1 minute'
ORDER  BY run_time DESC;

8. ์“ฐ๊ธฐ ๋ถ€ํ•˜ (Redo / Undo / Commit)

๋ณ€๊ฒฝ ์ž‘์—…(INSERT·UPDATE·DELETE)์ด ๋งŽ์„ ๋•Œ ์˜ค๋ฅด๋Š” ์ง€ํ‘œ๋“ค์ž…๋‹ˆ๋‹ค. ์šฉ์–ด๊ฐ€ ๋‚ฏ์„ค์–ด์„œ ์งง๊ฒŒ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • Redo(Oracle): ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋ณต๊ตฌ์šฉ์œผ๋กœ ์ ์–ด ๋‘๋Š” ๋กœ๊ทธ. ์“ฐ๊ธฐ๊ฐ€ ๋งŽ์œผ๋ฉด redo ์ƒ์„ฑ๋Ÿ‰์ด ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค. (PostgreSQL์˜ WAL, MySQL์˜ InnoDB redo log๊ฐ€ ๊ฐ™์€ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.)
  • Undo(Oracle): ๋ณ€๊ฒฝ์„ ๋˜๋Œ๋ฆด(๋กค๋ฐฑ) ์ˆ˜ ์žˆ๋„๋ก ์ด์ „ ๊ฐ’์„ ๋ณด๊ด€ํ•˜๋Š” ์˜์—ญ. ํฐ ํŠธ๋žœ์žญ์…˜์ด ๊ธธ๊ฒŒ ๋Œ๋ฉด undo๊ฐ€ ์ปค์ง‘๋‹ˆ๋‹ค.
  • Commit / Insert·Update ์นด์šดํŠธ: ๋‹จ์œ„ ์‹œ๊ฐ„๋‹น ๋ณ€๊ฒฝ·ํ™•์ • ์ž‘์—… ์ˆ˜. ๋ฐฐ์น˜๊ฐ€ ๋Œ๋ฉด ๊ธ‰์ฆํ•ฉ๋‹ˆ๋‹ค.

๋น„์œ : ์€ํ–‰ ์žฅ๋ถ€๋ฅผ ๋– ์˜ฌ๋ฆฌ๋ฉด ๋ฉ๋‹ˆ๋‹ค. redo๋Š” "๋ฌด์Šจ ๊ฑฐ๋ž˜๋ฅผ ํ–ˆ๋Š”์ง€ ๊ทธ๋Œ€๋กœ ์ ์–ด ๋‘๋Š” ๊ธฐ๋ก"์ด๋ผ ๋‚˜์ค‘์— ์‚ฌ๊ณ ๊ฐ€ ๋‚˜๋„ ์žฅ๋ถ€๋ฅผ ๋ณด๊ณ  ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. undo๋Š” "์ทจ์†Œ๋ฅผ ๋Œ€๋น„ํ•ด ๋ณด๊ด€ํ•˜๋Š” ๊ฑฐ๋ž˜ ์ „ ์ž”์•ก"์ž…๋‹ˆ๋‹ค. ๊ฑฐ๋ž˜๊ฐ€ ๋งŽ์€ ๋‚ ์ผ์ˆ˜๋ก ๋‘ ๊ธฐ๋ก ๋ชจ๋‘ ๋‘๊บผ์›Œ์ง‘๋‹ˆ๋‹ค.

์–ธ์ œ ๋ณด๋‚˜: ์•ผ๊ฐ„ ๋ฐฐ์น˜, ๋Œ€๋Ÿ‰ ์ ์žฌ(bulk load), ๋Œ€๋Ÿ‰ ์‚ญ์ œ ๊ฐ™์€ ์ž‘์—…์ด ๋Œ ๋•Œ ์˜ค๋ฆ…๋‹ˆ๋‹ค. ์ด ์ง€ํ‘œ๋“ค์˜ ๊ธ‰์ฆ ์ž์ฒด๋Š” ์ •์ƒ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, "ํ‰์†Œ ์ด ์‹œ๊ฐ„๋Œ€์—๋Š” ์—†๋˜ ์“ฐ๊ธฐ"๊ฐ€ ๋ณด์ด๋ฉด ์˜ˆ์ •์— ์—†๋˜ ์ž‘์—…์„ ์˜์‹ฌํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ์‚ฌ๋ก€: ํ‰์†Œ ์ƒˆ๋ฒฝ์—๋งŒ ์˜ค๋ฅด๋˜ redo ์ƒ์„ฑ๋Ÿ‰์ด ํ•œ๋‚ฎ์— ํ‰์†Œ์˜ ๋‘ ๋ฐฐ๋กœ ํŠ€์—ˆ์Šต๋‹ˆ๋‹ค. ํ™•์ธํ•ด ๋ณด๋‹ˆ ๋ˆ„๊ตฐ๊ฐ€ ์šด์˜ DB์—์„œ ๋Œ€๋Ÿ‰ UPDATE๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์žฅ์• ๋Š” ์•„๋‹ˆ์—ˆ์ง€๋งŒ, "์ด ์‹œ๊ฐ„๋Œ€์— ์—†์–ด์•ผ ํ•  ์“ฐ๊ธฐ"๋ผ๋Š” ์‹ ํ˜ธ ๋•๋ถ„์— ์˜ˆ์ •์— ์—†๋˜ ์ž‘์—…์„ ๋นจ๋ฆฌ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
-- Oracle: redo ์ƒ์„ฑ๋Ÿ‰ / ํ™œ์„ฑ ํŠธ๋žœ์žญ์…˜์˜ undo ์‚ฌ์šฉ
SELECT name, value FROM v$sysstat
WHERE  name IN ('redo size','redo entries','user commits');
SELECT s.sid, t.used_ublk AS undo_blocks, t.status
FROM   v$transaction t JOIN v$session s ON t.addr = s.taddr;

-- MySQL: ๋ณ€๊ฒฝ ์ž‘์—… ์นด์šดํ„ฐ / redo ์“ฐ๊ธฐ๋Ÿ‰
SHOW GLOBAL STATUS WHERE Variable_name IN
  ('Com_insert','Com_update','Com_delete','Innodb_os_log_written');

-- PostgreSQL: ์ปค๋ฐ‹/๋กค๋ฐฑ ์ถ”์ด์™€ WAL ์œ„์น˜
SELECT datname, xact_commit, xact_rollback
FROM   pg_stat_database
WHERE  datname = current_database();
SELECT pg_current_wal_lsn();   -- WAL ์ง„ํ–‰ ์ง€์ (์ฆ๊ฐ€ ์†๋„๋กœ ์“ฐ๊ธฐ๋Ÿ‰ ๊ฐ€๋Š )

9. IO (IOPS / TPS / Reads)

๋œป: ๋””์Šคํฌ๋‚˜ ์Šคํ† ๋ฆฌ์ง€์— ๋Œ€ํ•œ ์ฝ๊ธฐ·์“ฐ๊ธฐ ์š”์ฒญ๋Ÿ‰์ž…๋‹ˆ๋‹ค. IOPS๋Š” ์ดˆ๋‹น ์ž…์ถœ๋ ฅ ํšŸ์ˆ˜, TPS๋Š” ์ดˆ๋‹น ํŠธ๋žœ์žญ์…˜ ์ˆ˜, physical reads / blks read๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์—†์–ด์„œ ๋””์Šคํฌ์—์„œ ์ง์ ‘ ์ฝ์–ด ์˜จ ์–‘์ž…๋‹ˆ๋‹ค.

๋น„์œ : ๋„์„œ๊ด€์—์„œ ์ผํ•˜๋Š” ๋ชจ์Šต๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ž์ฃผ ๋ณด๋Š” ์ฑ…์„ ์ฑ…์ƒ ์œ„(๋ฉ”๋ชจ๋ฆฌ)์— ๋‘๋ฉด ์†๋งŒ ๋ป—์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํ•„์š”ํ•œ ์ฑ…์ด ์ฑ…์ƒ์— ์—†์–ด ๋งค๋ฒˆ ์„œ๊ฐ€(๋””์Šคํฌ)๊นŒ์ง€ ๊ฑธ์–ด๊ฐ€ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค๋ฉด, ๊ฐ™์€ ์ผ์„ ํ•ด๋„ ํ›จ์”ฌ ๋А๋ ค์ง‘๋‹ˆ๋‹ค. physical reads๊ฐ€ ๋Š˜์—ˆ๋‹ค๋Š” ๊ฑด "์„œ๊ฐ€๊นŒ์ง€ ๊ฑธ์–ด๊ฐ€๋Š” ํšŸ์ˆ˜"๊ฐ€ ๋Š˜์—ˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

์–ธ์ œ ๋ณด๋‚˜: ๋””์Šคํฌ์—์„œ ์ง์ ‘ ์ฝ๋Š” ์–‘(physical reads)์ด ๊ฐ‘์ž๊ธฐ ๋Š˜๋ฉด, ์บ์‹œ(๋ฒ„ํผ)์— ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ž๊พธ ์ฝ๋Š”๋‹ค๋Š” ๋œป์ด๋ผ ๋น„ํšจ์œจ์ ์ธ ์ฟผ๋ฆฌ๋‚˜ ๋Œ€๋Ÿ‰ ์Šค์บ”์„ ์˜์‹ฌํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌํ˜• DB์—์„œ๋Š” IOPS ํ•œ๋„๋ฅผ ๋„˜์œผ๋ฉด throttling(์†๋„ ์ œํ•œ)์ด ๊ฑธ๋ ค ์ „์ฒด๊ฐ€ ๋А๋ ค์ง‘๋‹ˆ๋‹ค.

์‹ค์ œ ์‚ฌ๋ก€: ์บ์‹œ ์ ์ค‘๋ฅ ์ด ํ‰์†Œ 99%๋Œ€์—์„œ 85%๋กœ ๋–จ์–ด์ง„ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ ๋ฐฐ์น˜๊ฐ€ ์ธ๋ฑ์Šค ์—†๋Š” ์ปฌ๋Ÿผ์œผ๋กœ ๋Œ€๋Ÿ‰ ์กฐํšŒ๋ฅผ ํ•˜๋ฉด์„œ, ์บ์‹œ์— ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์—์„œ ๊ณ„์† ์ฝ์–ด ์˜จ ๊ฒƒ์ž…๋‹ˆ๋‹ค. physical reads๊ฐ€ ๊ธ‰์ฆํ–ˆ๊ณ , ๊ด€๋ฆฌํ˜• DB์˜ IOPS ํ•œ๋„์— ๊ฐ€๊นŒ์›Œ์ง€๋ฉด์„œ ๊ทธ ์‹œ๊ฐ„๋Œ€ ์ „์ฒด ์ฟผ๋ฆฌ๊ฐ€ ๋А๋ ค์กŒ์Šต๋‹ˆ๋‹ค. ๋ฐฐ์น˜์— ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์ž ์ ์ค‘๋ฅ ์ด ํšŒ๋ณต๋์Šต๋‹ˆ๋‹ค.
-- Oracle: ๋ฌผ๋ฆฌ ์ฝ๊ธฐ/์“ฐ๊ธฐ ํ†ต๊ณ„
SELECT name, value FROM v$sysstat
WHERE  name IN ('physical reads','physical writes','session logical reads');

-- MySQL: InnoDB ๋””์Šคํฌ ์ฝ๊ธฐ์™€ ๋ฒ„ํผํ’€ ์š”์ฒญ(์บ์‹œ ํšจ์œจ ๋น„๊ต)
SHOW GLOBAL STATUS WHERE Variable_name IN
  ('Innodb_data_reads','Innodb_buffer_pool_reads','Innodb_buffer_pool_read_requests');

-- PostgreSQL: ๋””์Šคํฌ ์ฝ๊ธฐ vs ์บ์‹œ ์ ์ค‘
SELECT datname, blks_read, blks_hit,
       round(blks_hit*100.0 / nullif(blks_hit + blks_read,0), 2) AS cache_hit_pct
FROM   pg_stat_database
WHERE  datname = current_database();

์—ฌ๊ธฐ์„œ ์บ์‹œ ์ ์ค‘๋ฅ (cache hit ratio)์€ ์ค‘์š”ํ•œ ๊ฐ๊ฐ์ž…๋‹ˆ๋‹ค. ๋ณดํ†ต 99% ์ด์ƒ์ด ๊ฑด๊ฐ•ํ•œ ์ƒํƒœ์ด๊ณ , ์ด ๊ฐ’์ด ๋–จ์–ด์ง€๋ฉด ๋””์Šคํฌ ์ฝ๊ธฐ๊ฐ€ ๋Š˜์–ด ์„ฑ๋Šฅ์ด ๋‚˜๋น ์ง‘๋‹ˆ๋‹ค.

10. ๋ฉ”๋ชจ๋ฆฌ

๋œป: DB๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ(๋ฒ„ํผ/์บ์‹œ)์— ์˜ฌ๋ ค ๋‘๊ณ  ์ผํ•ฉ๋‹ˆ๋‹ค. ์—ฌ์œ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด ์บ์‹œ๊ฐ€ ์ค„์–ด ๋””์Šคํฌ ์ฝ๊ธฐ๊ฐ€ ๋Š˜๊ณ , ์‹ฌํ•˜๋ฉด ์ž‘์—…์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

๋น„์œ : ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ž‘์—… ์ฑ…์ƒ์˜ ๋„“์ด์ž…๋‹ˆ๋‹ค. ์ฑ…์ƒ์ด ๋„“์œผ๋ฉด ์ž์ฃผ ์“ฐ๋Š” ์ž๋ฃŒ๋ฅผ ํŽผ์ณ ๋‘๊ณ  ๋ฐ”๋กœ ๊บผ๋‚ด ์“ฐ์ง€๋งŒ, ์ฑ…์ƒ์ด ์ข์œผ๋ฉด ๋งค๋ฒˆ ์„œ๋ž(๋””์Šคํฌ)์„ ์—ฌ๋‹ซ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. 9๋ฒˆ์˜ IO ๋ฌธ์ œ์™€ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์ด ์ž์ฃผ ๊ฐ™์ด ๋‚˜ํƒ€๋‚˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

์–ธ์ œ ๋ณด๋‚˜: ์—ฌ์œ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ง€์†์ ์œผ๋กœ ์ค„์–ด๋“œ๋Š” ์ถ”์„ธ์ด๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋‚˜ ๊ณผ๋„ํ•œ ์—ฐ๊ฒฐ์„ ์˜์‹ฌํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌํ˜• DB์—์„œ๋Š” FreeableMemory ์ง€ํ‘œ๋ฅผ ์ถ”์„ธ๋กœ ๋ด…๋‹ˆ๋‹ค.

-- Oracle: SGA / PGA ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์„ฑ
SELECT name, round(value/1024/1024) AS mb FROM v$sga;
SELECT name, value FROM v$pgastat WHERE name = 'total PGA allocated';

-- MySQL: InnoDB ๋ฒ„ํผํ’€ ํฌ๊ธฐ์™€ ์‚ฌ์šฉ
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW STATUS LIKE 'Innodb_buffer_pool_pages_free';

-- PostgreSQL: ๊ณต์œ  ๋ฒ„ํผ ์„ค์ •(์—ฌ์œ  ๋ฉ”๋ชจ๋ฆฌ ์ž์ฒด๋Š” OS/ํด๋ผ์šฐ๋“œ ์ง€ํ‘œ๋กœ)
SHOW shared_buffers;

11. ์Šคํ† ๋ฆฌ์ง€

๋œป: ๋ฐ์ดํ„ฐ๊ฐ€ ์Œ“์ด๋Š” ๋””์Šคํฌ ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค. ๊ฐ€๋“ ์ฐจ๋ฉด ๋” ์ด์ƒ ์“ฐ๊ธฐ๋ฅผ ๋ชป ํ•ด DB๊ฐ€ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋‹จ์ˆœํ•˜์ง€๋งŒ ํ•œ ๋ฒˆ ํ„ฐ์ง€๋ฉด ์น˜๋ช…์ ์ž…๋‹ˆ๋‹ค.

๋น„์œ : ์ฐฝ๊ณ ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌผ๊ฑด์ด ๊ณ„์† ๋“ค์–ด์˜ค๋Š”๋ฐ ๋น„์šฐ์ง€ ์•Š์œผ๋ฉด ์–ธ์  ๊ฐ€ ๊ฐ€๋“ ์ฐจ๊ณ , ๊ทธ ์ˆœ๊ฐ„๋ถ€ํ„ฐ๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋” ๋„ฃ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๊ฑด "์ง€๊ธˆ ์–ผ๋งˆ๋‚˜ ์ฐผ๋‚˜"๋ณด๋‹ค "์ด ์†๋„๋ฉด ๋ฉฐ์น  ๋’ค ๊ฐ€๋“ ์ฐจ๋‚˜"์ž…๋‹ˆ๋‹ค.

์–ธ์ œ ๋ณด๋‚˜: ์—ฌ์œ  ๊ณต๊ฐ„์ด ๋น ๋ฅด๊ฒŒ ์ค„์–ด๋“œ๋Š” ์ถ”์„ธ๋ฅผ ๋ด…๋‹ˆ๋‹ค. ์ ˆ๋Œ€ ์‚ฌ์šฉ๋ฅ (์˜ˆ: 85%)๋ณด๋‹ค๋„ "๋ฉฐ์น ์ด๋ฉด ๊ฐ€๋“ ์ฐจ๋Š”๊ฐ€"๋ผ๋Š” ์†๋„๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ์‚ฌ๋ก€: ๋กœ๊ทธ ํ…Œ์ด๋ธ”์„ ์ •๋ฆฌํ•˜๋Š” ๋ฐฐ์น˜๊ฐ€ ์–ด๋А ๋‚  ์กฐ์šฉํžˆ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งค์ผ ์Œ“์ด๊ธฐ๋งŒ ํ•˜๊ณ  ๋น„์›Œ์ง€์ง€ ์•Š์œผ๋‹ˆ ์—ฌ์œ  ๊ณต๊ฐ„์ด ์ผ์ •ํ•œ ์†๋„๋กœ ์ค„์—ˆ์Šต๋‹ˆ๋‹ค. ์ ˆ๋Œ€ ์‚ฌ์šฉ๋ฅ ์€ ์•„์ง 70%๋Œ€๋ผ ์ž„๊ณ„ ๊ฒฝ๊ณ ๋Š” ์•ˆ ๋–ด์ง€๋งŒ, "์ค„์–ด๋“œ๋Š” ์ถ”์„ธ"๋ฅผ ๋ณด๊ณ  ๋ฉฐ์น  ๋’ค ๊ฐ€๋“ ์ฐฐ ๊ฒƒ์„ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ถ”์„ธ๋ฅผ ๋ณด๋Š” ๊ฒƒ์ด ์ ˆ๋Œ€๊ฐ’๋งŒ ๋ณด๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚˜์•˜๋˜ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.
-- Oracle: ํ…Œ์ด๋ธ”์ŠคํŽ˜์ด์Šค ์‚ฌ์šฉ๋ฅ 
SELECT tablespace_name, used_percent
FROM   dba_tablespace_usage_metrics
ORDER  BY used_percent DESC;

-- MySQL: ์Šคํ‚ค๋งˆ๋ณ„ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ
SELECT table_schema, round(SUM(data_length+index_length)/1024/1024) AS mb
FROM   information_schema.tables
GROUP  BY table_schema
ORDER  BY mb DESC;

-- PostgreSQL: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํฌ๊ธฐ
SELECT datname, pg_size_pretty(pg_database_size(datname)) AS size
FROM   pg_database
ORDER  BY pg_database_size(datname) DESC;

๊ด€๋ฆฌํ˜• DB์˜ ์ „์ฒด ์—ฌ์œ  ๊ณต๊ฐ„์€ ๋ณดํ†ต ํด๋ผ์šฐ๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง์˜ FreeStorageSpace ์ง€ํ‘œ๋กœ ๋ด…๋‹ˆ๋‹ค.

12. DB๋ณ„ ํŠนํ™” ์ง€ํ‘œ

์œ„ 9๊ฐœ ๋ฌถ์Œ์€ ๊ณตํ†ต์ด๊ณ , DB๋งˆ๋‹ค ๋”ฐ๋กœ ์ฑ™๊ธฐ๋Š” ๋Œ€ํ‘œ ์ง€ํ‘œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Oracle ํ…Œ์ด๋ธ”์ŠคํŽ˜์ด์Šค

Oracle์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ด๋ธ”์ŠคํŽ˜์ด์Šค ๋‹จ์œ„๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋น„์œ ํ•˜๋ฉด ํฐ ์ฐฝ๊ณ ๋ฅผ ์šฉ๋„๋ณ„ ์นธ์œผ๋กœ ๋‚˜๋ˆ  ๋‘” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ „์ฒด ์ฐฝ๊ณ ์— ๊ณต๊ฐ„์ด ๋‚จ์•„๋„ ํŠน์ • ์นธ์ด ๊ฐ€๋“ ์ฐจ๋ฉด ๊ทธ ์นธ์— ๋„ฃ์–ด์•ผ ํ•  ๋ฌผ๊ฑด๋งŒ ๋ชป ๋„ฃ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ „์ฒด ๋””์Šคํฌ์™€ ๋ณ„๊ฐœ๋กœ ํ…Œ์ด๋ธ”์ŠคํŽ˜์ด์Šค๋ณ„ ์‚ฌ์šฉ๋ฅ ์„ ๋”ฐ๋กœ ์ฑ™๊น๋‹ˆ๋‹ค. ํ™•์ธ์€ ์œ„ 11๋ฒˆ์˜ dba_tablespace_usage_metrics๋ฅผ ์”๋‹ˆ๋‹ค.

MySQL ๋ณต์ œ ์ง€์—ฐ (Replication Lag)

์ฝ๊ธฐ ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐํ•˜๋ ค๊ณ  ๋ณต์ œ๋ณธ(replica)์„ ๋‘๋Š”๋ฐ, ์›๋ณธ์˜ ๋ณ€๊ฒฝ์ด ๋ณต์ œ๋ณธ์— ๋Šฆ๊ฒŒ ๋„์ฐฉํ•˜๋ฉด ๊ทธ๋งŒํผ ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋น„์œ ํ•˜๋ฉด ์‹ ๋ฌธ ๋ณธ์‚ฌ(์›๋ณธ)์™€ ์ง€๋ฐฉ ๋ฐฐ์†ก๋ณธ(๋ณต์ œ๋ณธ)์˜ ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค. ๋ฐฐ์†ก์ด ๋Šฆ์œผ๋ฉด ์ง€๋ฐฉ์—์„œ๋Š” ์–ด์ œ ๋‰ด์Šค๋ฅผ ์˜ค๋Š˜ ์ฝ๋Š” ์…ˆ์ž…๋‹ˆ๋‹ค.

์‹ค์ œ ์‚ฌ๋ก€: ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉ๊ธˆ ์ €์žฅํ•œ ๊ธ€์ด ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด ์‚ฌ๋ผ์กŒ๋‹ค ๋‚˜ํƒ€๋‚ฌ๋‹ค ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์“ฐ๊ธฐ๋Š” ์›๋ณธ์—, ์ฝ๊ธฐ๋Š” ๋ณต์ œ๋ณธ์—์„œ ํ–ˆ๋Š”๋ฐ ๋ณต์ œ ์ง€์—ฐ์ด ๋ช‡ ์ดˆ ์žˆ์–ด์„œ, ๋ฐฉ๊ธˆ ์“ด ๋ฐ์ดํ„ฐ๊ฐ€ ์•„์ง ๋ณต์ œ๋ณธ์— ๋„์ฐฉํ•˜์ง€ ์•Š์€ ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณต์ œ ์ง€์—ฐ ์ง€ํ‘œ๊ฐ€ 0์—์„œ ๋ฉ€์–ด์ง€๋ฉด ์ด๋Ÿฐ ํ˜„์ƒ์„ ์˜์‹ฌํ•ฉ๋‹ˆ๋‹ค.
-- MySQL: ๋ณต์ œ ์ง€์—ฐ(์ดˆ). 0์— ๊ฐ€๊นŒ์›Œ์•ผ ์ •์ƒ
SHOW REPLICA STATUS;   -- Seconds_Behind_Source ์—ด ํ™•์ธ
-- (๊ด€๋ฆฌํ˜• Aurora ๋“ฑ์—์„œ๋Š” ReplicaLag ๋ชจ๋‹ˆํ„ฐ๋ง ์ง€ํ‘œ๋กœ ๋ด„)

PostgreSQL Dead Tuple์™€ Vacuum

PostgreSQL์€ ํ–‰์„ UPDATE·DELETEํ•ด๋„ ์ฆ‰์‹œ ์ง€์šฐ์ง€ ์•Š๊ณ  "์ฃฝ์€ ํ–‰(dead tuple)"์œผ๋กœ ํ‘œ์‹œ๋งŒ ํ•ด ๋‘ก๋‹ˆ๋‹ค. ์ด๊ฒŒ ์Œ“์ด๋ฉด ํ…Œ์ด๋ธ”์ด ๋น„๋Œ€ํ•ด์ง€๊ณ  ์กฐํšŒ๊ฐ€ ๋А๋ ค์ง‘๋‹ˆ๋‹ค. ์ด๋ฅผ ์ฒญ์†Œํ•˜๋Š” ์ž‘์—…์ด VACUUM์ด๋ฉฐ, ๋ณดํ†ต autovacuum์ด ์ž๋™์œผ๋กœ ๋Œ์ง€๋งŒ ๋ณ€๊ฒฝ์ด ๋งŽ์œผ๋ฉด ๋ชป ๋”ฐ๋ผ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„์œ : ์‚ฌ๋ฌด์‹ค์—์„œ ๋ฒ„๋ฆฐ ์„œ๋ฅ˜๋ฅผ ๊ทธ๋•Œ๊ทธ๋•Œ ๊ฐ–๋‹ค ๋ฒ„๋ฆฌ์ง€ ์•Š๊ณ  ์ฑ…์ƒ ์˜†์— ์Œ“์•„ ๋‘๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—” ๊ดœ์ฐฎ์ง€๋งŒ ์Œ“์ผ์ˆ˜๋ก ํ•„์š”ํ•œ ์„œ๋ฅ˜๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ๋А๋ ค์ง‘๋‹ˆ๋‹ค. VACUUM์€ ์ด ์Œ“์ธ ํ์ง€๋ฅผ ์น˜์šฐ๋Š” ์ฒญ์†Œ๋ถ€์ด๊ณ , ์ฒญ์†Œ๋ถ€๊ฐ€ ์ผ์ด ๋ฐ€๋ฆฌ๋ฉด ์ฑ…์ƒ์ด ์ ์  ์ง€์ €๋ถ„ํ•ด์ง‘๋‹ˆ๋‹ค.

์‹ค์ œ ์‚ฌ๋ก€: ๋Œ€๋Ÿ‰ UPDATE ๋ฐฐ์น˜๋ฅผ ๋Œ๋ฆฐ ๋’ค ํŠน์ • ํ…Œ์ด๋ธ”์˜ ์กฐํšŒ๊ฐ€ ์ ์  ๋А๋ ค์กŒ์Šต๋‹ˆ๋‹ค. dead tuple์ด ๊ธ‰์ฆํ–ˆ๋Š”๋ฐ autovacuum์ด ๊ทธ ์†๋„๋ฅผ ๋ชป ๋”ฐ๋ผ๊ฐ€ ์ฒญ์†Œ๊ฐ€ ๋ฐ€๋ฆฐ ์ƒํƒœ์˜€์Šต๋‹ˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ VACUUM์„ ๋Œ๋ฆฌ๊ณ  autovacuum ์„ค์ •์„ ๊ทธ ํ…Œ์ด๋ธ”์— ๋งž๊ฒŒ ์กฐ์ •ํ•˜์ž ์กฐํšŒ ์†๋„๊ฐ€ ํšŒ๋ณต๋์Šต๋‹ˆ๋‹ค.
-- PostgreSQL: ์ฃฝ์€ ํ–‰์ด ๋งŽ์€ ํ…Œ์ด๋ธ”๊ณผ ๋งˆ์ง€๋ง‰ vacuum ์‹œ๊ฐ
SELECT relname, n_live_tup, n_dead_tup, last_autovacuum
FROM   pg_stat_user_tables
ORDER  BY n_dead_tup DESC
LIMIT  10;

์ฃฝ์€ ํ–‰ ๋น„์œจ์ด ๋†’๊ณ  last_autovacuum์ด ์˜ค๋ž˜์ „์ด๋ฉด, vacuum์ด ๋ฐ€๋ฆฌ๊ณ  ์žˆ๋‹ค๋Š” ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค.

13. ์‹ค์ œ ์‚ฌ๋ก€๋กœ ๋ฆฌํฌํŠธ ํ•œ ์ค„ ์ฝ์–ด๋ณด๊ธฐ

์ ๊ฒ€ ๋ฆฌํฌํŠธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•œ ์ค„์ด ๋–ด๋‹ค๊ณ  ํ•ฉ์‹œ๋‹ค.

์ง€ํ‘œ: Innodb Row Lock Waits   ๋Œ€ํ‘œ๊ฐ’: 27   ์ž„๊ณ„: 2   ์ƒํƒœ: ์œ„ํ—˜

์ด๊ฑธ ์ฝ๋Š” ์ˆœ์„œ๋Š” ์ด๋ ‡์Šต๋‹ˆ๋‹ค.

  • ๋ถ„๋ฅ˜: "Lock"์ด ๋“ค์–ด๊ฐ”์œผ๋‹ˆ ๋ฝ(์ž ๊ธˆ) ๋ฌถ์Œ. ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‘๊ณ  ๊ธฐ๋‹ค๋ฆฐ ์ƒํ™ฉ.
  • ์‹ฌ๊ฐ๋„: ํ‰์†Œ 0~2์ด๋˜ ๊ฐ’์ด 27. ์ž„๊ณ„ 2๋ฅผ ํ•œ์ฐธ ๋„˜์—ˆ์œผ๋‹ˆ ๊ฒฝํ•ฉ์ด ๋ถ„๋ช…ํžˆ ์žˆ์—ˆ๋‹ค.
  • ํ™•์ธ: MySQL์— ๋ถ™์–ด 6๋ฒˆ์˜ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
-- 1) ์ง€๊ธˆ ๋Œ€๊ธฐ ๊ด€๊ณ„๊ฐ€ ์žˆ๋‚˜
SELECT * FROM performance_schema.data_lock_waits;
-- 2) ์˜ค๋ž˜๋œ(=๋ง‰๊ณ  ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ) ํŠธ๋žœ์žญ์…˜ ์ฐพ๊ธฐ
SELECT trx_id, trx_state, trx_started, trx_query
FROM   information_schema.innodb_trx
ORDER  BY trx_started ASC
LIMIT  5;

๊ฐ€์žฅ ์˜ค๋ž˜๋œ ํŠธ๋žœ์žญ์…˜์˜ trx_query๋ฅผ ๋ณด๋ฉด ๋ฌด์—‡์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ™์žก๊ณ  ์žˆ์—ˆ๋Š”์ง€ ๋“œ๋Ÿฌ๋‚ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ์ปค๋ฐ‹์„ ๋น ๋œจ๋ฆฐ ๋ฐฐ์น˜๋‚˜, ์‚ฌ๋žŒ์ด ์—ด์–ด ๋‘” ํŠธ๋žœ์žญ์…˜์ด ๋ฒ”์ธ์ž…๋‹ˆ๋‹ค. ์ž๋™ ์ ๊ฒ€ ์‹œ์Šคํ…œ์€ ์—ฌ๊ธฐ๊นŒ์ง€(์–ด๋–ค ์ง€ํ‘œ๊ฐ€ ์–ธ์ œ ์–ผ๋งˆ๋‚˜ ํŠ€์—ˆ๋Š”์ง€ + ์–ด๋””๋ฅผ ๋ณด๋ฉด ๋˜๋Š”์ง€)๋ฅผ ๋ฉ”์ผ๋กœ ์•Œ๋ ค ์ฃผ๊ณ , ์‹ค์ œ ์กฐ์น˜๋Š” ์‚ฌ๋žŒ์ด ์œ„ ์ฟผ๋ฆฌ๋กœ ํ™•์ธํ•œ ๋’ค ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.

14. ์ง€ํ‘œ๋Š” ํ˜ผ์ž ์›€์ง์ด์ง€ ์•Š๋Š”๋‹ค

์ง€๊ธˆ๊นŒ์ง€ ์ง€ํ‘œ๋ฅผ ๋ฌถ์Œ๋ณ„๋กœ ๋‚˜๋ˆ  ๋ดค์ง€๋งŒ, ์‹ค์ œ ์žฅ์• ์—์„œ๋Š” ์—ฌ๋Ÿฌ ์ง€ํ‘œ๊ฐ€ ํ•œ๊บผ๋ฒˆ์— ์›€์ง์ž…๋‹ˆ๋‹ค. ์•ž์˜ ์‚ฌ๋ก€๋“ค์„ ๋ชจ์•„ ๋ณด๋ฉด ํ•˜๋‚˜์˜ ์—ฐ์‡„๊ฐ€ ๋ณด์ž…๋‹ˆ๋‹ค.

์žฅ๊ธฐ ์ฟผ๋ฆฌ ํ•˜๋‚˜๊ฐ€ ๋“ค์–ด์˜จ๋‹ค → ๊ทธ ์ฟผ๋ฆฌ๊ฐ€ CPU๋ฅผ ์“ฐ๊ณ (CPU ์ƒ์Šน) → ๋ฐ์ดํ„ฐ๋ฅผ ์˜ค๋ž˜ ๋ถ™์žก์•„ ๋‹ค๋ฅธ ์ž‘์—…์„ ๋ง‰๊ณ (๋ฝ ๋Œ€๊ธฐ ์ƒ์Šน) → ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ž‘์—…์ด ์Œ“์ด๋ฉฐ(ํ™œ์„ฑ ์„ธ์…˜ ์ƒ์Šน) → ๋๋‚˜์ง€ ์•Š์€ ์—ฐ๊ฒฐ์ด ๋ˆ„์ ๋œ๋‹ค(์—ฐ๊ฒฐ ์ˆ˜ ์ƒ์Šน).

๊ทธ๋ž˜์„œ ์—ฌ๋Ÿฌ ์ง€ํ‘œ๊ฐ€ ๋™์‹œ์— ๋–ด์„ ๋•Œ, ๊ฐ๊ฐ์„ ๋”ฐ๋กœ ๋ณด๋Š” ๊ฒƒ๋ณด๋‹ค "๋ฌด์—‡์ด ์ด ์—ฐ์‡„์˜ ์ถœ๋ฐœ์ ์ธ๊ฐ€"๋ฅผ ์ฐพ๋Š” ๊ฒŒ ๋น ๋ฆ…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๊ทธ ์ถœ๋ฐœ์ ์€ ์žฅ๊ธฐ ์‹คํ–‰ ์ฟผ๋ฆฌ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์–ด์ œ ๋งŒ๋“  ํŒจํ„ด ํƒ์ง€(์—ฌ๋Ÿฌ ์ง€ํ‘œ์˜ ์กฐํ•ฉ์ด ํ‰์†Œ์™€ ๋‹ค๋ฅธ์ง€๋ฅผ ๋ณด๋Š” ๋ฐฉ์‹)๊ฐ€ ์˜๋ฏธ ์žˆ๋Š” ์ด์œ ๋„ ์—ฌ๊ธฐ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€ํ‘œ ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ "๊ฐ™์ด ์›€์ง์ด๋Š” ๋ชจ์–‘"์„ ๋ณด๋ฉด ์ด๋Ÿฐ ์—ฐ์‡„๋ฅผ ๋” ๋นจ๋ฆฌ ์žก์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

15. DBA์™€ ๋Œ€ํ™”ํ•  ๋•Œ

์ง€ํ‘œ๋ฅผ ์•Œ๊ณ  ๋‚˜๋ฉด ๋Œ€ํ™”๊ฐ€ ๊ตฌ์ฒด์ ์ด ๋ฉ๋‹ˆ๋‹ค. "DB๊ฐ€ ๋А๋ ค์š”" ๋Œ€์‹  ์ด๋ ‡๊ฒŒ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • "์–ด์ œ ์˜คํ›„ 2์‹œ์ฏค Row Lock Waits๊ฐ€ ํ‰์†Œ 2์—์„œ 27๋กœ ํŠ€์—ˆ๋Š”๋ฐ, ๊ทธ ์‹œ๊ฐ„๋Œ€์— ๋ง‰๊ณ  ์žˆ๋˜ ํŠธ๋žœ์žญ์…˜์ด ์žˆ์—ˆ์„๊นŒ์š”?"
  • "physical reads๊ฐ€ ๋Š˜๊ณ  ์บ์‹œ ์ ์ค‘๋ฅ ์ด ๋–จ์–ด์กŒ๋Š”๋ฐ, ์ธ๋ฑ์Šค ์•ˆ ํƒ€๋Š” ์ฟผ๋ฆฌ๊ฐ€ ์ƒˆ๋กœ ๋“ค์–ด์™”์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์„๊นŒ์š”?"
  • "PostgreSQL dead tuple์ด ์Œ“์ด๋Š”๋ฐ autovacuum ์ฃผ๊ธฐ๋ฅผ ์กฐ์ •ํ•ด์•ผ ํ• ๊นŒ์š”?"

์ง€ํ‘œ์˜ ์ด๋ฆ„๊ณผ ํ‰์†Œ ๋ฒ”์œ„, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ง€ํ‘œ๊ฐ€ ๋œจ๋ฉด ๋ฌด์—‡์„ ๋ณด๋Š”์ง€๋ฅผ ์•Œ๋ฉด, DBA์˜ ํŒ๋‹จ์„ ์ดํ•ดํ•˜๊ณ  ์ž๋™ ์ ๊ฒ€ ์‹œ์Šคํ…œ์— ๊ทธ ํŒ๋‹จ ๊ธฐ์ค€์„ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์ ๊ฒ€ ์ž๋™ํ™”๋Š” ์ด ๋„๋ฉ”์ธ ์ง€์‹์„ ์ฝ”๋“œ๋กœ ์˜ฎ๊ธฐ๋Š” ์ž‘์—…์ด์—ˆ์Šต๋‹ˆ๋‹ค.

16. ํ•ต์‹ฌ ์ •๋ฆฌ

  • ์ง€ํ‘œ๋Š” 9๊ฐœ ๋ฌถ์Œ(CPU·์„ธ์…˜·์—ฐ๊ฒฐ·๋ฝ·์žฅ๊ธฐ์ฟผ๋ฆฌ·์“ฐ๊ธฐ·IO·๋ฉ”๋ชจ๋ฆฌ·์Šคํ† ๋ฆฌ์ง€)์œผ๋กœ ๋‚˜๋ˆ„๋ฉด ์ฒ˜์Œ ๋ณด๋Š” ๊ฒƒ๋„ ๋ถ„๋ฅ˜๋œ๋‹ค.
  • ํŒ๋‹จ์€ ์ž„๊ณ„ ์ดˆ๊ณผ์™€ ์ „์ผ ๋Œ€๋น„ ๊ธ‰์ฆ ๋‘ ์ถ•์œผ๋กœ ๋ณธ๋‹ค. ์ ˆ๋Œ€๊ฐ’๊ณผ ์ถ”์„ธ๋ฅผ ๊ฐ™์ด ๋ณธ๋‹ค.
  • ์ง€ํ‘œ๋งˆ๋‹ค ํ‰์†Œ ๋ฒ”์œ„ ๊ฐ๊ฐ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ฐ™์€ ์ˆซ์ž๋ผ๋„ ์ง€ํ‘œ์— ๋”ฐ๋ผ ์ •์ƒ๊ณผ ๋น„์ƒ์ด ๊ฐˆ๋ฆฐ๋‹ค.
  • ๋ฝ·CPU·์„ธ์…˜์ด ๋œจ๋ฉด ๊ฑฐ์˜ ํ•ญ์ƒ ์žฅ๊ธฐ ์‹คํ–‰ ์ฟผ๋ฆฌ๊ฐ€ ์ถœ๋ฐœ์ ์ด๋‹ค. ๊ทธ๊ฒƒ๋ถ€ํ„ฐ ์ฐพ๋Š”๋‹ค.
  • ์ง€ํ‘œ๋Š” ํ˜ผ์ž ์›€์ง์ด์ง€ ์•Š๋Š”๋‹ค. ๋™์‹œ์— ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋œจ๋ฉด ์—ฐ์‡„์˜ ์ถœ๋ฐœ์ ์„ ์ฐพ๋Š”๋‹ค.
  • DB๋ณ„ ํŠนํ™” ์ง€ํ‘œ(Oracle ํ…Œ์ด๋ธ”์ŠคํŽ˜์ด์Šค, MySQL ๋ณต์ œ ์ง€์—ฐ, PostgreSQL dead tuple)๋Š” ๋”ฐ๋กœ ์ฑ™๊ธด๋‹ค.

๋‹ค์Œ ๊ธ€์—์„œ๋Š” ์ด ์ง€ํ‘œ๋“ค์„ ์‹ค์ œ ์ ๊ฒ€ ์ž๋™ํ™” ์ฝ”๋“œ์—์„œ ์–ด๋–ป๊ฒŒ ์ž„๊ณ„๊ฐ’๊ณผ ํŒจํ„ด ํŒ์ •์œผ๋กœ ์˜ฎ๊ฒผ๋Š”์ง€ ์ด์–ด์„œ ์ •๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.