# InnoDB 스토리지 엔진 특성

- InnoDB의 모든 테이블은 pk 를 기준으로 클러스터링되어 저장된다.

- InnoDB는 락을 걸지 않고 읽기 작업을 수행하기 때문에, 다른 트랜잭션이 갖고 있는 락을 기다리지 않고 Read가 가능하다. (잠금없는 일관된 읽기)

- InnoDB는 데드락이 발생함과 동시에 바로 감지되고, 감지된 데드락은 관련 트랜잭션 중 ROLLBACK 했을 때 복구 작업이 가장 적은 트랜잭션(레코드를 가장 적게 변경한 트랜잭션)을 자동으로 강제 종료한다.

- InnoDB는 완료되지 못한 트랜잭션이나 디스크에 일부만 기록된 데이터페이지 등에 대한 복구 작업이 자동으로 진행된다. (‘innodb_force_recovery’ : 각 설정 값에 따라 손상을 복구하면서 스토리지 엔진을 강제로 시작해주는 옵션)

- Row 수준의 잠금이 걸리기 때문에, 변경작업(insert/update/delete) 속도가 MyISAM보다 상대적으로 빠르다.

- 외래키(FK)를 지원하여 데이터 무결성을 유지한다.

- 트랜잭션(commit, rollback)을 지원하며, ACID를 보장한다. 

 

# InnoDB 스토리지 엔진 구조

(5.7 기준   InnoDB   아키텍처)

 

1) InnoDB Buffer pool

: 디스크의 데이터 파일이나 인덱스 정보를 메모리에 캐시해두고, 쓰기작업을 일괄 처리할 수 있게 버퍼링해주는 역할을 한다.

    - 버퍼풀은 아직 디스크에 기록되지 않은 변경된 데이터(커밋과 상관없는)를 가지고 있다. (dirty page)

    - 이 더티페이지는 주기적으로 또는 체크포인트가 발생하면, write스레드가 필요한 만큼의 dirty page를 디스크로 기록한다.

 

2) Undo Log

: 데이터를 변경했을 때 변경되기 전의 데이터(이전 데이터)를 보관하는 장소로, 롤백 대비용이자, 트랜잭션의 격리수준을 유지하면서 높은 동시성을 제공하는 데 사용된다.

    - READ COMMITTED 이상의 격리수준 (+REPEATABLE READ, SERIALIZABLE)에서 MVCC를 보장하기 위해,  언두 영역의 데이터를 이용해 커밋전의 데이터를 다른 사용자가 조회했을 때, 언두영역의 데이터를 반환한다.

    - BEGIN으로 트랜잭션을 시작하고 장시간 동안 트랜잭션을 종료하지 않으면 언두영역이 무한정 커질 수 있다.

    - undo log 는 system tablespace(ibdata1), undo tablespace(undo_001), temporary tablespace(ibtmp1) 안에 있는 '롤백 세그먼트' 내에 포함된 '언두(로그)세그먼트' 내에 존재한다.

 

3) INSERT Buffer

: 데이터가 변경(INSERT,UPDATE) 되는 경우, 데이터파일과 해당 테이블에 포함된 인덱스를 업데이트하는 작업도 필요한데

이 때 변경해야할 인덱스 페이지가 버퍼풀에 있지 않아서 디스크로부터 읽어와서 업데이트를 해야 한다면, 이를 즉시 실행하지 않고 Insert Buffer에 저장해두고 바로 사용자에게 결과를 반환한다.

    - 유니크 인덱스는 중복여부를 체크해야 하기 때문에 인서트버퍼를 사용할 수 없다.

    - 인서트 버퍼에 임시로 저장돼 있는 인덱스 레코드 조각은 Insert buffer merge thread에 의해 병합된다.

 

4) Redo Log & Log Buffer

: Redo Log ACID를 보장하기 위해 변경된 내용을 순차적으로 디스크에 기록해둔 로그 파일이며 장애를 대비하기 위한 공간이고, Log buffer는 리두로그 버퍼링에 사용되는 공간이다.

 

5) Change Buffer

: 해당 페이지가 버퍼풀에 없을 때, 보조인덱스에 대한 변경사항을 캐시하는 공간으로, 메모리 영역에서는 버퍼풀의 일부이며, 디스크 영역에서는 DB서버 종료시 인덱스 변경이 버퍼링되는 공간이다.

 

6) Double write Buffer

 : 버퍼풀에서 플러쉬된 페이지를 데이터파일에 쓰기 전에 이중으로 기록하여, os나 스토리지 충돌시 응급복구 할 때 사본을 찾을 수 있다.

Print Friendly and PDF Posted by JJ*
: