DevLog ๐ถ
[Real MySQL 8.0] InnoDB ์คํ ๋ฆฌ์ง ์์ง ์์๋ณด๊ธฐ - 1ํธ (ํด๋ฌ์คํฐ๋ง / ์ธ๋ํค / MVCC) ๋ณธ๋ฌธ
[Real MySQL 8.0] InnoDB ์คํ ๋ฆฌ์ง ์์ง ์์๋ณด๊ธฐ - 1ํธ (ํด๋ฌ์คํฐ๋ง / ์ธ๋ํค / MVCC)
dolmeng2 2023. 6. 11. 16:32๐ฑ InnoDB ์คํ ๋ฆฌ์ง ์์ง ์ํคํ ์ฒ
MySQL์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ์คํ ๋ฆฌ์ง ์์ง์ธ 'InnoDB'์ ๋ํ ์ํคํ ์ฒ๋ฅผ ์์๋ณด์.
๊ทธ๋ฆผ์ด ๋ณต์กํ๊ธฐ๋ ํ์ง๋ง, ์ผ์ชฝ์ ์ด์ ์ ๋ดค๋ MySQL ์์ง์ด๊ณ , ์ค๋ฅธ์ชฝ์ด InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ๊ตฌ์ฑ๋์ด๋ค.
์ด๋ฒ ํฌ์คํ
์์๋ innoDB ์คํ ๋ฆฌ์ง ์์ง์ ํน์ง์ ๋ํด์ ์์๋ณด๋๋ก ํ์.
1. PK์ ์ํ ํด๋ฌ์คํฐ๋ง
๊ธฐ๋ณธ์ ์ผ๋ก InnoDB์ ๋ชจ๋ ํ
์ด๋ธ์ PK๋ฅผ ๊ธฐ์ค์ผ๋ก ํด๋ฌ์คํฐ๋ง๋์ด ์ ์ฅ๋๋ค.
์ฌ๊ธฐ์ ํด๋ฌ์คํฐ๋ง๋๋ค๋ ๊ฒ์, PK ๊ฐ์ด ๋น์ทํ ๋ ์ฝ๋๋ผ๋ฆฌ ๋ฌถ์ด์ ์ ์ฅํ๋ ๊ฒ์ ์๋ฏธํ๋ค. PK ๊ฐ์ด ๋ ์ฝ๋์ ์ ์ฅ ์์น๋ฅผ ๊ฒฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ ์คํ๊ฒ ๊ฒฐ์ ํด์ผ ํ๋ค.
์ผ๋ฐ์ ์ธ DBMS์์ ์ธ์ปจ๋๋ฆฌ ์ธ๋ฑ์ค์ ๋ฆฌํ ๋
ธ๋์๋ ๋ฐ์ดํฐ์ ์ค์ง์ ์ธ ๋ฌผ๋ฆฌ ์ฃผ์๊ฐ ๋ค์ด๊ฐ์, ํด๋น ์ธ๋ฑ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ก ๊ฐ์ง๊ณ ์ค์ง๋ง innoDB์์๋ PK ๊ฐ์ ๋ํ ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๊ทธ๋์ ์ฌ์ฉ ์ PK ๊ฐ์ ์ฐพ์๋๊ฐ๊ฒ ๋๋ค. (์ธ์ปจ๋๋ฆฌ ์ธ๋ฑ์ค -> PK ๊ฐ -> ๋ฐ์ดํฐ)
๐ก ์ธ์ปจ๋๋ฆฌ ์ธ๋ฑ์ค๋? (Secondary-Index)
PK ์ธ์ ์ ๋ ฌ ๊ธฐ์ค์ด ํ์ํ ๋ ์ฌ์ฉ๋๋ฉฐ, ํ๋์ ํ ์ด๋ธ์ ์ฌ๋ฌ ๊ฐ๋ฅผ ๊ฐ์ง ์ ์๋ค.
์์๋ฅผ ๊ฐ์ง์ง ์๊ธฐ ๋๋ฌธ์ ์ ๋ ฌ๋์ง ์์๋ ๋๋ฉฐ, unique ํ์ง ์์๋ ๋๋ค๋ ์ ์ด ํน์ง์ด๋ค. (๋ฌผ๋ก , ์ธ์ปจ๋๋ฆฌ ์ธ๋ฑ์ค๋ผ๊ณ ํ์ ๋ ๋ฐฐํ์ ์ธ ์์๋ก ์ ๋ํฌ ํค๋ฅผ ๋ง์ด ๋ฝ๊ธฐ๋ ํ๋ค.)
์ผ์ข ์ ๋ณด์กฐ ์ญํ ์ ํ๋ ์ธ๋ฑ์ค๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
๋ชจ๋ ์ธ์ปจ๋๋ฆฌ ์ธ๋ฑ์ค๊ฐ PK ๊ฐ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
โญ๏ธ ๋ง์ฝ innoDB ํ
์ด๋ธ์ ์์ฑํ ๋ PK๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ๋ด๋ถ์ ์ผ๋ก ๋์ฒดํ ์ปฌ๋ผ์ ์ฐพ๊ฒ ๋๋๋ฐ, NOT NULL์ด๋ฉด์ uniqueํ ์ธ๋ฑ์ค ์ค์์ ์ฒซ ๋ฒ์งธ ๊ฒ์ ํด๋ฌ์คํฐ ํค๋ก ์ผ๊ฒ ๋๋ค. (๋จ, ๋ด๋ถ์ ์ผ๋ก ๊ด๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ์กฐํ ๋ถ๊ฐ)
๋ฐ๋ฉด์, MyISAM ์คํ ๋ฆฌ์ง ์์ง์์๋ ํด๋ฌ์คํฐ๋ง ํค๋ฅผ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ PK์ ์ธ์ปจ๋๋ฆฌ ์ธ๋ฑ์ค๊ฐ ๊ตฌ์กฐ์ ์ผ๋ก ์๋ฌด๋ฐ ์ฐจ์ด๊ฐ ์๋ค. ๋จ์ง, PK๋ uniqueํ๋ค๋ ์กฐ๊ฑด์ด ์ถ๊ฐ๋ ์ธ์ปจ๋๋ฆฌ ์ธ๋ฑ์ค์ ๋์ผํด์ง๋ค. ๋ํ, MyISAM ํ
์ด๋ธ์ ๋ชจ๋ ์ธ๋ฑ์ค๋ ๋ฌผ๋ฆฌ์ ์ธ ๋ ์ฝ๋ ์ฃผ์๊ฐ (ROW-ID)์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์, PK ๊ฐ์ด ๋ณํ๋ค๊ณ ํด์ ์ค์ ๋ฐ์ดํฐ ๋ ์ฝ๋์ ์์น๊ฐ ๋ณํ์ง ์๋๋ค.
2. ์ธ๋ํค ์ง์
MyISAM๊ณผ ๋ค๋ฅด๊ฒ InnoDB์ ๊ฒฝ์ฐ FK๋ฅผ ์ง์ํ๋ค. ์ฌ์ค ์ค๋ฌด์์๋ ์ธ๋ํค๋ฅผ ์ ๊ฑธ์ง ์๋๋ค๋ ๋ง์ ๋ง์ด ๋ค์ด์ ์ด๊ฒ ํฐ ์ด์ ์ด ๋ ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ๋ก์ปฌ ํ๊ฒฝ์์ ๊ฐ๋ฐํ ๋๋ ์ข๊ฒ ์ฐ์ผ ๊ฒ์ผ๋ก ์๊ฐ๋๋ค.
๋ง์ฝ ์์๋ก ์ธ๋ํค ์ฒดํฌ๋ฅผ ๋๊ณ ์ถ๋ค๋ฉด ๋ค์ ์ต์
์ ์ฌ์ฉํ๋ฉด ๋๋ค.
# ๊ธ๋ก๋ฒ ์ค์
SET foreign_key_checks=OFF;
# ํ์ฌ ์์
์ ์งํํ๋ ์ธ์
์ ๋ํด์๋ง ๋๊ธฐ
SET SESSION foreign_key_checks=OFF;
ํด๋น ์ต์
์ ๋๊ฒ ๋๋ฉด ON DELETE CASCADE, ON UPDATE CASCADE ๊ฐ์ ์ต์
์ ์ฌ์ฉํ ์ ์์์ ์ ์ํ์.
์ฐธ๊ณ ๋ก ์ธ๋ํค ์ต์
์ ๋ ๋ค๋ก ํ
์ด๋ธ์ ๋ํ ์กฐ์ ์์
์ ํ๋ค๋ฉด, ๋ ์ฝ๋ ์ฌ์ด์ ์ผ๊ด์ฑ์ด ๊นจ์ง์ง ์์๋์ง ์ ํ์ธํ๊ณ ๋ค์ ์ต์
์ ์ผ์ผ ํ๋ค.
3. MVCC (Multi Version Concurrency Control)
MVCC๋ ๋์ ์ ๊ทผ์ ํ์ฉํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋์์ฑ์ ์ ์ดํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์ด๋ค. ์ฌ๊ธฐ์ ๋งํ๋ 'Multi Version'์ ๊ฒฝ์ฐ ํ๋์ ๋ ์ฝ๋์ ๋ํด์ ์ฌ๋ฌ ๊ฐ์ ๋ฒ์ ์ ๋์์ ๊ด๋ฆฌํ๋ค๋ ์๋ฏธ์ด๋ค. (๋ ์ฝ๋ ์ ๊ทผ ์์ ์ ๋ํ ์ค๋
์ท์ ๊ด๋ฆฌํ๋ค.)
์ผ๋ฐ์ ์ผ๋ก ๋ ์ฝ๋ ๋ ๋ฒจ์ ํธ๋์ญ์
์ ์ง์ํ๋ DBMS๊ฐ ์ง์ํ๋ ๊ธฐ๋ฅ์ด๋ฉฐ, ๋ฝ์ ์ฌ์ฉํ์ง ์์ผ๋ฉด์ ์ผ๊ด๋ ๊ฐ์ ์ฝ๋๋ก ๋ง๋๋ ๊ฒ์ด ๋ชฉ์ ์ด๋ค. InnoDB์ ๊ฒฝ์ฐ Undo log๋ฅผ ํ์ฉํ์ฌ ์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.
๊ฒฉ๋ฆฌ ์์ค์ด READ_COMMITTED์ผ ๋ ์ด๋ค ์์ผ๋ก ์ฒ๋ฆฌํ๋์ง ๊ทธ๋ฆผ์ผ๋ก ์์๋ณด์.
โญ๏ธ ์ฐธ๊ณ ๋ก, InnoDB์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก REPEATABLE_READ์ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ๋ ๋ฒจ๋ก ์ฌ์ฉํ๋ค.
๐ก READ_COMMITTED
ํน์ ํธ๋์ญ์ ์ด ์งํ๋๋ ๋์ ๋ค๋ฅธ ํธ๋์ญ์ ์ ํด๋น ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ ๊ฒฉ๋ฆฌ ๋ ๋ฒจ.
read ์ฐ์ฐ ์ ์ค์ ํ ์ด๋ธ ๊ฐ์ ๊ฐ์ ธ์ค์ง ์๊ณ , Undo ์์ญ์ ๋ฐฑ์ ๋ ๋ ์ฝ๋์์ ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
= ์ฆ, ํธ๋์ญ์ ์ด ์์๋๊ธฐ ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๊ธฐ ๋๋ฌธ์ ์์ ํ ์ปค๋ฐ๋ ๋ฐ์ดํฐ๋ง ์ฝ๊ฒ ๋๋ค.
๋จ, ์ปค๋ฐ๋ ๋ฐ์ดํฐ๋ง ์ฝ๊ธฐ ๋๋ฌธ์ ๋์ผํ select ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๋๋ผ๋ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ๋ฐ์ง ๋ชปํ ์๋ ์๋ค.
CREATE TABLE `member` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(10) NOT NULL,
`password` varchar(64) NOT NULL,
PRIMARY KEY (`id`),
INDEX KEY `name` (`name`)
) ENGINE=InnoDB;
์์ ๊ฐ์ด ๊ฐ๋จํ๊ฒ member์ ๋ํด ๊ด๋ฆฌํ๋ ํ
์ด๋ธ์ด ์๋ค.
์ ํ
์ด๋ธ์ ๋ค์๊ณผ ๊ฐ์ด ํ ๋ช
์ ๋ฉค๋ฒ๋ฅผ ๋ฃ์ด๋ณด์.
insert into member(name, password) values ('journey', 'testpassword');
ํด๋น ๋ ์ฝ๋๋ ์๋์ ๊ฐ์ด ๊ด๋ฆฌ๋๋ค.
PK์ name, password๊ฐ InnoDB ๋ฒํผ ํ๊ณผ ๋์คํฌ์ ๊ฐ๊ฐ ์ ์ฅ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋ง์ฝ, ํด๋น ๋ ์ฝ๋์ ์
๋ฐ์ดํธ๊ฐ ์ผ์ด๋ฌ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
update member set password='realpassword' where id = 1;
update๊ฐ ์คํ๋๋ฉด ๋ณ๊ฒฝ ์ด์ ์ ๊ฐ์ undo ๋ก๊ทธ์ ์ ์ฅํ๊ณ , ๋ฒํผ ํ์๋ ์
๋ฐ์ดํธ๋ ์๋ก์ด ๊ฐ์ผ๋ก ์์ ๋๋ค.
๋์คํฌ์ ๊ฒฝ์ฐ InnoDB์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋ ์ค ์ฐ๊ธฐ ์ค๋ ๋ (Write)์ ์ํด์ ์๋ก์ด ๊ฐ์ผ๋ก ์
๋ฐ์ดํธ๋๋ฉฐ, ์ด๋ ACID๋ฅผ ๋ณด์ฅํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก๋ ๋ฒํผ ํ๊ณผ ๋ฐ์ดํฐ ํ์ผ์ด ๋์ผํ๊ฒ ๋๋ค. (์์ ์ ๋ฐ๋ผ์ ์
๋ฐ์ดํธ๋๊ธฐ ์ ์ผ์๋ ์์ง๋ง)
๊ทธ๋ฆฌ๊ณ , ์ด ์ํ์์ select ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๊ฒ ๋๋ฉด ๊ฒฉ๋ฆฌ ๋ ๋ฒจ์ ๋ฐ๋ผ์ ์ด๋์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ง ๋ฌ๋ผ์ง๋ค. ๋ง์ฝ read_uncommitted๋ผ๋ฉด ๋ฒํผ ํ์ ์๋ ๋ฐ์ดํฐ๋ฅผ, read commmitted ์ด์์ ๋ ๋ฒจ์ด๋ผ๋ฉด undo ๋ก๊ทธ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๋๋ค.
์ด๋ ๊ฒ ํ๋์ ๋ ์ฝ๋์ ๋ํด์ ์ฌ๋ฌ ๊ฐ์ ๋ฒ์ (๋ฒํผ ํ, ์ธ๋ ๋ก๊ทธ)๋ฅผ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ 'MVCC'๋ผ๊ณ ํํํ๋ฉฐ, ํ์์ ๋ฐ๋ผ์ ์ด๋ค ๋ฐ์ดํฐ๊ฐ ๋ณด์ฌ์ง์ง ๋ฌ๋ผ์ง๊ฒ ๋จ์ ์๋ฏธํ๋ค.
์ดํ ์ปค๋ฐ์ด ์ผ์ด๋๋ฉด, ํด๋น ํธ๋์ญ์
์ undo ๋ก๊ทธ๊ฐ ๋ ์ด์ ํ์ํ์ง ์์ ๋ undo ๋ก๊ทธ๋ฅผ ์ ๊ฑฐํ๊ฒ ๋๋ค.
๋ณดํต undo ์์ญ์ ์ผ์ ํฌ๊ธฐ๋ก ์ ์ง๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ์ค๋๋ undo ์ธ๊ทธ๋จผํธ๋ ์ ๊ฑฐ๋๊ฑฐ๋, ํน์ ์ ์ฑ
์ ์ํด์ ๊ด๋ฆฌ๋๋ค.
๋ง์ฝ, ์ ์ํฉ์์ ๋กค๋ฐฑ์ด ์ผ์ด๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
์์ ๊ฐ์ด undo ์์ญ์ ์๋ ๊ฐ์ ๋ณต๊ตฌํ๊ณ , undo ์์ญ์ ์๋ ๊ฐ์ ์ ๊ฑฐํ๊ฒ ๋๋ค.
4. ์ ๊ธ ์๋ ์ผ๊ด๋ ์ฝ๊ธฐ (Non-Locking Consistent Read)
์์ ๋งํ MVCC ๋๋ถ์ InnoDB์ ๊ฒฝ์ฐ ๋ฝ ์์ด๋ ์ผ๊ด๋ ์ฝ๊ธฐ๋ฅผ ์ ๊ณตํ ์ ์๋ค.
์ฌ๊ธฐ์ ๋งํ๋ '์ผ๊ด๋ ์ฝ๊ธฐ'๋, ๊ฒฉ๋ฆฌ ๋ ๋ฒจ์ด READ_UNCOMMITTED / READ_COMMITTED / REPEATABLE_READ์ผ ๋ ์์ํ ์ฝ๊ธฐ ์์
์ ๋ค๋ฅธ ํธ๋์ญ์
์ ๋ณ๊ฒฝ ์์
๊ณผ ๊ด๋ จ ์์ด undo ์์ญ์ ๊ฐ์ ์ฝ์ผ๋ฉด์ ๋ฐ๋ก ์คํ๋จ์ ์๋ฏธํ๋ค.
ํ์ง๋ง, ์ด๋ฅผ ์ํด undo ์์ญ์ ๊ฐ์ ๋ฐ๋ก ์ญ์ ํ์ง ๋ชปํ๊ณ ๊ณ์ ์ ์งํด์ผ ํ๊ธฐ ๋๋ฌธ์ ํธ๋์ญ์
์ ๋ฒ์๊ฐ ์ปค์ง์๋ก MySQL์ ์๋ฒ๊ฐ ๋๋ ค์ง๊ฑฐ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ด์ ์ฃผ์ํด์ผ ํ๋ค. (ํธ๋์ญ์
์ ๊ฐ๋ฅํ ์งง๊ฒ ๊ฐ์ ธ๊ฐ๋ ๊ฒ ์ข๋ค.)
๐ก READ UNCOMMITTED
์ปค๋ฐ, ๋กค๋ฐฑ ์ฌ๋ถ์ ์๊ด์์ด ๋ค๋ฅธ ํธ๋์ญ์ ์ ๊ฐ์ ์ฝ์ ์ ์๋ ๊ฒฉ๋ฆฌ ๋ ๋ฒจ.
์ด๋ฏธ ๋กค๋ฐฑ์ด ๋์๋๋ฐ๋ ํด๋น ๊ฐ์ ์ฝ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ฃผ์ํด์ผ ํ๋ค. (Dirty read)
๐ก REPEATABLE_READ
ํธ๋์ญ์ ๋ง๋ค ID๋ฅผ ๋ถ์ฌํ์ฌ, ์คํ ์ค์ธ ํธ๋์ญ์ ID๋ณด๋ค ์์ ID๋ฅผ ๊ฐ์ง ํธ๋์ญ์ ์ ๋ณ๊ฒฝ ์ฌํญ๋ง ์ฝ๋ ๊ฒฉ๋ฆฌ ๋ ๋ฒจ.
Undo ์์ญ์ ๋ฐฑ์ ๋ ๋ชจ๋ ๋ ์ฝ๋๋ ๋ณ๊ฒฝ์ ๋ฐ์์ํจ ํธ๋์ญ์ ์ ๋ฒํธ๋ฅผ ์ถ๊ฐ๋ก ๊ด๋ฆฌํ๊ณ , ํน์ ํธ๋์ญ์ ๋ณด๋ค ์ ๋ฒํธ์ ๋ ์ฝ๋์์๋ง ๋ณ๊ฒฝ๋ ๋ด์ฉ์ ์ฝ๋๋ก ๋ง๋ ๋ค.
๊ทธ๋์ ์คํ ์ค์ธ ํธ๋์ญ์ ์ค์์ ๊ฐ์ฅ ์ค๋๋ ํธ๋์ญ์ ๋ฒํธ๋ณด๋ค ์์ ์๋ Undo ์์ญ์ ๋ฐ์ดํฐ๋ ์ญ์ ํ ์ ์๋ค.
ํ์ง๋ง, ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ํด์ ๊ฐ์ด ์ฝ์ ๋๊ฑฐ๋ ๋ณ๊ฒฝ๋์์ ๋ ํด๋น ์ฟผ๋ฆฌ ์ ํ๋ก selectํ ์กฐํ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง ์ ์๋ค. (Phantom read) -> InnoDB์์๋ Next Key Lock์ ํ์ฉํ์ฌ ๋ฐ์ํ์ง ์๋๋ก ๋ง๋ค์๋ค.
๐ก SERIALIZABLE
์์ ์ด ์์๋ ํธ๋์ญ์ ์ด ๊ฐ์ง๊ณ ์๋ ๋ ์ฝ๋๋ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ ๊ทผํ ์ ์๋ ๊ฒฉ๋ฆฌ ๋ ๋ฒจ.
์ฝ๊ธฐ ์์ ์๋ ๋ฝ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ์ ์ ํฉ์ฑ์ ๋ณด์ฅํ์ง๋ง, ์ฒ๋ฆฌ ์ฑ๋ฅ์ด ๊ต์ฅํ ๋จ์ด์ง๋ค.
- ๋ฝ์ ๋ํด์๋ ๋ค์์ ์์ธํ ๋ค๋ฃฐ ์์ ์ด๋ ์ด๋ฒ์๋ ๋์ด๊ฐ์ ๐
5. ์๋ ๋ฐ๋๋ฝ ๊ฐ์ง
InnoDB์์๋ ๊ต์ฐฉ ์ํ ๊ฐ์ง๋ฅผ ์ํด์ ๋ฝ์ ๋ํ ๋๊ธฐ ๋ชฉ๋ก์ ๊ทธ๋ํ (Wait-for List) ํํ๋ก ๊ด๋ฆฌํ๋ค.
- ์ฌ๊ธฐ์ ๊ต์ฐฉ ์ํ(๋ฐ๋๋ฝ)๋, ์๋ก ๋ค๋ฅธ ํธ๋์ญ์
์ด ์๋ก ํ์ํ ๋ฝ์ ๊ฐ์ง๊ณ ์์ด์ ์๋ก ๋ฌดํํ๊ฒ ๋๊ธฐํ๊ณ ์๋ ์ํ.
๊ต์ฐฉ ์ํ์ ๊ฒฝ์ฐ ํธ๋์ญ์
์ด ์ฌ๋ฌ ํ
์ด๋ธ์ ํ์ ๋ํด ๋ฝ์ ๊ฑฐ๋ ๊ฒฝ์ฐ (update๋ select for update ๊ตฌ๋ฌธ ๋ฑ์ ํตํด์) ๋ฐ์ํ ์ ์๋๋ฐ, ์ด๋ ํ
์ด๋ธ ์์ค์ ๋ฝ์ ์ํด์ ํ
์ด๋ธ์ ๋ํ ์ ๊ธ ๋ชฉ๋ก์ ๊ด๋ฆฌํ๋ค. ์ด๋, ๋ ๋ฒ์งธ ํธ๋์ญ์
์ด ํด๋น ๋ ์ฝ๋๋ฅผ ์
๋ฐ์ดํธํ๊ฑฐ๋, ์ด๋ฏธ ๋ฝ์ด ๊ฑธ๋ฆฐ ํ
์ด๋ธ์ ๋ํด ๋ค์ ๋ฝ์ ํ๋ํ๋ ค๊ณ ํ๋ฉด, InnoDB๋ ํด๋น ๋ ์ฝ๋์ ๋ํ ๋ฝ ์์ฒญ์ ๋๊ธฐ ๋ชฉ๋ก์ ์ถ๊ฐํ๋ค. ์ต์ข
์ ์ผ๋ก ๋ฝ์ ์ป๊ธฐ ์ํด์๋ ๋ ์ฝ๋์ ๊ฑธ๋ ค์๋ ๋ชจ๋ ๋ฝ์ด ์ ๊ฑฐ๋์ด์ผ๋ง ์ป์ ์ ์๊ฒ ๋๋ค.
์๋์ ๊ฐ์ด information_schema / performance_schema DB๋ฅผ ํ์ธํ๊ฒ ๋๋ฉด ํธ๋์ญ์
์ ๋ํ ์ํ๋ฅผ ํ์ธํ ์ ์๋ค.
# ํธ๋์ญ์
์ํ ํ์ธ
select * from information_schema.INNODB_TRX;
# ํ์ฌ ์คํ ์ค์ธ ํธ๋์ญ์
์์ ์ ๊ธ์ ํ๋ํ ๋ฐ์ดํฐ๋ ์ ํ, ํธ๋์ญ์
์ ๋ณด ํ์ธ (MySQL 8.0๋ถํฐ)
# ์ด๋ค ํธ๋์ญ์
์ ์ด๋ค ๋ฐ์ดํฐ๊ฐ ๋ฝ์ด ๊ฑธ๋ฆฐ ์ํ์ธ์ง ํ์ธ ๊ฐ๋ฅ
select * from performance_schema.data_locks;
# ๋ฝ ๋๊ธฐ ์์ฒญ ๋ชฉ๋ก ํ์ธ (MySQL 8.0๋ถํฐ)
# ์ด๋ค ํธ๋์ญ์
์ด ๋ค๋ฅธ ํธ๋์ญ์
์ ๋ฝ์ ๋๊ธฐ ์ค์ธ์ง ํ์ธ ๊ฐ๋ฅ
select * from performance_schema.data_lock_waits;
๋ฐ๋๋ฝ์ ์ค์ด๊ธฐ ์ํด์๋ ํ
์ด๋ธ ์์ฒด์ ๋ฝ์ ๊ฑฐ๋ ๊ฒ๋ณด๋ค๋ ํธ๋์ญ์
์์ฒด๋ฅผ ์๊ฒ ์ ์งํ๋ ๊ฒ์ด ์ข๋ค. ์ฌ๋ฌ ํธ๋์ญ์
์ด๋ ์ฌ๋ฌ ํ
์ด๋ธ์ด ๋์์ ๋ ์ฝ๋๋ฅผ ์
๋ฐ์ดํธํ๋ค๋ฉด, ์ต๋ํ ํด๋น ํธ๋์ญ์
๋ค์ด ๋ณ๊ฒฝํ๋ ๋ ์ฝ๋์ ์์๋ค์ ์ผ๊ด๋๊ฒ (๋์ผํ ์์๋ก ์
๋ฐ์ดํธ๋๋๋ก) ๋ง๋๋ ๊ฒ์ด ์ข๋ค.
๐ฌ ๋ฐ๋๋ฝ ๊ฐ์ง ์ค๋ ๋
InnoDB์ ๊ฒฝ์ฐ ๋ด๋ถ์ ์ผ๋ก ๋ฐ๋๋ฝ ๊ฐ์ง ์ค๋ ๋๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ํด๋น ์ค๋ ๋๋ ๊ทธ๋ํ๋ฅผ ์ ๊ธฐ์ ์ผ๋ก ๊ฒ์ฌํ์ฌ ๊ต์ฐฉ ์ํ์ ๋น ์ง ํธ๋์ญ์
์ ์ฐพ์ ๊ฐ์ ๋ก ์ข
๋ฃํ๋ค. ์ด๋, Undo ๋ก๊ทธ์ ์์ด ๋ ์ ์ ํธ๋์ญ์
์ ๋กค๋ฐฑ ๋์์ผ๋ก ์ค์ ํ๊ฒ ๋๋ค.
์ฐธ๊ณ ๋ก, InnoDB ์คํ ๋ฆฌ์ง ์์ง์ด ์๋ MySQL ์์ง ์์์ ์ ๊ธ๋ ํ
์ด๋ธ (LOCK TABLES)์ ๋ณผ ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋๋ฝ์ ๋ํ ๊ฐ์ง๊ฐ ๋ถํ์คํ ์๋ ์์ง๋ง, innodb_table_locks ๋ณ์๋ฅผ ํ์ฑํํ๋ฉด ๋ ์ฝ๋ ๋ฝ๋ฟ๋ง ์๋๋ผ ํ
์ด๋ธ ๋ฝ๊น์ง ๊ฐ์ง๊ฐ ๊ฐ๋ฅํด์ง๋ค. (์ฌ๋งํ๋ฉด ํ์ฑํํ๋๋ก ํ์.)
ํ์ง๋ง, ๋ง์ฝ ๋์์ ์ฒ๋ฆฌํ๋ ์ค๋ ๋๊ฐ ๋งค์ฐ ๋ง๊ฑฐ๋ ํ๋์ ํธ๋์ญ์
์์ ๊ฐ์ง๊ณ ์๋ ๋ฝ์ด ๋งค์ฐ ๋ง์์ง๋ค๋ฉด ๋ฐ๋๋ฝ ๊ฐ์ง ์ค๋ ๋ ์ญ์ ๋๋ ค์ง๋ค. ์ด๋ ๋ฐ๋๋ฝ ๊ฐ์ง ์ค๋ ๋๊ฐ ์ ๊ธ ์ํ๊ฐ ๋ณ๊ฒฝ๋์ง ์๋๋ก ์ ๊ธ ๋ชฉ๋ก์ด ์ ์ฅ๋์ด ์๋ ํ
์ด๋ธ์ ์๋ก์ด ๋ฝ์ ๊ฑธ๊ณ ์ค๋ ๋๋ฅผ ์ฐพ๊ธฐ ๋๋ฌธ์, ๋ฐ๋๋ฝ ๊ฐ์ง ์ค๋ ๋๊ฐ ๋๋ ค์ง๋ฉด ์ค์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ ์ค๋ ๋ ์ญ์ ๋ฝ์ ๊ฑธ๋ ค์ ๊ณ์ ๋๊ธฐ ์ํ์ ๋น ์ง ์๋ ์๋ค.
์ด๋ฅผ ์ํด์ MySQL ์๋ฒ๋ innodb_deadlock_detect๋ผ๋ ๋ณ์๋ฅผ ์ ๊ณตํ๊ณ ์์ผ๋ฉฐ, ํด๋น ๋ณ์๋ฅผ OFF๋ก ํ๋ฉด ๋ฐ๋๋ฝ ๊ฐ์ง ์ค๋ ๋๊ฐ ๋ ์ด์ ๋์ํ์ง ์๊ฒ ๋๋ค. ํ์ง๋ง, InnoDB ์คํ ๋ฆฌ์ง ์์ง ๋ด๋ถ์์ ๋ฐ๋๋ฝ์ด ๋ฐ์ํ๋๋ผ๋ ์ค์ฌํ๋ ์ค๋ ๋๊ฐ ์์ผ๋ ๋ฌดํ์ ๋๊ธฐํ๊ธฐ ๋๋ฌธ์ innodb_lock_wait_timeout ๋ณ์๋ฅผ ํ์ฑํํ์ฌ ์ผ์ ์๊ฐ์ด ์ง๋๋ฉด ์๋์ผ๋ก ์์ฒญ์ด ์คํจํ๊ณ ์๋ฌ ๋ฉ์์ง๋ฅผ ๋ฐํํ๋๋ก ๋ง๋ค์ด์ผ ํ๋ค. ์ฆ, ๋ฐ๋๋ฝ ๊ฐ์ง ์ค๋ ๋ ์์ฒด๊ฐ ์ฑ๋ฅ์ ์ํฅ์ ๋ผ์น๋ค๋ฉด ํด๋น ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ง ์๋ ๋์ , ์ผ์ข
์ ttl์ ํตํด ๋๊ธฐํ๋๋ก ๋ง๋๋ ์ ๋ต์ธ ๊ฒ์ด๋ค. ๊ธฐ๋ณธ๊ฐ์ 50์ด์ธ๋ฐ, ํจ์ฌ ๋ ๋ฎ์ ์๊ฐ์ ์ฌ์ฉํ๋ ๊ฒ ์ข๋ค.
6. ์๋ํ๋ ์ฅ์ ๋ณต๊ตฌ
InnoDB์๋ ์์ค์ด๋ ์ฅ์ ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๊ธฐ ์ํ ๋งค์ปค๋์ฆ์ด ํ์ฌ๋์ด ์๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก MySQL ์๋ฒ๊ฐ ์์๋ ๋ ํญ์ ์๋ ๋ณต๊ตฌ๋ฅผ ์ํํ๊ธฐ ๋๋ฌธ์, ๋ณต๊ตฌ ๋ถ๊ฐ๋ฅํ ์์์ด ์๋ค๋ฉด ์๋ ๋ณต๊ตฌ๋ฅผ ๋ฉ์ถ๊ณ MySQL ์๋ฒ ์์ฒด๋ฅผ ์ข
๋ฃํด๋ฒ๋ฆฐ๋ค. (์ด๋๋ innodb_force_recovery ๋ณ์๋ฅผ ํตํด์ ์๋ฒ๋ฅผ ์ฌ์์ํด์ผ ํ๋ค.) ์ฌ์์ ํ mysqldump๋ฅผ ํตํด ๊ฐ๋ฅํ ๋ฐ์ดํฐ๋ฅผ ๋ฐฑ์
ํ๊ณ ์๋ฒ์ DB๋ฅผ ์ฌ์์ฑํ์.
์๋๋ innodb_force_recovery ๋ณ์๊ฐ์ ๋ฐ๋ฅธ ๋ณต๊ตฌ ๋ชจ๋ ์ ๋ต์ด๋ค.
- 1 (SRV_FORCE_IGNORE_CORRUPT)
ํ ์ด๋ธ์คํ์ด์ค์ ๋ฐ์ดํฐ๋ ์ธ๋ฑ์ค ํ์ด์ง์์ ์์๋ ๋ถ๋ถ์ด ๋ฐ๊ฒฌ๋์ด๋ ๋ฌด์ํ๊ณ ์ฌ์์.
ํ ์ด๋ธ์ ๋ฐ์ดํฐ ํ์ผ์ด ์์๋๋ค๋ฉด ์ฌ์ฉํ์.
- 2 (SRV_FORCE_NO_BACKGROUND)
๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋ ์ค ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์์ํ์ง ์๊ณ ์ฌ์์.
์ด๋ ๋ฉ์ธ ์ค๋ ๋๊ฐ undo ์์ญ์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋น์ธ ๋ ์ฅ์ ๊ฐ ๋ฐ์ํ๋ค๋ฉด ์ฌ์ฉํ์.
- 3 (SRV_FORCE_NO_TRX_UNDO)
์ปค๋ฐ๋์ง ์๊ณ ์ข ๋ฃ๋ ํธ๋์ญ์ ์ ๊ทธ๋๋ก ๋จ์์๋๋ก ์ฌ์์.
innoDB์์๋ ํธ๋์ญ์ ์คํ ์ ๋กค๋ฐฑ์ ๋๋นํ์ฌ ๋ณ๊ฒฝ ์ ์ ๋ฐ์ดํฐ๋ฅผ undo ์์ญ์ ๊ธฐ๋กํ๊ณ , ์๋ฒ ์ฌ์์ ์ undo ์์ญ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ์ ์ ์ผ๋ก ๋ฐ์ดํฐ ํ์ผ์ ์ ์ฉํ๋๋ฐ ๋ณดํต ์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ๋ ๋กค๋ฐฑ์ ํ๋ค.
์ด๋ ๋กค๋ฐฑ์ ํ์ง ์๊ณ ์ฌ์์์ ํ๋ ์ ๋ต์ด๋ค.
- 4 (SRV_FORCE_NO_IBUF_MERGE)
์ธ์ํธ ๋ฒํผ์ ๋ด์ฉ์ ๋ฌด์ํ๊ณ ๊ฐ์ ๋ก ์ฌ์์.
innoDB๋ CUD ์์ ์ผ๋ก ์ธํด ์ธ๋ฑ์ค๊ฐ ๋ณ๊ฒฝ ์์ ์ ๋ฐ๋ก ์ฒ๋ฆฌํ๊ฑฐ๋ ์ธ์ํธ ๋ฒํผ์ ์ ์ฅํด๋๊ณ ๋์ค์ ๋ฐ์ดํฐ ํ์ผ์ mergeํ๊ฑฐ๋, ๋ ์ค ํ๋๋ฅผ ์ฑํํ๋๋ฐ ๋ง์ฝ ์ธ์ํธ ๋ฒํผ๊ฐ ์์๋์๋ค๋ฉด ์ฌ์ฉํ๋ ์ ๋ต์ด๋ค.
- 5 (SRV_FORCE_NO_UNDO_LOG_SCAN)
undo ๋ก๊ทธ๋ฅผ ๋ชจ๋ ๋ฌด์ํ๊ณ ์ฌ์์.
innoDB์์๋ MySQL ์ฌ์์ ์ undo ์์ญ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ์ฌ ๋ณต๊ตฌํ๊ณ , redo ๋ก๊ทธ๋ฅผ ํ์ฉํ์ฌ ์ข ๋ฃ ์์ ์ด๋ ์ฅ์ ์์ ์ ์ํ๋ฅผ ์ฌํํ๋ฉฐ, ์ปค๋ฐ๋์ง ์์ ํธ๋์ญ์ ์์ ๋ณ๊ฒฝํ ์์ ์ ๋ชจ๋ ๋กค๋ฐฑ ์ฒ๋ฆฌ๋๋๋ฐ, ์ด๋ฌํ undo ๋ก๊ทธ๊ฐ ์์๋์์ ๋ ์ฌ์ฉํ๋ ์ ๋ต์ด๋ค. ๋จ, ์ด ์ ๋ต์ ์ฌ์ฉํ๋ฉด ์ปค๋ฐ๋์ง ์์ ์์ ๋ ๋ชจ๋ ์ปค๋ฐ๋ ๊ฒ์ฒ๋ผ ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ์ฃผ์ํด์ผ ํ๋ค.
- 6 (SRV_FORCE_NO_LOG_REDO)
redo ๋ก๊ทธ๋ฅผ ๋ชจ๋ ๋ฌด์ํ๊ณ ์ฌ์์.
์ปค๋ฐ๋์๊ฑฐ๋ redo ๋ก๊ทธ์๋ง ๊ธฐ๋ก๋๊ณ ๋ฐ์ดํฐ ํ์ผ์ ๊ธฐ๋ก๋์ง ์์ ๋ฐ์ดํฐ๋ ๋ชจ๋ ๋ฌด์๋๋ฉฐ, ๋ง์ง๋ง ์ฒดํฌํฌ์ธํธ ์์ ์์์ ๋ฐ์ดํฐ๋ง ๋จ๊ฒ ๋๋ค.
๋ค์ ํฌ์คํ
์์๋ innoDB์ ํต์ฌ ๋ถ๋ถ์ธ ๋ฒํผ ํ์ ๋ํด์ ์์๋ณด๋๋ก ํ์.