DevLog ๐Ÿ˜ถ

[Real MySQL 8.0] InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ์•Œ์•„๋ณด๊ธฐ - 1ํŽธ (ํด๋Ÿฌ์Šคํ„ฐ๋ง / ์™ธ๋ž˜ํ‚ค / MVCC) ๋ณธ๋ฌธ

๐Ÿ“–/Real MySQL 8.0

[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์˜ ํ•ต์‹ฌ ๋ถ€๋ถ„์ธ ๋ฒ„ํผ ํ’€์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

Comments