ํต์ฌ ์์ฝ
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)๋ ๋ฐ๋ก ์ฑ๊ธด๋ค.
๋ค์ ๊ธ์์๋ ์ด ์งํ๋ค์ ์ค์ ์ ๊ฒ ์๋ํ ์ฝ๋์์ ์ด๋ป๊ฒ ์๊ณ๊ฐ๊ณผ ํจํด ํ์ ์ผ๋ก ์ฎ๊ฒผ๋์ง ์ด์ด์ ์ ๋ฆฌํ๊ฒ ์ต๋๋ค.
'ํ๋ก์ ํธ > DB ์๋ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ํฐ๋ง ์งํ ์ ๋ฆฌ (2) Oracle (0) | 2026.06.19 |
|---|---|
| ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ํฐ๋ง ์งํ ์ ๋ฆฌ (1) - MySQL (0) | 2026.06.18 |
| DB ์ผ์ผ ์ ๊ฒ ์๋ํ POC (7) PCA ๋น์ง๋ ์ด์ ํ์ง (0) | 2026.06.15 |
| DB ์ผ์ผ ์ ๊ฒ ์๋ํ POC (6) ๋ฉ์ผ ๋ฐ์ก (0) | 2026.06.15 |
| DB ์ผ์ผ ์ ๊ฒ ์๋ํ POC (5) ๋ฆฌํฌํธ ์์ฑ (1) | 2026.06.15 |