본문 바로가기
데이터베이스

MySQL redo, WAL

by 흰색남자 2023. 1. 12.

WAL = Redo 로그라고도 부른다.
WAL은 트랜잭션 ACID 중 Durable이랑 가장 밀접하게 연관되어 있다. 하드웨어나 소프트웨어 등 여러가지 장애로 인해 MySQL 서버가 비정상적으로 종료되었을 경우, 데이터 파일에 기록되지 못한 데이터를 잃지 않게 해주는 기능이다.


MySQL 서버는 데이터 변경 내용을 로그로 먼저 기록한다.  그 이유는 MySQL은 쓰기보다 읽기 성능을 고려하여 만들어진 자료 구조인 B-tree 를 사용하기 때문에 데이터를 파일에 기록하려면 큰 비용이 필요하다. 이로 인한 성능 저하를 막기 위해 쓰기 비용이 낮은 WAL에 기록해서 디스크와 동기화 시킨다.


하지만 로그 발생할 때마다 로그를 파일에 기록하게 되면 많은 부하가 발생하기 때문에 로그 버퍼에 기록하고 일정한 간격으로 디스크에 동기화시킨다. 동기화 시간, 로그 버퍼의 크기를 관리하는 설정은 my.cnf에서 설정이 가능하다. innodb_flush_log_at_trx_commit 설정을 통하여 0,1,2에 따라 디스크 동기화 방식이 달라지게 되고, innodb_flush_log_at_timeout을 통하여 디스크 동기화 주기를 변경할 수 있다.

MySQL 서버가 비정상 적으로 종료되는 경우 다음과 같은 2가지 일관되지 않은 데이터를 가질 수 있다.

1. 데이터 커밋됐지만 데이터 파일에 기록되지 않은 데이터
WAL에 저장된 데이터를 데이터 파일에 다시 복사하면 복구된다.

2. 롤백됐지만 데이퍼 파일에 기록된 데이터.                                                                                                                             WAL을 통해 그 변경이 커밋됐는지, 롤백됐는지, 트랜잭션 실행 중간 생태였는지 확인하고, undo log를 통해 트랜잭션을 다시 롤백시킨다.

'데이터베이스' 카테고리의 다른 글

Buffer Pool과 redo의 관계  (0) 2023.01.13
MySQL Buffer Pool  (0) 2023.01.13
hbase와 hbase thrift, happyhbase  (0) 2023.01.04
오랜만에 하둡 설치기(2) - 주키퍼를 설치하고 HBASE를 얹어보자  (1) 2022.12.30
redo, undo  (0) 2022.12.29