- Redo Log는 불완전한 트랜잭션에 의해 작성된 데이터를 수정하기 위해 응급 복구 중에 사용되는 디스크 기반 데이터 구조이다. 정상 작업중에는 Redo Log는 SQL문 또는 하위 수준 API 호출로 인한 테이블 데이터 변경 요청을 인코딩한다. 예기치 않은 종료 전에 데이터 파일 업데이트를 완료하지 않은 수정 사항은 초기화 중, 연결이 승인되기전에 자동으로 재생된다.
- 기본적으로 Redo Log는 ib_logfile0, ib_logfile1 이라는 두개의 파일로 디스크에 물리적으로 저장된다. MySQL은 순환방식으로 Redo Log 파일에 기록한다. Redo Log의 데이터는 영향을 받는 레코드 측면에서 인코딩된다. 이 데이터 집합을 redo 라고 한다. Redo Log를 통한 데이터 전달은 계쏙 증가하는 LSN 값으로 표시된다.
Redo Log 파일수 또는 크기 변경
- MySQL 서버를 중지하고 오류 없이 종료되었는지 확인한다.
- my.cnf 를 편집하여 로그 파일 구성을 변경한다.
로그 파일 크기를 변경하려면 innodb_log_file_size 를 수정한다.
로그 파일 수를 늘릴려면 innodb_log_file_in_group을 수정한다.
- MySQL 서버를 다시 시작한다.
- InnoDB는 innodb_log_file_size가 Redo Log 파일 크기와 다른것을 감지하면 로그 체크 포인트를 작성하고 이전 로그파일을 닫고 제거하며 요청된 크기로 새 로그 파일을 생성하고 새 로그 파일을 연다.
Redo Log 플러싱을 위한 그룹 커밋
- 다른 ACID 호환 데이터베이스 엔진과 마찬가지로 InnoDB는 트랜잭션이 커밋되기 전에 다시 실행 로그를 플러시한다. InnoDB는 그룹 커밋 기능을 사요하여 여러 플러시 요청을 함께 그룹화하여 각 커밋에 대해 하나의 플러시를 방지한다. 그룹 커밋을 사용하면 InnoDB는 로그 파일에 단일 쓰기를 실해앟여 거의 동시에 커밋하는 여러 사용자 트랜잭션에 대해 커밋 작업을 수행하여 처리량을 크게 향상시킨다.
Redo Log Archiving
- Redo Log 레코드를 복사하는 백업 유틸리티는 때때로 백업 작업이 진행되는 동안 Redo Log 생성 속도를 유지하지 못하여 해당 레코드를 덮어 쓰므로 Redo Log 레코드가 손실 될 수 있다. 이 문제는 백업 작업중 상당한 MySQL 서버 활동이 있고 Redo Log 파일 저장소 미디어가 백업 저장소 미디어보다 빠른 속도로 작동할때 가장 자주 발생한다. MySQL 8.0.17에 도입된 Redo Log Archiving 기능은 Redo Log 파일 외에도 Redo Log 레코드를 아카이브 파일에 순차적으로 기록하여 이 문제를 해결한다. 백업 유틸리티는 필요에 따라 아카이브 파일에서 Redo Log 레코드를 복사하여 잠재적인 데이터 손실을 방지할 수 있다.
- Redo Log Archiving이 서버에 구성되어 있는 경우 MySQL Enterprise Edition을 사용할 수 있는 MySQL Enterprise Backup 은 MySQL 서버를 백업할때 Redo Log Archiving 기능을 사용한다.
- Redo Log Archiving을 활성화 하려면 innodb_redo_log_archive_dirs 시스템 변수의 값을 설정한다.
값은 레이블이 저장된 Redo Log 아카이브 디렉토리의 세미콜론으로 구분된 목록으로 지정된다. lable:directory 쌍은 콜론(:)으로 구분된다.
예)
mysql> SET GLOBAL innodb_redo_log_archive_dirs='label1:directory_path1[;label2:directory_path2;…]';
- lable은 아카이브 디렉토리에 대한 임의의 식별자이다. 허용되지 않는 콜론(:)을 제외한 모든 문자열을 사용할 수 있다. 빈 lable도 허용되지만 이 경우에도 콜론(:)이 필요하다.
directory_path를 지정해야한다. Redo Log 아카이브 파일에 대해 선택한 디렉토리는 Redo Log 아키이브가 활성화되거나 오류가 반활 될 때 존재해야한다. 경로에는 콜론(:)이 포함될 수 있지만 세미콜론(;)은 허용되지 않는다.
- Redo Log 아카이브를 활성화하기 전에 innodb_redo_log_archive_dirs 변수를 설정해야한다. 기본값은 NULL 이며 Redo Log 아카이브 활성화를 허용하지 않는다.
- Redo Log 아키이브를 지원하는 백업 유틸리티가 백업 유틸리티가 백업을 시작하면 백업 유틸리티는 innodb_redo_log_archive_start() 함수를 호출하여 Redo Log 아카이브를 활성화한다.
- Redo Log 아카이브를 지원하지 백업 유틸리티를 사용하지 않는 경우 다음과 같이 Redo Log 아카이브를 수동으로 활성화 할 수도 있다.
mysql> SELECT innodb_redo_log_archive_start('label', 'subdir');
+------------------------------------------+
| innodb_redo_log_archive_start('label') |
+------------------------------------------+
| 0 |
+------------------------------------------+
또는
mysql> DO innodb_redo_log_archive_start('label', 'subdir');
Query OK, 0 rows affected (0.09 sec)
- Redo Log 아카이브를 활성화하는 MySQL 세션은 (innodb_redo_log_archive_start() 사용)은 archiving 기간동안 열려 있어야한다. 반드시 동일 세션에서 Redo Log 아카이브를 비활성화(innodb_redo_log_archive_stop() 사용) 해야한다. Redo Log 아카이브가 명시적으로 비활성화되기 전에 세션이 종료되면 서버는 Redo Log 아키이브를 암시적으로 비활성화하고 Redo Log 아카이브 파일을 제거한다.
- innodb_redo_log_archive_start 에서 lable은 innodb_redo_log_archive_dirs에 정의된 레이블이다. subdir은 아카이브 파일을 저장하기 위해 lable로 식별되는 디렉토리 하위 디렉토리를 지정하기 위한 선택적인 입력값이다. 단순한 디렉토리 이름이어야한다. (슬레시(/), 백슬레시(\) 또는 콜론(:)은 허용되지 않는다.(). subdir은 비어 있거나 NULL이거나 생략 할 수 있다.
- INNODB_REDO_LOG_ARCHIVE 권한이있는 사용자만 innodb_redo_log_archive_start()를 호출하여 Redo Log 아카이브를 활성화하거나 innodb_redo_log_archive_stop()을 사용하여 비활성화할 수 있다. 백업 유틸리티를 실행하는 MySQL 사용자 또는 수동으로 Redo Log 아카이브를 활성화 및 비활성화하는 MySQL 사용자는 이 권한이 있어야한다.
- Redo Log 아카이브 파일 경로는 directory_identified_by_label/[subdir/]archive.serverUUID.000001.log 입니다. 여기서 directory_identified_by_label은 innodb_redo_log_archvie_start()의 레이블 인수로 식별되는 아카이브 디렉토리이다. subdir은 innodb_redo_log_archive_start()에 사용되는 선택적인 입력값이다.
예를 들어 Redo Log 아카이브 파일의 전체 경로 및 이름은 다음과 유사하게 나타난다.
/directory_path/subdirectory/archive.e71a47dc-61f8-11e9-a3cb-080027154b4d.000001.log
- 백업 유틸리티가 InnoDB 데이터 파일 복사를 마치면 innodb_redo_log_archive_stop() 함수를 호출하여 Redo Log 보관(archiving)을 비활성화 한다.
- Redo Log 아카이브를 지원하는 백업 유틸리티를 사용하지 않는 경우 다음과 같이 Redo Log 아카이브를 수동으로 비활성화 할 수 있다.
mysql> SELECT innodb_redo_log_archive_stop();
+--------------------------------+
| innodb_redo_log_archive_stop() |
+--------------------------------+
| 0 |
+--------------------------------+
또는
mysql> DO innodb_redo_log_archive_stop();
Query OK, 0 rows affected (0.01 sec)
- stop function 이 성공적으로 완료되면 백업 유틸리티는 아카이브 파일에서 Redo Log 데이터의 관련 섹션을 찾아 백업에 복사한다.
- 백업 유틸리티가 Redo Log 데이터 복사를 완료하고 더 이상 Redo Log 아카이브 파일이 필요하지 않으면 아카이브 파일을 삭제한다.
- 아카이브 파일의 제거는 정상적인 상황에서 백업 유틸리티가 제거한다. 그러나 Innodb_redo_log_archive_stop()이 호출되기 전에 Redo Log 아카이브 작업이 예기치 않게 종료되면 MySQL 서버가 아카이브 파일을 제거한다.
성능 고려 사항
- Redo Log 아카이브를 활성화하면 일반적으로 추가 쓰기 작업으로 인해 약간의 성능 비용이 발생한다.
- Unix 및 Uinx 유사 운영 체제에서 지속적으로 높은 업데이트 비율이 없다고 가정하면 성능에 미치는 영향은 일반적으로 경미하다. Windows 에서 성능 영향은 일반적으로 조금 더 높으며, 동일하게 가정한다.
- 업데이트 비율이 지속적으로 높고 Redo Log 아카이브 파일이 Redo Log 파일보다 느린 저장매체에 있는 경우 복합적인 쓰기 활동으로 인해 성능 영향이 더 클 수 있다.
- 업데이트 비율이 지속적으로 높고 Redo Log 아카이브 파일이 Redo Log 파일보다 느린 저장매체에 있는 경우 성능이 임의로 영향을 받는다.
- Redo Log 아카이브 파일에 쓰기는 Redo Log 아카이브 파일 저장매체가 Redo Log 파일 저장매체보다 휠씬 느린속도로 작동하는 경우를 제외하고는 정상적인 트랜잭션 로깅을 방해하지 않는다.
- 이 경우 트랜잭션 로깅 속도는 Redo Log 아카이브 파일이 있는 느린 저장매체에서 관리 할 수 있는 수준으로 감소한다.
Redo Logging 비활성화
- MySQL 8.0.21 부터 ALTER INSTANCE DISABLE INNODB REDO_LOG 문을 사용하여 Redo Logging 을 비활성화 할 수 있다. 이기능은 데이터를 새로운 MySQL 인스턴스로 로드하기 위한것이다. Redo Logging을 비활성화하면 Redo Log 쓰기 및 doublewrite 버퍼링을 방지하여 데이터 로드 속도를 높일 수 있다.
- Redo Logging 활성화 비활성화를 하려면 INNODB_REDO_LOG_ENABLE 권한이 필요하다.
- innodb_redo_log_enabled 상태 변수로 Redo Logging 상태 모니터링 할 수 있다.
- Redo Logging 이 비활성화된 동안 복제 작업 및 Redo Log 아카이브가 허용되지 않으며 그 반대의 경우도 마찬가지다.
- ALTER INSTANCE [ENABLE|DISABLE] INNODB REDO_LOG 작업에는 다른 ALTER INSTANCE 작업이 동시에 실행되는것을 방지하는 베타적 백업 백업 메타 잠금(exclusive backup metadata lock)이 필요하다. 다른 ALTER INSTANCE 작업은 잠금이 해제 될때까지 기다려야 한다.
예제) 새로운 MySQL 인스턴스로 데이터를 로드할때 Redo Logging을 비활성화하는 방법
1. INNODB_REDO_LOG_ENABLE 권한 부여
mysql> GRANT INNODB_REDO_LOG_ENABLE ON *.* to 'data_load_admin';
2. data_log_admin 계정으로 Redo Logging을 비활성화
mysql> ALTER INSTANCE DISABLE INNODB REDO_LOG;
3. innodb_redo_log_enabled 상태 변수를 확인하여 Redo Logging 이 비활성화 되었는지 확인
mysql> SHOW GLOBAL STATUS LIKE 'Innodb_redo_log_enabled';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Innodb_redo_log_enabled | OFF |
+-------------------------+-------+
4. 데이터 로드 작업 실행
5. 데이터 로드 작업 완료후 data_load_admin 계정으로 Redo Logging 활성화
mysql> ALTER INSTANCE ENABLE INNODB REDO_LOG;
6. innodb_redo_log_enabled 상태 변수를 확인하여 Redo Logging 이 활성화 되었는지 확인
mysql> SHOW GLOBAL STATUS LIKE 'Innodb_redo_log_enabled';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Innodb_redo_log_enabled | ON |
+-------------------------+-------+
참고
https://dev.mysql.com/doc/refman/8.0/en/innodb-redo-log.html
'MySQL' 카테고리의 다른 글
xtrabackup 8.0 (1) (0) | 2021.06.30 |
---|---|
Hash join in MySQL 8 (0) | 2021.06.25 |
Update process (0) | 2021.06.19 |
OPTIMIZE TABLE Statement (0) | 2021.06.18 |
ANALYZE TABLE Statement (0) | 2021.06.17 |