ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

BackEnd

MySQL metadata_locks

mokhs 2025. 2. 16. 22:15

์ตœ๊ทผ์— DDL์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ณผ์ •์—์„œ ๋ชจ๋“  Insert ์ฟผ๋ฆฌ๊ฐ€ ๋Œ€๊ธฐ ์ƒํƒœ์— ๋น ์ ธ ๋ฐ€๋ฆฌ๋Š” ํ˜„์ƒ์„ ๋ฐœ๊ฒฌํ•ด์„œ ์ •ํ™•ํ•œ ์›์ธ ๋ถ„์„์„ ์ง„ํ–‰ํ•˜๊ณ  ๊ทธ ๋‚ด์šฉ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋˜ ์ƒํ™ฉ

1. datagrip์—์„œ ๋ฌด๊ฑฐ์šด select ์ฟผ๋ฆฌ ์‹คํ–‰
2. datagrip์—์„œ ์ƒˆ๋กœ์šด ์„ธ์…˜์œผ๋กœ ALTER TABLE ์ฟผ๋ฆฌ๋ฅผ online DDL๋กœ ์‹คํ–‰
3. server application์—์„œ Insert ์ฟผ๋ฆฌ๊ฐ€ ๋Œ€๊ธฐ ์ƒํƒœ์— ๋น ์ง

์ผ๋ฐ˜์ ์œผ๋กœ ๋ดค์„ ๋•Œ๋Š” ์˜ค์ž‰ datagrip ๋ญ๊ฐ€ ๋ฌธ์ œ์ง€? ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค ์ˆ˜ ์žˆ๋Š”๋ฐ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ข€ ๋” ์•„๋ž˜์—์„œ ํ’€์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ ์›์ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜์–ด์š”

MySQL์—์„œ ALTER TABLE ์ฟผ๋ฆฌ๋Š” ์‹คํ–‰์„ ์œ„ํ•ด์„œ table metadata lock(=MDL)์„ ํš๋“ํ•ด์•ผ ํ•˜๊ณ  ์ด ๋•Œ, Exclusive Lock(๋ฐฐํƒ€์  ๋ฝ)์„ ํ•„์š”๋กœ ํ•˜๋Š”๋ฐ์š”.
์œ„ ์ƒํ™ฉ์—์„œ ๋ฌธ์ œ๋Š” ALTER TABLE ์ฟผ๋ฆฌ๊ฐ€ *์–ด๋–ค ์ด์œ ๋กœ ์ธํ•ด์„œ Exclusive Lock์„ ํš๋“ํ•˜์ง€ ๋ชปํ•ด์„œ ๋Œ€๊ธฐํ•˜๋Š” ์ƒํ™ฉ์ด์˜€๊ณ 
์ดํ›„์— ๋“ค์–ด์˜ค๋Š” Insert ์ฟผ๋ฆฌ๋Š” Shared Lock(๊ณต์œ  ๋ฝ)์„ ํ•„์š”๋กœ ํ•˜๋Š”๋ฐ, Exclusive Lock์ด MySQL์—์„œ ์ฒ˜๋ฆฌ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๊ธฐ ์ƒํƒœ์— ๋น ์ง€๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ *์–ด๋–ค ์ด์œ ์˜ ์ •์ฒด๋Š” "datagrip์—์„œ ๋ฌด๊ฑฐ์šด select ์ฟผ๋ฆฌ ์‹คํ–‰"์ด์—ˆ๊ณ , ์ด select ์ฟผ๋ฆฌ๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ Shared Lock์„ ์žก๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์ด์—ฌ์„œ ALTER TABLE ์ฟผ๋ฆฌ๊ฐ€ Exclusive Lock์„ ํš๋“ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด๋ผ๋Š” ๊ฑธ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

์žฌ์—ฐํ•ด๋ณด๋ฉด ๋ฐ”๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒํ™ฉ์ธ ๊ฑด๋ฐ์š” ๐Ÿค”
์‹ค์ œ๋กœ metadata lock ํ˜„ํ™ฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” performance_schema.metadata_locks ํ…Œ์ด๋ธ”์„
์‚ดํŽด๋ณด๋ฉด 
SHARED_READ LOCK์ด ์žกํ˜€์žˆ๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

๊ทธ๋ž˜์„œ ์˜๋„์น˜์•Š๊ฒŒ ์˜ค๋ž˜ ๋™์ž‘ํ•˜๊ณ  ์žˆ๋˜ select ์ฟผ๋ฆฌ ํ”„๋กœ์„ธ์Šค๋ฅผ KILL ํ•˜๊ณ  ALTER ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ด์„œ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ์‚ฌ์‹ค SELECT ์ฟผ๋ฆฌ์—์„œ Transaction์„ ๋ช…์‹œ์ ์œผ๋กœ ์‹คํ–‰ํ•œ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค

์‚ฌ์‹ค ์œ„ ์˜ˆ์‹œ๋Š” ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ์ผ๋ถ€๋Ÿฌ ๋ช…์‹œ์ ์œผ๋กœ Transaction์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ์ƒํ™ฉ์—์„œ "datagrip์—์„œ ๋ฌด๊ฑฐ์šด select ์ฟผ๋ฆฌ ์‹คํ–‰"ํ•  ๋•Œ Transacton์„ ์‹คํ–‰ํ•  ์ด์œ ๋„ ์—†์—ˆ๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ์‹คํ–‰ํ•œ ์ ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด Datagrip์—์„œ ์ž๋™์œผ๋กœ Transaction์„ ์žก์•˜๋‹ค๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋˜๋Š”๋ฐ, ์™œ ๊ทธ๋Ÿฐ ๊ฑธ๊นŒ์š”?

 

Transaction Mode : Auto

Datagrip์—๋Š” Transaction Mode ์˜ต์…˜์ด ์กด์žฌํ•˜๋Š”๋ฐ์š”.
์—ฌ๊ธฐ์„œ Auto ์˜ต์…˜์„ ์„ ํƒํ•˜๋ฉด (์•„๋งˆ ๊ธฐ๋ณธ๊ฐ’์ด์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค) Transaction commit์„ Datagrip์—์„œ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ณ„๋‹ค๋ฅธ ์ถ”๊ฐ€ ์„ค์ • ์—†์ด Datagrip์„ ์‚ฌ์šฉํ–ˆ์—ˆ๊ณ  ์—ฌ๊ธฐ์— Isolation level์ด REPEATABLE READ(์ด๊ฒƒ๋„ ๊ธฐ๋ณธ๊ฐ’์ด์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค)๋กœ ์žกํ˜€์žˆ์–ด์„œ SELECT ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ์— SHARED_READ lock์ด ์žกํžˆ๊ฒŒ ๋œ ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ดํ›„ Action Item

์œ„ ์ด์Šˆ๋ฅผ ๊ฒช์€ ์ดํ›„๋กœ ์žฌ๋ฐœ ๋ฐฉ์ง€๋„ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— SHARED_READ lock์„ ์˜ค๋ž˜ ์žก๊ณ  ์žˆ๋Š” ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ์ž๋™ํ™”๋œ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•œ ๊ณ„ํš์„ ์„ธ์›Œ๋‘์—ˆ๋Š”๋ฐ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค๋ฅธ ๊ธ€์—์„œ ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค :)

 

 

๋ฐ˜์‘ํ˜•