책너두 6기 11일차

백은빈, 이성욱의 Real MySQL8.0 1권 p.120 ~ p.129

내용정리

04 아키텍처

4.2.8 Double Write Buffer

InnoDB 스토리지 엔진의 리두 로그는 리두 로그 공간의 낭비를 막기 위해 페이지의 변경된 내용만 기록한다. 이로 인해 스토리지 엔진에서 더티 페이지를 디스크 파일로 플러시할 때 일부만 기록되는 문제가 발생하면 그 페이지의 내용은 복구할 수 없을 수도 있다. 이렇게 페이지가 일부만 기록되는 현상을 파셜 페이지(Partial-page) 또는 톤 페이지(Torn-page)라고 한다.

데이터의 무결성이 매우 중요한 서비스에서는 고려할만하다.

4.2.9 언두 로그

트랜잭션과 격리 수준을 보장하기 위해 DML(insert, update, delete)로 변경되기 이전의 이전 버전의 데이터를 별도로 백업하는데, 이를 언두 로그(Undo Log)라고 한다.

  • 트랜잭션 보장 : 트랜잭션이 롤백되면 트랜잭션 도중 변경된 데이터를 변경 전으로 복구하기 위해 언두 로그를 이용한다.
  • 격리 수준 보장 : 특정 커넥션에서 데이터 변경 중 다른 커넥션이서 조회하면 격리 수준에 따라 언두 로그를 반환하기도 한다.
4.2.9.1 언두 로그 모니터링

update member set name='hong' where member_id=1

을 입력하면 어떤일이 일어날까.

우선 트랜잭션을 커밋하지 않아도 실제 데이터 내용이 변경된다. 언두영역에는 변경 전 데이터가 백업된다. 롤백할때 이 백업된 데이터가 복구되는 것이다. 위에서 말한 트랜잭션 보장이 바로 이 의미이다.

서비스 중 언두 로그 건수를 확인해 언두 로그 건수가 얼마나 쌓여있는지 확인해야 한다.

4.2.9.2 언두 테이블스페이스 관리

언두 로그가 저장되는 공간을 언두 테이블스페이스(Undo Tablespace)라고 한다. 하나의 언두 테이블스페이스는 1~128개의 롤백 세그먼트를 가지며, 롤백 세그먼트는 1개 이상의 언두 슬롯(Undo Slot)을 가진다. 하나의 롤백 세그먼트는 InnoDB의 페이지 크기를 16바이트로 나눈 값의 개수만큼의 언두 슬롯을 가진다.

최대 동시 트랜잭션 수 = (InnoDB 페이지 크기) / 16 _ (롤백 세그먼트 개수) _ (언두 테이블스페이스 개수)

새로운 언두테이블 스페이스는 동적으로 추가하거나 삭제할 수 있다. 언두 테이블스페이스 공간을 필요한 만큼만 남기고 불필요하거나 과도하게 할당된 공간을 운영체제로 반납하는 것을 ‘Undo tablespace truncate’라고 한다. 방법은 자동과 수동 두가지가 있다.

4.2.10 체인지 버퍼

InnoDB는 변경해야 할 인덱스 페이지가 버퍼 풀에 있으면 바로 업데이트를 수행하지만 디스크로부터 읽어와야 한다면 체인지 버퍼(Change Buffer)라는 임시 메모리 공간에 저장해 두고 바로 사용자에게 결과를 반환한다.