Loading...
MySQL 9.5 Reference Manual 9.5의 17.6.5 Redo Log의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
Redo log는 crash recovery 동안 미완료 트랜잭션에 의해 기록된 데이터를 수정하는 데 사용되는 디스크 기반 데이터 구조입니다. 정상 동작 시, redo log는 SQL 문이나 저수준 API 호출로 인해 발생하는 테이블 데이터 변경 요청을 인코딩합니다. 예기치 않은 셧다운 전에 데이터 파일 업데이트를 완료하지 못한 변경 사항은 초기화 시점에, 그리고 커넥션이 허용되기 전에 자동으로 재생됩니다. Crash recovery에서 redo log의 역할에 대한 정보는 Section 17.18.2, “InnoDB Recovery”를 참조하십시오.
Redo log는 디스크 상에서 redo log 파일로 물리적으로 표현됩니다. Redo log 파일에 기록되는 데이터는 영향을 받은 레코드 단위로 인코딩되며, 이 데이터를 통칭하여 redo라고 합니다. Redo log 파일을 통과하는 데이터의 흐름은 계속 증가하는 LSN 값으로 표현됩니다. Redo log 데이터는 데이터 변경이 발생함에 따라 추가 기록되고, 체크포인트가 진행됨에 따라 가장 오래된 데이터는 잘려(truncate) 나갑니다.
Redo log와 redo log 용량 관련 정보 및 절차는 이 섹션에서 다음 주제들로 설명됩니다:
innodb_redo_log_capacity system 변수는 redo log 파일이 차지하는 디스크 공간의 양을 제어합니다. 이 변수는 시작 시 옵션 파일에서 설정하거나, SET GLOBAL 문을 사용하여 런타임에 설정할 수 있습니다. 예를 들어, 다음 문은 redo log 용량을 8GB로 설정합니다:
1SET GLOBAL innodb_redo_log_capacity = 8589934592;
런타임에 설정하면 구성 변경은 즉시 적용되지만, 새로운 제한값이 완전히 구현되기까지는 시간이 걸릴 수 있습니다. Redo log 파일이 차지하는 공간이 지정된 값보다 작으면, 버퍼 풀의 더티 페이지는 테이블스페이스 데이터 파일로 덜 공격적으로 플러시되며, 결국 redo log 파일이 차지하는 디스크 공간이 증가합니다. Redo log 파일이 차지하는 공간이 지정된 값보다 크면, 더티 페이지는 더 공격적으로 플러시되며, 결국 redo log 파일이 차지하는 디스크 공간이 감소합니다.
Innodb_redo_log_capacity_resized server 상태 변수는 모든 redo log 파일에 대한 총 redo log 용량을 나타냅니다.
Redo log 파일은 데이터 디렉터리의 #innodb_redo 디렉터리에 존재하며, 다른 디렉터리가 innodb_log_group_home_dir 변수로 지정되지 않은 경우에 그렇습니다. innodb_log_group_home_dir가 정의된 경우 redo log 파일은 해당 디렉터리의 #innodb_redo 디렉터리에 존재합니다. Redo log 파일에는 ordinary 타입과 spare 타입의 두 가지가 있습니다. Ordinary redo log 파일은 사용 중인 파일이며, spare redo log 파일은 사용 대기 중인 파일입니다. InnoDB는 총 32개의 redo log 파일을 유지하려고 시도하며, 각 파일의 크기는 1/32 * innodb_redo_log_capacity와 동일합니다. 그러나 innodb_redo_log_capacity 설정을 수정한 직후에는 파일 크기가 일시적으로 서로 다를 수 있습니다.
Redo log 파일은 #ib_redoN 네이밍 컨벤션을 사용하며, 여기서 _N_은 redo log 파일 번호입니다. Spare redo log 파일은 _tmp 접미사로 표시됩니다. 다음 예시는 #innodb_redo 디렉터리의 redo log 파일을 보여주며, 여기에는 21개의 active redo log 파일과 11개의 spare redo log 파일이 있고, 순차적으로 번호가 매겨져 있습니다.
1'#ib_redo582' '#ib_redo590' '#ib_redo598' '#ib_redo606_tmp' 2'#ib_redo583' '#ib_redo591' '#ib_redo599' '#ib_redo607_tmp' 3'#ib_redo584' '#ib_redo592' '#ib_redo600' '#ib_redo608_tmp' 4'#ib_redo585' '#ib_redo593' '#ib_redo601' '#ib_redo609_tmp' 5'#ib_redo586' '#ib_redo594' '#ib_redo602' '#ib_redo610_tmp' 6'#ib_redo587' '#ib_redo595' '#ib_redo603_tmp' '#ib_redo611_tmp' 7'#ib_redo588' '#ib_redo596' '#ib_redo604_tmp' '#ib_redo612_tmp' 8'#ib_redo589' '#ib_redo597' '#ib_redo605_tmp' '#ib_redo613_tmp'
각 ordinary redo log 파일은 특정 LSN 값 범위와 연관됩니다. 예를 들어, 다음 쿼리는 앞의 예시에 나열된 active redo log 파일에 대한 START_LSN 및 END_LSN 값을 보여줍니다:
1mysql> SELECT FILE_NAME, START_LSN, END_LSN FROM performance_schema.innodb_redo_log_files; 2+----------------------------+--------------+--------------+ 3| FILE_NAME | START_LSN | END_LSN | 4+----------------------------+--------------+--------------+ 5| ./#innodb_redo/#ib_redo582 | 117654982144 | 117658256896 | 6| ./#innodb_redo/#ib_redo583 | 117658256896 | 117661531648 | 7| ./#innodb_redo/#ib_redo584 | 117661531648 | 117664806400 | 8| ./#innodb_redo/#ib_redo585 | 117664806400 | 117668081152 | 9| ./#innodb_redo/#ib_redo586 | 117668081152 | 117671355904 | 10| ./#innodb_redo/#ib_redo587 | 117671355904 | 117674630656 | 11| ./#innodb_redo/#ib_redo588 | 117674630656 | 117677905408 | 12| ./#innodb_redo/#ib_redo589 | 117677905408 | 117681180160 | 13| ./#innodb_redo/#ib_redo590 | 117681180160 | 117684454912 | 14| ./#innodb_redo/#ib_redo591 | 117684454912 | 117687729664 | 15| ./#innodb_redo/#ib_redo592 | 117687729664 | 117691004416 | 16| ./#innodb_redo/#ib_redo593 | 117691004416 | 117694279168 | 17| ./#innodb_redo/#ib_redo594 | 117694279168 | 117697553920 | 18| ./#innodb_redo/#ib_redo595 | 117697553920 | 117700828672 | 19| ./#innodb_redo/#ib_redo596 | 117700828672 | 117704103424 | 20| ./#innodb_redo/#ib_redo597 | 117704103424 | 117707378176 | 21| ./#innodb_redo/#ib_redo598 | 117707378176 | 117710652928 | 22| ./#innodb_redo/#ib_redo599 | 117710652928 | 117713927680 | 23| ./#innodb_redo/#ib_redo600 | 117713927680 | 117717202432 | 24| ./#innodb_redo/#ib_redo601 | 117717202432 | 117720477184 | 25| ./#innodb_redo/#ib_redo602 | 117720477184 | 117723751936 | 26+----------------------------+--------------+--------------+
체크포인트를 수행할 때, InnoDB는 체크포인트 LSN을 이 LSN을 포함하는 파일의 헤더에 저장합니다. 복구 중에는 모든 redo log 파일이 검사되며, 복구는 가장 최근 체크포인트 LSN에서 시작됩니다.
Redo log 및 redo log 용량 리사이즈 작업을 모니터링하기 위해 여러 상태 변수가 제공됩니다. 예를 들어, Innodb_redo_log_resize_status를 쿼리하여 리사이즈 작업의 상태를 확인할 수 있습니다:
1mysql> SHOW STATUS LIKE 'Innodb_redo_log_resize_status'; 2+-------------------------------+-------+ 3| Variable_name | Value | 4+-------------------------------+-------+ 5| Innodb_redo_log_resize_status | OK | 6+-------------------------------+-------+
Innodb_redo_log_capacity_resized 상태 변수는 현재 redo log 용량 한도를 보여줍니다:
1mysql> SHOW STATUS LIKE 'Innodb_redo_log_capacity_resized'; 2 +----------------------------------+-----------+ 3| Variable_name | Value | 4+----------------------------------+-----------+ 5| Innodb_redo_log_capacity_resized | 104857600 | 6+----------------------------------+-----------+
다른 관련 상태 변수는 다음과 같습니다:
더 많은 정보는 상태 변수 설명을 참조하십시오.
Active redo log 파일에 대한 정보를 보려면 innodb_redo_log_files Performance Schema 테이블을 쿼리하면 됩니다. 다음 쿼리는 해당 테이블의 모든 컬럼에서 데이터를 조회합니다:
1SELECT FILE_ID, START_LSN, END_LSN, SIZE_IN_BYTES, IS_FULL, CONSUMER_LEVEL 2FROM performance_schema.innodb_redo_log_files;
Server가 --innodb-dedicated-server와 함께 시작되면, InnoDB는 redo log 용량을 포함한 특정 InnoDB 파라미터 값들을 자동으로 계산하고 설정합니다. 자동 구성은 MySQL server가 사용 가능한 모든 시스템 리소스를 사용할 수 있는, MySQL에 전용된 서버에 존재하는 MySQL 인스턴스를 대상으로 합니다. 자세한 내용은 Section 17.8.13, “Enabling Automatic InnoDB Configuration for a Dedicated MySQL Server”를 참조하십시오.
Redo log 레코드를 복사하는 백업 유틸리티는 때때로 백업 작업이 진행되는 동안 redo log 생성 속도를 따라가지 못할 수 있으며, 그 결과 redo log 레코드가 덮어쓰여져 손실될 수 있습니다. 이 문제는 백업 작업 동안 MySQL server 활동이 상당히 높고, redo log 파일 저장 미디어가 백업 저장 미디어보다 더 빠르게 동작하는 경우에 가장 자주 발생합니다. Redo log archiving 기능은 redo log 레코드를 redo log 파일뿐만 아니라 아카이브 파일에도 순차적으로 기록함으로써 이 문제를 해결합니다. 백업 유틸리티는 필요에 따라 아카이브 파일에서 redo log 레코드를 복사할 수 있으며, 이를 통해 잠재적인 데이터 손실을 방지할 수 있습니다.
Server에서 redo log archiving이 구성되어 있는 경우, MySQL Enterprise Backup (이는 MySQL Enterprise Edition에 포함됨)은 MySQL server를 백업할 때 redo log archiving 기능을 사용합니다.
Server에서 redo log archiving을 활성화하려면 innodb_redo_log_archive_dirs system 변수에 값을 설정해야 합니다. 값은 레이블이 지정된 redo log 아카이브 디렉터리의 세미콜론으로 구분된 목록으로 지정됩니다.
label:directory 쌍은 콜론(:)으로 구분됩니다. 예:
1mysql> SET GLOBAL innodb_redo_log_archive_dirs='label1:directory_path1[;label2:directory_path2;…]';
_label_은 아카이브 디렉터리에 대한 임의의 식별자입니다. 콜론(:)을 제외한 모든 문자로 된 문자열이 될 수 있습니다. 빈 레이블도 허용되지만, 이 경우에도 콜론(:)은 여전히 필요합니다.
_directory_path_는 반드시 지정해야 합니다. Redo log 아카이브 파일에 사용할 디렉터리는 redo log archiving이 활성화될 때 존재해야 하며, 그렇지 않으면 에러가 반환됩니다. 경로에는 콜론(':' )을 포함할 수 있지만, 세미콜론(;)은 허용되지 않습니다.
innodb_redo_log_archive_dirs 변수는 redo log archiving을 활성화하기 전에 구성되어야 합니다. 기본값은 NULL이며, 이 값에서는 redo log archiving을 활성화할 수 없습니다.
참고
지정하는 아카이브 디렉터리는 다음 요구 사항을 충족해야 합니다. (이 요구 사항은 redo log archiving이 활성화될 때 강제됩니다.):
디렉터리가 존재해야 합니다. 디렉터리는 redo log 아카이브 프로세스에 의해 생성되지 않습니다. 그렇지 않으면 다음과 같은 에러가 반환됩니다:
ERROR 3844 (HY000): Redo log archive directory
' directory_path1' does not
exist or is not a directory
디렉터리는 world-accessible이어서는 안 됩니다. 이는 시스템의 무단 사용자에게 redo log 데이터가 노출되는 것을 방지하기 위한 것입니다. 그렇지 않으면 다음과 같은 에러가 반환됩니다:
ERROR 3846 (HY000): Redo log archive directory
' directory_path1' is accessible
to all OS users
디렉터리는 datadir, innodb_data_home_dir, innodb_directories, innodb_log_group_home_dir, innodb_temp_tablespaces_dir, innodb_tmpdir innodb_undo_directory, 또는 secure_file_priv에 의해 정의된 디렉터리이거나, 해당 디렉터리의 부모 디렉터리 또는 서브디렉터리일 수 없습니다. 그렇지 않으면 다음과 유사한 에러가 반환됩니다:
ERROR 3845 (HY000): Redo log archive directory
' directory_path1' is in, under,
or over server directory 'datadir' -
' /path/to/data_directory'
Redo log archiving을 지원하는 백업 유틸리티가 백업을 시작하면, 백업 유틸리티는 innodb_redo_log_archive_start() function을 호출하여 redo log archiving을 활성화합니다.
Redo log archiving을 지원하는 백업 유틸리티를 사용하지 않는 경우, redo log archiving은 다음과 같이 수동으로 활성화할 수도 있습니다:
1mysql> SELECT innodb_redo_log_archive_start('label', 'subdir'); 2+------------------------------------------+ 3| innodb_redo_log_archive_start('label') | 4+------------------------------------------+ 5| 0 | 6+------------------------------------------+
또는:
1mysql> DO innodb_redo_log_archive_start('label', 'subdir'); 2Query OK, 0 rows affected (0.09 sec)
참고
innodb_redo_log_archive_start()를 사용하여 redo log archiving을 활성화하는 MySQL 세션은 archiving이 진행되는 동안 열려 있어야 합니다. 동일한 세션에서 innodb_redo_log_archive_stop()을 사용하여 redo log archiving을 비활성화해야 합니다. Redo log archiving이 명시적으로 비활성화되기 전에 세션이 종료되면, server는 redo log archiving을 암묵적으로 비활성화하고 redo log 아카이브 파일을 제거합니다.
여기서 _label_은 innodb_redo_log_archive_dirs에 의해 정의된 레이블이며, subdir는 아카이브 파일을 저장하기 위해 _label_이 식별하는 디렉터리의 서브디렉터리를 지정하기 위한 선택적 인수입니다. 이는 단순한 디렉터리 이름이어야 하고, 슬래시 (/), 백슬래시 (\), 콜론 (:)은 허용되지 않습니다. subdir는 빈 값이거나 null일 수 있으며, 생략할 수도 있습니다.
INNODB_REDO_LOG_ARCHIVE 권한을 가진 사용자만이 innodb_redo_log_archive_start()를 호출하여 redo log archiving을 활성화하거나, innodb_redo_log_archive_stop()을 사용하여 이를 비활성화할 수 있습니다. 백업 유틸리티를 실행하는 MySQL 사용자 또는 redo log archiving을 수동으로 활성화 및 비활성화하는 MySQL 사용자는 이 권한을 가지고 있어야 합니다.
Redo log 아카이브 파일 경로는 directory_identified_by_label/[subdir/]archive.serverUUID.000001.log 형식입니다. 여기서 directory_identified_by_label은 innodb_redo_log_archive_start()의 label 인수로 식별되는 아카이브 디렉터리입니다. subdir는 innodb_redo_log_archive_start()에 사용되는 선택적 인수입니다.
예를 들어, redo log 아카이브 파일의 전체 경로와 이름은 다음과 유사하게 표시됩니다:
1/directory_path/subdirectory/archive.e71a47dc-61f8-11e9-a3cb-080027154b4d.000001.log
백업 유틸리티가 InnoDB 데이터 파일 복사를 완료한 후, innodb_redo_log_archive_stop() function을 호출하여 redo log archiving을 비활성화합니다.
Redo log archiving을 지원하는 백업 유틸리티를 사용하지 않는 경우, redo log archiving은 다음과 같이 수동으로 비활성화할 수도 있습니다:
1mysql> SELECT innodb_redo_log_archive_stop(); 2+--------------------------------+ 3| innodb_redo_log_archive_stop() | 4+--------------------------------+ 5| 0 | 6+--------------------------------+
또는:
1mysql> DO innodb_redo_log_archive_stop(); 2Query OK, 0 rows affected (0.01 sec)
Stop function이 성공적으로 완료된 후, 백업 유틸리티는 아카이브 파일에서 관련 redo log 데이터 구간을 찾아 이를 백업에 복사합니다.
백업 유틸리티가 redo log 데이터 복사를 완료하고 더 이상 redo log 아카이브 파일을 필요로 하지 않으면, 아카이브 파일을 삭제합니다.
정상적인 상황에서는 아카이브 파일 제거는 백업 유틸리티의 책임입니다. 그러나 redo log archiving 작업이 innodb_redo_log_archive_stop()이 호출되기 전에 예기치 않게 종료되는 경우, MySQL server가 해당 파일을 제거합니다.
Redo log archiving을 활성화하면 추가적인 쓰기 활동으로 인해 일반적으로 약간의 성능 비용이 발생합니다.
Unix 및 Unix 계열 운영체제에서는 업데이트 비율이 지속적으로 매우 높지 않은 경우 성능 영향은 일반적으로 미미합니다. Windows에서는 동일한 조건에서 성능 영향이 일반적으로 약간 더 큽니다.
업데이트 비율이 지속적으로 높고 redo log 아카이브 파일이 redo log 파일과 동일한 저장 미디어에 있는 경우, 쓰기 활동이 중첩되기 때문에 성능 영향이 더 클 수 있습니다.
업데이트 비율이 지속적으로 높고 redo log 아카이브 파일이 redo log 파일보다 느린 저장 미디어에 있는 경우, 성능은 임의의 수준으로 영향을 받습니다.
Redo log 아카이브 파일에 대한 쓰기 작업은 redo log 아카이브 파일이 위치한 느린 저장 미디어에서 기록되기를 기다리고 있는 지속된 redo log 블록 백로그가 매우 큰 경우를 제외하고, 일반적인 트랜잭션 로깅을 방해하지 않습니다. 이 경우 트랜잭션 로깅 속도는 redo log 아카이브 파일이 위치한 느린 저장 미디어에서 처리할 수 있는 수준으로 감소합니다.
ALTER INSTANCE DISABLE INNODB REDO_LOG 문을 사용하여 redo logging을 비활성화할 수 있습니다. 이 기능은 새로운 MySQL 인스턴스에 데이터를 로드하는 용도를 목표로 합니다. Redo logging을 비활성화하면 redo log 쓰기 및 doublewrite 버퍼링을 피함으로써 데이터 로딩 속도가 빨라집니다.
주의
이 기능은 새로운 MySQL 인스턴스에 데이터를 로드하는 용도로만 의도되었습니다. 프로덕션 시스템에서 redo logging을 비활성화하지 마십시오. Redo logging이 비활성화된 상태에서 server를 셧다운 및 재시작하는 것은 허용되지만, redo logging이 비활성화된 동안 예기치 않게 server가 중지되면 데이터 손실과 인스턴스 손상이 발생할 수 있습니다.
Redo logging이 비활성화된 상태에서 예기치 않은 server 중지 이후 server를 재시작하려는 시도는 다음 에러와 함께 거부됩니다:
1[ERROR] [MY-013598] [InnoDB] Server was killed when Innodb Redo 2logging was disabled. Data files could be corrupt. You can try 3to restart the database with innodb_force_recovery=6
이 경우, 새로운 MySQL 인스턴스를 초기화하고 데이터 로딩 절차를 다시 시작해야 합니다.
Redo logging을 enable 및 disable하려면 INNODB_REDO_LOG_ENABLE 권한이 필요합니다.
Innodb_redo_log_enabled 상태 변수를 사용하여 redo logging 상태를 모니터링할 수 있습니다.
Cloning 작업과 redo log archiving은 redo logging이 비활성화된 동안 허용되지 않으며, 그 반대도 마찬가지입니다.
ALTER INSTANCE [ENABLE|DISABLE] INNODB REDO_LOG 작업에는 exclusive backup metadata lock이 필요하며, 이 lock은 다른 ALTER INSTANCE 작업이 동시에 실행되는 것을 방지합니다. 다른 ALTER INSTANCE 작업은 lock이 해제될 때까지 기다렸다가 실행되어야 합니다.
다음 절차는 새로운 MySQL 인스턴스에 데이터를 로드할 때 redo logging을 비활성화하는 방법을 보여줍니다.
INNODB_REDO_LOG_ENABLE 권한을 부여합니다.1mysql> GRANT INNODB_REDO_LOG_ENABLE ON *.* to 'data_load_admin';
data_load_admin 사용자로 redo logging을 비활성화합니다:1mysql> ALTER INSTANCE DISABLE INNODB REDO_LOG;
Innodb_redo_log_enabled 상태 변수를 확인하여 redo logging이 비활성화되었는지 확인합니다.1mysql> SHOW GLOBAL STATUS LIKE 'Innodb_redo_log_enabled'; 2+-------------------------+-------+ 3| Variable_name | Value | 4+-------------------------+-------+ 5| Innodb_redo_log_enabled | OFF | 6+-------------------------+-------+
데이터 로드 작업을 실행합니다.
데이터 로드 작업이 완료된 후 data_load_admin 사용자로 redo logging을 활성화합니다:
1mysql> ALTER INSTANCE ENABLE INNODB REDO_LOG;
Innodb_redo_log_enabled 상태 변수를 확인하여 redo logging이 활성화되었는지 확인합니다.1mysql> SHOW GLOBAL STATUS LIKE 'Innodb_redo_log_enabled'; 2+-------------------------+-------+ 3| Variable_name | Value | 4+-------------------------+-------+ 5| Innodb_redo_log_enabled | ON | 6+-------------------------+-------+
17.6.4 Doublewrite Buffer
17.6.6 Undo Logs