D |
|
여기서 리두 로그와 바이너리 로그의 차이점에 주목하세요. 리두 로그는 스토리지 엔진 계층에서 생성되는 반면 바이너리 로그는 데이터베이스 계층에서 생성됩니다. 대규모 트랜잭션이 100,000행의 레코드를 tba에 삽입한다고 가정해 보겠습니다. 이 과정에서 레코드는 계속해서 순차적으로 리두 로그에 기록되지만 바이너리 로그에는 기록되지 않습니다. 트랜잭션이 커밋된 경우에만 바이너리 로그 파일에 기록됩니다. 한 번. 바이너리 로그에는 행(Row), 명령문(Statement), 혼합(Mix) 등 3가지 기록 형식이 있으며, 이들 간의 기록 형식이 다릅니다.
2.2redoParameters
redo 로그 파일 수, 이름 지정 방법: ib_logfile0, iblogfile1... . 기본값은 2이고 최대값은 100입니다.
파일 설정 크기, 기본값은 48M, 최대값은 512G, 최대값은 전체 리두 로그 시리즈 파일의 합계, 즉 (innodb_log_files_in_group * innodb_log_file_size)는 최대값인 512G보다 클 수 없습니다.
파일 저장 경로
Redo 로그 캐시 영역, 기본 8M, 1로 설정 가능 8M. 디스크에 트랜잭션 로그 쓰기를 지연하고, redo 로그를 버퍼에 넣은 다음 innodb_flush_log_at_trx_commit 매개변수 설정에 따라 버퍼에서 디스크로 로그를 플러시합니다.
innodb_flush_log_at_trx_commit=1, 각 커밋은 리두 로그 버퍼의 리두 로그를 시스템에 기록하고 이를 디스크 파일에 fsync합니다.
innodb_flush_log_at_trx_commit=2, 트랜잭션이 커밋될 때마다 MySQL은 리두 로그 버퍼의 로그를 시스템에 기록하지만 파일 시스템 버퍼에만 기록하며 시스템은 이를 내부적으로 디스크 파일에 fsync합니다. 데이터베이스 인스턴스가 충돌하더라도 다시 실행 로그는 손실되지 않습니다. 그러나 서버가 충돌하면 파일 시스템 버퍼가 디스크 파일에 fsync할 시간이 없기 때문에 데이터의 이 부분이 손실됩니다.
innodb_flush_log_at_trx_commit=0, 트랜잭션 프로세스 중에는 다른 설정과 마찬가지로 로그가 항상 redo 로그 버퍼에 있지만 트랜잭션이 커밋되면 redo 쓰기 작업이 발생하지 않지만 MySQL 내부 작업은 1초에 한 번씩 발생하므로, 리두 로그 버퍼에서 시스템에 데이터를 씁니다. 충돌이 발생하면 1초 이내의 트랜잭션 수정 작업이 손실됩니다.
2.3 redo Space Management
Redo 로그 파일의 이름은 ib_logfile[number]
로 지정됩니다. Redo 로그는 파일이 가득 차면 첫 번째 파일로 돌아갑니다. 그리고 덮어씁니다. (단, redo 체크포인트를 수행하면 첫 번째 로그 파일의 헤더 체크포인트 표시도 함께 업데이트되므로 엄밀히 말하면 순차 쓰기에 포함되지 않습니다.)
실제로 리두 로그는 리두 로그 버퍼와 리두 로그 파일의 두 부분으로 구성됩니다. 버퍼 풀에서 데이터 수정 사항은 리두 로그 버퍼에 기록됩니다. 다음과 같은 경우 리두 로그가 리두 로그 파일로 플러시됩니다.
3 실행 취소 및 다시 실행
3.1 실행 취소 + Redo 트랜잭션의 단순화된 프로세스
각각 1과 2의 값을 갖는 두 개의 데이터 A와 B가 있다고 가정합니다. 트랜잭션의 작업 내용은 1을 3으로 수정하고 2를 4로 수정합니다. 기록은 다음과 같습니다(단순화):
A. 트랜잭션이 시작됩니다.
B. 로그를 실행 취소하려면 A=1을 기록합니다.
C. A=3을 수정합니다.
D. 로그를 다시 실행하려면 A=3을 기록합니다.
E. 로그를 실행 취소하려면 B=2를 기록합니다.
F. B=4를 수정합니다.
G. 로그를 다시 실행하려면 B=4를 기록합니다.
H. 디스크에 다시 실행 로그를 씁니다.
I. Transaction submit
3.2 IO Impact
Undo + Redo를 설계하는 주요 목적은 입출력 성능을 향상시키고 데이터베이스의 처리 용량을 늘리는 것입니다. B D E G H는 모두 새로운 작업이지만 B D E G는 버퍼 영역에 버퍼링되어 있음을 알 수 있습니다. G만 IO 작업을 추가합니다. Redo Log가 더 나은 IO 성능을 가질 수 있도록 InnoDB의 Redo Log 설계에는 다음과 같은 특징이 있습니다.
B. Redo Log가 연속된 공간에 저장되도록 하세요. 따라서 시스템을 처음 시작하면 로그 파일의 공간이 완전히 할당됩니다. 성능 향상을 위해 Redo Log는 순차적 IO 방식으로 기록되어 단계별로 완료될 예정이다.
B. 로그를 일괄적으로 작성합니다. 로그는 파일에 직접 기록되지 않고 먼저 리두 로그 버퍼에 기록됩니다. 로그를 디스크에 플러시해야 하는 경우(예: 트랜잭션 제출) 많은 로그가 디스크에 함께 기록됩니다.
C. 동시성 트랜잭션은 Redo Log 저장 공간을 공유하며, 해당 트랜잭션의 Redo Log는 명령문의 실행 순서에 따라 교대로 함께 기록되어 로그가 차지하는 공간을 줄인다. 예를 들어 Redo 로그의 레코드 내용은 다음과 같을 수 있습니다.
레코드 1:
레코드 2:
레코드 3:
레코드 4:
레코드 5:
D. C 때문에 트랜잭션이 Redo Log를 disk 를 사용하면 커밋되지 않은 다른 트랜잭션의 로그도 디스크에 기록됩니다.
E. Redo Log에서는 순차 추가 작업만 수행됩니다. 트랜잭션을 롤백해야 하는 경우 해당 Redo Log 기록은 Redo Log에서 삭제되지 않습니다.
3.3 Recovery
앞서 언급한 것처럼 커밋되지 않은 트랜잭션과 롤백된 트랜잭션도 Redo Log에 기록되므로 이러한 트랜잭션은 복구 중에 특별히 처리되어야 합니다. 2가지 복구 전략이 있습니다.
A. 복구 시 커밋된 트랜잭션만 다시 실행하세요.
복구 시 커밋되지 않은 트랜잭션과 롤백된 트랜잭션을 포함하여 모든 트랜잭션을 다시 실행해야 합니다. 그런 다음 실행 취소 로그를 통해 커밋되지 않은 트랜잭션을 롤백합니다.
MySQL 데이터베이스 InnoDB 스토리지 엔진은 전략 B를 사용합니다. InnoDB 스토리지 엔진의 복구 메커니즘에는 여러 가지 특징이 있습니다. A. Redo Log를 다시 실행할 때
트랜잭션성에 신경 쓰지 않습니다. 복구 중에는 BEGIN, COMMIT 또는 ROLLBACK 동작이 없습니다. 각 로그가 어느 트랜잭션에 속하는지는 중요하지 않습니다. Redo Log에는 트랜잭션 ID 등 트랜잭션 관련 내용이 기록되지만, 이는 운용되는 데이터의 일부로만 간주된다. B. 전략 B를 사용할 경우 Undo Log가 유지되어야 하며, Redo Log를 작성하기 전에 해당 Undo Log를 디스크에 작성해야 합니다. Undo와 Redo Log 간의 이러한 관계는 지속성을 복잡하게 만듭니다. 복잡성을 줄이기 위해 InnoDB는 Undo Log를 데이터로 취급하므로 Undo Log를 기록하는 작업도 Redo 로그에 기록됩니다. 실행 취소 로그를 메모리에 캐시하면 다시 실행 로그를 쓰기 전에 디스크에 다시 쓸 필요가 없습니다.
실행 취소 로그 작업이 포함된 Redo 로그는 다음과 같습니다. 레코드 1: Undo log insert
> 레코드 2: 레코드 3: 로그 삽입 실행 취소
> 레코드 4: 레코드 5:
로그 삽입 실행 취소 > 레코드 6:
C. 이 시점에서 아직 명확하게 밝혀지지 않은 문제가 있습니다. Redo는 트랜잭션이 아니기 때문에 롤백된 트랜잭션을 다시 실행하지 않을까요?
사실이에요. 동시에 Innodb는 트랜잭션 롤백 중 작업을 리두 로그에 기록합니다. 롤백 작업을 수행하면 데이터 수정 사항이 Redo Log에 기록됩니다. 롤백 작업을 수행하면 기본적으로 데이터도 수정되기 때문입니다.
롤백된 트랜잭션의 Redo 로그는 다음과 같습니다.
레코드 1: 레코드 2: insert A
&hellip ;> 레코드 3: > 레코드 4: update B
…> 레코드 5: > 레코드 6: delete C
…> 레코드 7: insert C
> 레코드 8: update B 오래된 가치 섹스에.