[MySQL][InnoDB] Double Write buffer, Undo Log, Redo Log

■ Doublewrite Buffer

이중 쓰기 버퍼는 InnoDB 데이터 파일의 적절한 위치에 페이지를 쓰기 전에 InnoDB 버퍼 풀에서 플러시 페이지를 쓰는 저장 영역입니다. 페이지 쓰기 도중에 운영 체제, 스토리지 서브 시스템 또는 mysqld 프로세스 충돌이있는 경우 InnoDB 응급 복구 중에 이중 쓰기 버퍼에서 올바른 페이지 사본을 찾을 있습니다.

 

데이터가 기록되지만 이중 쓰기 버퍼에는 두배의 I/O 오버 헤드 또는 두배의 I/O 작업이 필요하지 않습니다. 운영 체제에 대한 단일 fsync() 호출로 innodb_flush_method O_DIRECT_NO_FSYNC 설정된 경우를 제외하고는 순차 청크로 이중 쓰기 버퍼에 데이터가 기록됩니다.

 

이중 쓰기 버퍼는 대부분의 경우 기본적으로 활성화되어 있습니다. 이중 쓰기 버퍼를 비활성화하려면 innodb_doublewrite 0으로 설정합니다.

 

시스템 테이블 스페이스 파일 ( "ibdata 파일") 원자 쓰기를 지원하는 Fusion-io 장치에있는 경우 이중 쓰기 버퍼링이 자동으로 비활성화되고 Fusion-io 원자 쓰기가 모든 데이터 파일에 사용됩니다. 이중 쓰기 버퍼 설정은 전역이므로, 퓨전이 아닌 하드웨어에 상주하는 데이터 파일에 대해서는 이중 쓰기 버퍼링도 비활성화됩니다. 기능은 Fusion-io 하드웨어에서만 지원되며 Linux Fusion-io NVMFS에서만 활성화됩니다. 기능을 최대한 활용하려면 innodb_flush_method 설정 O_DIRECT 권장합니다.

 

 

 

■ Redo Log

리두 로그(재실행 로그) 응급 복구 중에 불완전한 트랜잭션으로 작성된 데이터를 정정하는 사용되는 디스크 기반 데이터 구조입니다. 정상 조작 중에 리두 로그는 SQL 또는 저수준 API 호출로 인한 테이블 데이터 변경 요청을 인코딩합니다. 예기치 않은 종료 전에 데이터 파일 업데이트를 완료하지 않은 수정은 초기화 중에 그리고 연결이 수락되기 전에 자동으로 재생됩니다.

 

기본적으로 리두 로그는 물리적으로 ib_logfile0 ib_logfile1이라는 개의 파일로 디스크에 표시됩니다. MySQL 리두 로그 파일에 순환 방식으로 씁니다. 리두 로그의 데이터는 영향을받는 레코드로 인코딩됩니다. 데이터를 통틀어 리두라고합니다. 리두 로그를 통한 데이터 통과는 점점 증가하는 LSN 값으로 표시됩니다.

 

▶ InnoDB 리두 로그 파일의 또는 크기 변경

InnoDB 리두 로그 파일의 또는 크기를 변경하려면 다음 단계를 수행합니다.

1. MySQL 서버를 중지하고 오류없이 종료되는지 확인합니다.

2. my.cnf 편집하여 로그 파일 구성을 변경합니다. 로그 파일 크기를 변경하려면 innodb_log_file_size파라미터에 원하는 값을 입력합니다. 로그 파일 수를 늘리려면 innodb_log_files_in_group 이용하여 원하는 파일수를 입력합니다.

3. MySQL 서버를 다시 시작합니다.

 

InnoDB innodb_log_file_size 리두로그 파일크기와 다르다는 것을 감지하면 로그 체크포인트를 작성하고 이전 로그파일을 닫고 제거하며 요청된 크기로 로그파일을 작성한 로그파일을 엽니다.

 

리두 로그 플러싱을 위한 그룹 커밋

다른 ACID 호환 데이터베이스 엔진과 마찬가지로 InnoDB 트랜잭션이 다시 실행되기 전에 리두 로그를 플러시합니다. InnoDB 그룹 커밋 기능을 사용하여 커밋마다 하나의 플러시를 피하기 위해 여러 개의 플러시 요청을 그룹화합니다. 그룹 커밋을 통해 InnoDB 로그 파일에 단일 쓰기를 실행하여 거의 동시에 커밋하는 여러 사용자 트랜잭션에 대한 커밋 작업을 수행하여 처리량을 크게 향상시킵니다.

 

Redo Log에 대한 정리 포스트

https://myinfrabox.tistory.com/259

 

[MySQL] InnoDB - Redo Log

■ Redo Log란 많은 데이터베이스 관리 시스템과 마찬가지로 MySQL은 데이터 내구성을 달성하기 위해 로그를 사용합니다(기본 InnoDB 스토리지 엔진을 사용할 때). 만약 DB 에 장애가 발생하여서 메모

myinfrabox.tistory.com

 

 

■ Undo Logs

언두 로그(실행 취소 로그) 단일 읽기-쓰기 트랜잭션과 관련된 언두 로그 레코드의 모음입니다. 실행 언두로그 레코드에는 트랜잭션에 의한 최신 변경 사항을 클러스터형 인덱스 레코드로 실행을 취소하는 방법에 대한 정보가 포함되어 있습니다. 다른 트랜잭션이 일관된 읽기 작업의 일부로 원래 데이터를 보아야하는 경우 수정되지 않은 데이터는 언두 로그 레코드에서 검색됩니다. 언두 로그는 롤백 세그먼트 내에 포함 실행 취언두 로그 세그먼트 내에 있습니다. 롤백 세그먼트는 시스템 테이블 스페이스, 언두 테이블 스페이스 임시 테이블 스페이스에 있습니다.

 

임시 테이블 스페이스에있는 언두 로그는 사용자 정의 임시 테이블의 데이터를 수정하는 트랜잭션에 사용됩니다. 이러한 언두 로그는 응급 복구에 필요하지 않으므로 다시 로그되지 않습니다. 서버가 실행되는 동안 롤백에만 사용됩니다. 유형의 실행 언두 로그는 재실행 로깅 I/O 피함으로써 성능을 향상시킵니다.

 

InnoDB 최대 128개의 롤백 세그먼트를 지원하며 32개는 임시 테이블 스페이스에 할당됩니다. 이로 인해 일반 테이블의 데이터를 수정하는 트랜잭션에 할당 수있는 96개의 롤백 세그먼트가 남습니다. innodb_rollback_segments 변수는 InnoDB에서 사용하는 롤백 세그먼트 수를 정의합니다.

 

롤백 세그먼트가 지원하는 트랜잭션 수는 롤백 세그먼트의 언두 슬롯 수와 트랜잭션에 필요한 언두 로그 수에 따라 다릅니다.

롤백 세그먼트의 실행 취소 슬롯 수는 InnoDB 페이지 크기에 따라 다릅니다.

 

InnoDB Page Size Number of Undo Slots in a Rollback Segment
(InnoDB Page Size / 16)
4096 (4KB) 256
8192 (8KB) 512
16384 (16KB) 1024
32768 (32KB) 2048
65536 (64KB) 4096

 

 

 

 트랜잭션에는 다음 작업 유형 각각에 대해 최대 4 개의 실행 언두 로그가 할당됩니다.

1. 사용자 정의 테이블에 대한 INSERT 조작

2. 사용자 정의 테이블에 대한 UPDATE DELETE 조작

3. 사용자 정의 임시 테이블에 대한 INSERT 조작

4. 사용자 정의 임시 테이블에 대한 UPDATE DELETE 조작

 

필요에 따라 언두 로그가 할당됩니다. 예를 들어, 일반 임시 테이블에서 INSERT, UPDATE DELETE 작업을 수행하는 트랜잭션에는 4개의 언두 로그를 완전히 할당해야합니다. 일반 테이블에서 INSERT 조작 수행하는 트랜잭션에는 단일 언두 로그가 필요합니다.

 

일반 테이블에서 작업을 수행하는 트랜잭션에는 할당된 시스템 테이블 스페이스 또는 언두 테이블 스페이스 롤백 세그먼트에서 언두 로그가 할당됩니다. 임시 테이블에서 작업을 수행하는 트랜잭션에는 할당 임시 테이블 스페이스 롤백 세그먼트의 언두 로그가 할당됩니다.

 

트랜잭션에 할당 언두 로그는 해당 기간 동안 트랜잭션과 연결되어 있습니다. 예를 들어, 일반 테이블에서 INSERT 조작을 위해 트랜잭션에 지정된 언두 로그는 해당 트랜잭션이 수행하는 일반 테이블의 모든 INSERT 조작에 사용됩니다.

 

위에서 설명한 요소를 감안할 다음 공식을 사용하여 InnoDB 지원할 수있는 동시 읽기 / 쓰기 트랜잭션 수를 추정 있습니다.

 

노트
InnoDB 지원할  있는 동시 읽기 / 쓰기 트랜잭션 수에 도달하기 전에 트랜잭션에 동시 트랜잭션 제한 오류가 발생할  있습니다. 트랜잭션에 지정된 롤백 세그먼트에 언두 슬롯이 부족할  발생합니다. 이러한 경우 트랜잭션을 다시 실행합니다.

 

 트랜잭션이 임시 테이블에서 작업을 수행할 InnoDB 지원할 수있는 동시 읽기 / 쓰기 트랜잭션 수는 임시 테이블 스페이스에 할당 롤백 세그먼트 (32) 제한됩니다.

+ 트랜잭션이 INSERT 또는 UPDATE 또는 DELETE 작업을 수행하는 경우 InnoDB 지원할 수있는 동시 읽기 / 쓰기 트랜잭션 수는 다음과 같습니다.

(innodb_page_size / 16) * (innodb_rollback_segments-32)

 

+ 트랜잭션이 INSERT UPDATE 또는 DELETE 작업을 수행하는 경우 InnoDB 지원할 수있는 동시 읽기 / 쓰기 트랜잭션 수는 다음과 같습니다.

(innodb_page_size / 16/2) * (innodb_rollback_segments-32)

 

+ 트랜잭션이 임시 테이블에서 INSERT 작업을 수행하는 경우 InnoDB 지원할 수있는 동시 읽기 / 쓰기 트랜잭션 수는 다음과 같습니다.

(innodb_page_size / 16) * 32

 

+ 트랜잭션이 임시 테이블에서 INSERT UPDATE 또는 DELETE 작업을 수행하는 경우 InnoDB 지원할 수있는 동시 읽기 / 쓰기 트랜잭션 수는 다음과 같습니다.

(innodb_page_size / 16/2) * 32

 

도움이 되셨다면 광고클릭 한번 부탁드립니다.※

'Databases > MySQL' 카테고리의 다른 글

[MySQL][InnoDB] Buffer Pool 플러싱(Flushing)  (0) 2020.05.31
[MySQL][InnoDB] 버퍼풀 설정  (2) 2020.05.27
[MySQL][InnoDB] 테이블스페이스  (0) 2020.05.16
[MySQL][InnoDB] 메모리구조  (0) 2020.05.06
[MySQL][InnoDB] Locking  (0) 2020.05.05

Designed by JB FACTORY