๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐ˜์‘ํ˜•

1. ๋ฝ ํ™•์ธ ์ฟผ๋ฆฌ

SELECT t.relname,
       l.locktype,
       page,
       virtualtransaction,
       pid,
       mode,
       granted
FROM pg_locks l,
     pg_stat_all_tables t
WHERE l.relation = t.relid
ORDER BY relation ASC;

์–ด๋–ค ํ…Œ์ด๋ธ”์— ์–ด๋–ค PID๊ฐ€ ๋ฝ ๊ฑธ์—ˆ๋Š”์ง€ ํ™•์ธ ๊ฐ€๋Šฅ

 

ํ˜„์žฌ ํ™œ๋™์ค‘์ธ ์„ธ์…˜ ๋ณด๊ธฐ (pg_stat_activity๋„ ๊ฐ™์ด๋ณด๋ฉด์„œ ํ™•์ธ)

SELECT pid, state, query, wait_event_type, wait_event
FROM pg_stat_activity
WHERE state != 'idle';

 

2. ๋ˆ„๊ฐ€ ๋ˆ„๊ตฌ๋ฅผ ๋ง‰๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธ

SELECT pid,
       pg_blocking_pids(pid) AS blocked_by
FROM pg_stat_activity
WHERE cardinality(pg_blocking_pids(pid)) > 0;

ํ˜„์žฌ ์‹คํ–‰์ค‘์ด๊ฑฐ๋‚˜ ๋Œ€๊ธฐ์ค‘์ธ ์ฟผ๋ฆฌ๋“ค ํ™•์ธ ๊ฐ€๋Šฅ

 

๋ˆ„๊ฐ€ ๋ˆ„๊ตฌ๋ฅผ ๋ง‰๊ณ  ์žˆ๋Š”์ง€  (blocker ์ •๋ณด๊นŒ์ง€ ํ™•์ธ)

SELECT blocked.pid     AS blocked_pid,
       blocked.query   AS blocked_query,
       blocking.pid    AS blocking_pid,
       blocking.query  AS blocking_query
FROM pg_stat_activity blocked
JOIN pg_stat_activity blocking
  ON blocking.pid = ANY(pg_blocking_pids(blocked.pid));

 

3. blocker์ธ์ง€ victim์ธ์ง€ ํ™•์ธ ํ›„ terminate > ๋ฌธ์ œ ์žˆ๋Š” ์„ธ์…˜ ๊ฐ•์ œ ์ข…๋ฃŒ (๋ฝ ํ•ด์ œ)

SELECT pg_terminate_backend(12345); -- PID ๋„ฃ๊ธฐ

ํ•ด๋‹น PID๊ฐ€ ์ ์œ ํ•˜๊ณ  ์žˆ๋Š” ์„ธ์…˜์„ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒํ•จ

๋ฝ์ด ํ•ด์ œ๋จ ( ์ข…๋ฃŒ๋˜๋ฉด์„œ ๋กค๋ฐฑ๋„ ๊ฐ™์ด ๊ฐ )

 

Blocker vs Victim

๊ตฌ๋ถ„ ์„ค๋ช… ์˜ˆ์‹œ
Blocker ๋ฝ์„ ๋จผ์ € ์žก๊ณ  ์žˆ๋Š” ์„ธ์…˜. ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๊ธฐ๋‹ค๋ฆฌ๋Š” ์›์ธ ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘ ํ›„ UPDATE ํ–ˆ์ง€๋งŒ ์ปค๋ฐ‹/๋กค๋ฐฑ ์•ˆ ํ•œ ์ƒํƒœ
Victim ๋ฝ์ด ํ’€๋ฆฌ๊ธธ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์„ธ์…˜. ๋ง‰ํžŒ ์ชฝ ๋‹ค๋ฅธ ์„ธ์…˜์ด ๊ฐ™์€ row๋ฅผ UPDATE ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•จ → ๋Œ€๊ธฐ ์ƒํƒœ ๋จ

 

์˜ˆ: 
1. ์„ธ์…˜ A๊ฐ€ row๋ฅผ UPDATE ํ›„ ์ปค๋ฐ‹ ์•ˆํ•จ → Blocker
2. ์„ธ์…˜ B๊ฐ€ ๊ฐ™์€ row UPDATE ์‹œ๋„ → Victim (๋Œ€๊ธฐ์ƒํƒœ)

 

์ฃผ์˜ํ•  ์ 

์ƒํ™ฉ ์„ค๋ช…
์„ธ์…˜์ด ๋น„์ •์ƒ์  ํŠธ๋žœ์žญ์…˜์ด ์˜ค๋ž˜ ์—ด๋ ค ์žˆ๊ณ  ์•„๋ฌด ์ž‘์—…๋„ ์•ˆ ํ•˜๋ฉด ์ข…๋ฃŒํ•ด๋„ ๋จ
์ค‘์š”ํ•œ ์ž‘์—… ์ค‘ ์˜ˆ: ๋ฐฐ์น˜, ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜, ์‚ฌ์šฉ์ž DML ๋“ฑ์ด๋ฉด ์ ˆ๋Œ€ ํ•จ๋ถ€๋กœ ์ข…๋ฃŒํ•˜๋ฉด ์•ˆ ๋จ
์šด์˜ DB ๋ฌด์ž‘์ • terminate ํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์†์‹ค, ์žฅ์•  ์œ ๋ฐœ ๊ฐ€๋Šฅํ•จ
Deadlock ์ƒํƒœ pg_stat_activity, pg_locks, pg_blocking_pids() ๊ฐ™์ด ํ™•์ธ ํ›„ ํŒ๋‹จํ•ด์•ผ ํ•จ

 

๋ฐ˜์‘ํ˜•