ํฐ์คํ ๋ฆฌ ๋ทฐ
MySQL MDL(metadata_locks): insert ์ฟผ๋ฆฌ๊ฐ ๋ณ๋ชฉ ์ํ์ ๋น ์ง๋ ์ด์ ๊ธ์์ ์ด์ด์ง๋ ๋ด์ฉ์
๋๋ค.
์ด ๊ธ์ MySQL InnoDB ์์ง ๊ธฐ์ค์ผ๋ก ์์ฑ๋ฉ๋๋ค.
์ด์ ๊ธ์์ MySQL MDL(metadata_locks)๋ก ์ธํด์ ์๋์น ์๊ฒ insert ์ฟผ๋ฆฌ๊ฐ ๋ณ๋ชฉ ์ํ์ ๋น ์ก์๋๋ฐ์ ๐ฅฒ
์ด๋ฒ ๊ธ์์๋ ์ฌ๋ฐ ๋ฐฉ์ง๋ฅผ ์ํด์ Observability๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ธฐ๋กํด๋ณด๋ ค๊ณ ํด์.
๋จผ์ , MDL์ ๋ํด์ ์ ํํ ์ดํดํด์ผ ์ ์ ํ metric์ ๋ฝ์์ ํจ์จ์ ์ผ๋ก Observability๋ฅผ ํ๋ณดํ ์ ์์ ๊ฑฐ์์.
๊ทธ๋์ Metadata Lock(MDL)์ ๋ํด์ ์ข ๋ ์์๋ณด๋ ค๊ณ ํฉ๋๋ค.
MySQL Metadata Lock(MDL) ์ดํดํ๊ธฐ
MySQL์ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ๋์ ์ ๊ทผ์ ์์ ํ๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ค์ํ ์ ํ์ ๋ฝ์ ์ฌ์ฉํด์.
๊ทธ์ค ๋ฉํ๋ฐ์ดํฐ ๋ฝ(Metadata Lock, MDL)์ ํ
์ด๋ธ์ด๋ ์คํค๋ง ๊ตฌ์กฐ์ ๋ฌด๊ฒฐ์ฑ์ ๋ณดํธํ๋ ์ญํ ์ ํฉ๋๋ค.
MDL์ ํ
์ด๋ธ์ ์ฝ๊ฑฐ๋ ์ฐ๋ ๊ฒฝ์ฐ, ํ
์ด๋ธ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ ๋ ์๋์ผ๋ก ํ๋๋ฉ๋๋ค.
fyi; ์์์ ์ด์ผ๊ธฐํ๋ฏ์ด MDL์ MySQL์์ ํ
์ด๋ธ์ด๋ ์คํค๋ง ๊ตฌ์กฐ์ ๋ฌด๊ฒฐ์ฑ์ ๋ณดํธํ๊ธฐ ์ํ ์ญํ ์ ํฉ๋๋ค.
์ด๋ฐ Lock ๊ฐ๋
์ ์ฌ๋ฌ ์์ฒญ์ด ๋์์ ๋ค์ด์ฌ ์ ์๋ ์์คํ
(=๋์ ์ฒ๋ฆฌ ์์คํ
)์์ ํ์ฉ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ์,
๋์ ์ฒ๋ฆฌ ์์คํ
์์ ๋ฌด๊ฒฐ์ฑ์ด ์ค์ํ ๊ฒฝ์ฐ, ํญ์ ๊ฒฝ์ ์กฐ๊ฑด(=race condition)์ ๊ณ ๋ คํด์ผ ํ๊ณ ์ด ๋ lock ๊ฐ๋
์ ํ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๊ฝค ์์ต๋๋ค.
Metadata Lock ์ ํ
MySQL InnoDB์์ Lock์ ์ฌ๋ฌ ์ ํ์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ ๊ณ์ธต์ ์ผ๋ก ๋๋์ด์ ธ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ Metadata Lock์๋ ๊ฐ์ ๋ฉ์ปค๋์ฆ์ด ํ์ฉ๋ผ์.
์ผ๋ฐ์ ์ผ๋ก Lock์ ์ ์ ํ๋ ๊ฐ๋ ์ด๊ธฐ ๋๋ฌธ์ ๊ณผ๋ํ๊ฒ ์์ฑ๋๋ฉด ์ฑ๋ฅ ๋ณ๋ชฉ์ด ๋ฐ์ํ ์ ์์ด์. ๊ทธ๋์ ๋์์ฑ์ด ๋์ ํ๊ฒฝ์์๋ ์ด๋ฅผ ์ ์ ํ๊ฒ ํ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
MySQL์์๋ ์ฑ๋ฅ์ ์ต๋ํ์ผ๋ก ๋์ด๋ด๊ธฐ ์ํด MDL์ ๊ณ์ธต์ ์ผ๋ก ๋ถ๋ฅํด์ ํ์ฉํด์.
Metadata Lock์ ์ ํ๊ณผ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- MDL_SHARED(=Shared Lock)
- Shared Lock์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ๋ฌ ํธ๋์ญ์ ์ด ๋์์ ํ๋ํ ์ ์๊ณ ๋์์ฑ ํ๋ณด๊ฐ ๊ฐ๋ฅํด์.
- ์ฃผ๋ก SELECT, INSERT ์ ๊ฐ์ด ํ ์ด๋ธ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ MDL์ ๊ฒฝ์ฐ Shared Lock์ ํ๋ํ๊ฒ ๋ผ์.
- ์ธ๋ถ์ ์ผ๋ก๋ ๊ฐ๊ฐ ์ก์ ์ ๋ฐ๋ผ MDL_SHARED_READ, MDL_SHARED_WRITE ๋ฑ ์ผ๋ก ๋๋์ด์ ธ ์์ด์.
- MDL_EXCLUSIVE(=Exclusive Lock)
- Exclusive Lock์ ํ๋์ ํธ๋์ญ์ ์๋ง ํ๋ ๊ฐ๋ฅํ Lock์ด์์. ์ฌ๋ฌ ํธ๋์ญ์ ์์ ํด๋น Lock์ ํ๋ํ๋ ค๊ณ ํ๋ค๋ฉด, ๋จ ํ๋์ ํธ๋์ญ์ ๋ง Lock ํ๋์ ์ฑ๊ณตํ๊ณ ๋๋จธ์ง๋ Lock์ด ๋ฐํ๋ ๋๊น์ง ๋๊ธฐ ์ํ์ ๋น ์ ธ์.
- ๋ํ, Exclusive Lock์ ํ
์ด๋ธ์ ๋ํด ์ด๋ ํ Lock๋ ๊ฑธ๋ ค์์ง ์์์ผ ํ๋ ๊ฐ๋ฅํด์. ๊ทธ๋์ ๋ง์ฝ Shared Lock์ ์ค๋ ์ก๊ณ ์๋ ํธ๋์ญ์
์ด ์๋ค๋ฉด, ํด๋น ํธ๋์ญ์
์ด ์ข
๋ฃ๋ ๋๊น์ง Exclusive Lock์ ํ๋ํ์ง ๋ชปํ๊ณ ๋๊ธฐํ๊ฒ ๋ผ์.
- MySQL MDL(metadata_locks): insert ์ฟผ๋ฆฌ๊ฐ ๋ณ๋ชฉ ์ํ์ ๋น ์ง๋ ์ด์ ์์ ๋ฌธ์ ๊ฐ ๋์๋ ๋ถ๋ถ์ด ์ด ๋ถ๋ถ์ ๋๋ค.
- ALTER TABLE๊ณผ ๊ฐ์ ํ ์ด๋ธ ๊ตฌ์กฐ ๋ณ๊ฒฝํ๋ DDL ์์ ์ ํ๋ํ๊ฒ ๋ผ์.
- MDL_INTENTION(=Intention Lock)
- Intention Lock์ ์ ๊ธ์ ๊ฑธ๊ธฐ ์ ์ ๋จผ์ ์๋(intent)๋ฅผ ํ์ํ์ฌ ๋ค๋ฅธ ํธ๋์ญ์ ๊ณผ์ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด InnoDB์์ ์ฌ์ฉํ๋ ์ ๊ธ ๋ฉ์ปค๋์ฆ์ด์์.
- ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ๋ฐ ๋ค์ค ํธ๋์ญ์ ๋์ ์คํ์ ์ต์ ํํ๋ ํจ๊ณผ๋ ์์ด์.
- InnoDB ์์ง์ด ์๋์ผ๋ก ๊ด๋ฆฌํ๋ฏ๋ก ์ฌ์ฉ์๊ฐ ์ง์ ์ ์ดํ ์ผ์ ๊ฑฐ์ ์์ด์.
MDL์ ์ ํ๊ณผ ๋ณ๋ชฉ์ด ๋ ๋งํ ๋ถ๋ถ์ ์ดํด๋ดค์ผ๋ ์ด์ Observability ๊ด๋ จ ๋ด์ฉ์ ์์๋ณผ๊ฒ์.
Observability ํ๋ณดํ๊ธฐ
ํ์ฌ ์๊ตฌ์ฌํญ์ผ๋ก๋ metadata lock์ ํ๋ํ๋ PENDING ์ํ๊ฐ ๋น์ ์์ ์ผ๋ก ๊ธธ๊ฒ ์ ์ง๋๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์งํด์ผ ํฉ๋๋ค.
์ด ๋ชฉํ๋ฅผ ๊ฐ์ง๊ณ Observability ํ๋ณด๋ฅผ ์ํ ๋ฐฉ๋ฒ์ ์์๋ณผ๊ฒ์.
๊ธฐ๋ณธ์ ์ผ๋ก MySQL InnoDB ์์ง์์ metadata lock ์ ๋ณด๋ performance_schema.metadata_locks ํ ์ด๋ธ์ ํตํด ํ์ธํ ์ ์์ต๋๋ค.
metadata_locks ํ
์ด๋ธ์ ๋ํ ์ปฌ๋ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ์ง๋ง ์๋ ํ
์ด๋ธ ์ปฌ๋ผ์ ๋ณด๋ฉด ์ ์ ์๋ฏ์ด ์ ์ผ ์ค์ํ PENDING ์๊ฐ์ ์๊ธฐ ์ํด์๋ ์คํ ์์ ์๊ฐ์ด ํ์ํ๋ฐ, ํด๋น ํ
์ด๋ธ๋ง์ผ๋ก๋ ์ ์ ์์ต๋๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๋ performance_schema.threads ํ
์ด๋ธ์ ์ถ๊ฐ๋ก joinํด์ ํ์ฉํด์ผํด์.
(performance_schema.threads ํ
์ด๋ธ ์ปฌ๋ผ์ ์์ธํ๊ฒ ๋ค๋ฃจ์ง ์์ต๋๋ค)
์ปฌ๋ผ๋ช | ์ค๋ช |
OBJECT_TYPE | ๋ฝ์ด ๊ฑธ๋ฆฐ OBJECT ์ ํ (TABLE, SCHEMA, FUNCTION ๋ฑ) |
OBJECT_SCHEMA |
ํด๋น OBJECT๊ฐ ํฌํจ๋ ์คํค๋ง(=ํ ์ด๋ธ) ์ด๋ฆ |
OBJECT_NAME | ๋์ OBJECT ์ด๋ฆ |
LOCK_TYPE | ํ๋ํ ๋ฝ ์ ํ (SHARED, SHARED_READ, SHARED_WRITE, , EXCLUSIVE ๋ฑ) |
LOCK_STATUS | ๋ฝ์ ์ํ (PENDING, GRANTED, TIMEOUT, KILLED ๋ฑ) |
OWNER_THREAD_ID | metadata lock์ ์์ฒญํ thread ID |
OWNER_EVENT_ID | metadata lock์ ์์ฒญํ ์ด๋ฒคํธ ID |
๊ฒฐ๋ก ์ ์ผ๋ก ์๋ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด PENDING ์ํ์ธ ์ฐ๋ ๋๋ฅผ ํ์ธํ ์ ์๊ณ
PROCESSLIST_TIME ์ปฌ๋ผ์ ํตํด์ ๊ณผ๋ํ๊ฒ PENDING ์ํ๊ฐ ์ง์ฐ๋๋ ํ๋ก์ธ์ค๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
์กฐ๊ธ ๊ณ ๋ฏผ๋๋ ์ ์ PROCESSLIST_TIME์ ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ํ๋ก์ธ์ค์ ๊ฒฝ์ฐ "PENDING์ด๋ผ๋ ์ํ๊ฐ ์ ๊น ์ง์๋๋ ๋์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐญ์ณํด์ ๋ฉํธ๋ฆญ์ผ๋ก ๋จ๊ฒผ๋ค๋ฉด, ์ด PENDING ์ํ๊ฐ ์ค๋ ๊ฑธ๋ฆฐ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์๋ค"๋ ์ธ๋ฐ์,
์ด ๊ฒฝ์ฐ๋ ๋ชจ๋ํฐ๋ง ํด(e.g. datadog) ์ ํตํด์ ๋ฉํธ๋ฆญ์ ์ ์ ํ๊ฒ ๊ทธ๋ฃนํํ๋ฉด ์ํ๋ ์ต์ ๋ฒ๋น๋ฆฌํฐ๋ฅผ ์ถฉ์กฑํ ์ ์์ ๊ฒ ๊ฐ์์.
SELECT
ml.OBJECT_TYPE,
ml.OBJECT_SCHEMA,
ml.OBJECT_NAME,
ml.LOCK_TYPE,
ml.LOCK_STATUS,
t.THREAD_ID,
t.PROCESSLIST_ID,
t.PROCESSLIST_USER,
t.PROCESSLIST_HOST,
t.PROCESSLIST_DB,
t.PROCESSLIST_TIME,
t.PROCESSLIST_STATE,
t.PROCESSLIST_INFO
FROM performance_schema.metadata_locks ml
LEFT JOIN performance_schema.threads t ON ml.OWNER_THREAD_ID = t.THREAD_ID
WHERE ml.LOCK_STATUS = 'PENDING'
๋ค์ ๊ธ์ ์ค์ ๋ก ์ด ์ฟผ๋ฆฌ๋ก ์ต์ ๋ฒ๋น๋ฆฌํฐ๋ฅผ ํ๋ณดํด๋ณด๊ณ ๊ฒฝํ์ด ์ด๋ ๋์ง ๊ณต์ ํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค์ ใ
ใ
๊ธด ๊ธ ์ฝ์ด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค :)
References
'BackEnd' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
MySQL MDL(metadata_locks): insert ์ฟผ๋ฆฌ๊ฐ ๋ณ๋ชฉ ์ํ์ ๋น ์ง๋ ์ด์ (1) | 2025.02.16 |
---|---|
Zero Copy๋ฅผ ์์๋์? with kotlin S3 upload (1) | 2024.11.24 |
์ฐ๋ฆฌ ์๋ฒ์ OOMKilled ์ฅ์ ๊ฐ ๋ฐ์ํ์ด์ - ํ๊ณ ํธ (0) | 2024.11.10 |
MySQL ์คํ ๊ณํ ํบ์๋ณด๊ธฐ (2) | 2024.04.28 |
ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค(isolation level)์ด๋? (1) | 2024.03.03 |
- Total
- Today
- Yesterday
- 2024ํ๊ณ
- 2023 ๊ฐ๋ฐ์ ํ๊ณ
- ๋ฐฑ์ค
- ํด์
- mysql ์คํ ๊ณํ
- ์๊ณ ๋ฆฌ์ฆ
- ๊น์ด/๋๋น ์ฐ์ ํ์(DFS/BFS)
- ํ๋ก๊ทธ๋๋จธ์ค
- AWS re:Invent 2023
- mysql metadata lock
- mysql
- ํ(Heap)
- HTTP
- mysql mdl
- Golang
- Go
- 2023 ํ๊ณ
- ์ข์ ๊ฐ๋ฐ์
- grpc client
- ์คํ/ํ
- Aws Reinvent 2023
- ์ถ์ ์ง๋
- ์ข์ ์์ง๋์ด
- ์ฝ๋ฉํ ์คํธ
- ์ฅ์ ํ๊ณ
- mysql metadata_locks
- golang oomkilled
- ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค
- kotlin s3 upload
- ์ข์ ๊ฐ๋ฐ์ ๋๊ธฐ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |