Loading...
MySQL 9.5 Reference Manual 9.5의 17.20.3 Forcing InnoDB Recovery의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
데이터베이스 페이지 손상을 조사하기 위해 데이터베이스에서
SELECT ... INTO OUTFILE을 사용해
테이블을 덤프할 수 있습니다. 일반적으로 이 방식으로
얻은 데이터 대부분은 온전합니다. 심각한 손상은 SELECT * FROM tbl_name 구문이나
InnoDB 백그라운드 작업이 예기치 않게
종료되거나 assert 를 발생시키거나, 심지어 InnoDB
롤 포워드 복구가 크래시 나게 할 수도 있습니다.
이런 경우,
innodb_force_recovery 옵션을 사용하여
백그라운드 작업이 실행되지 못하도록 막으면서
InnoDB 스토리지 엔진의 시작을 강제로
진행하여, 테이블을 덤프할 수 있습니다. 예를 들어, 서버를
재시작하기 전에 옵션 파일의 [mysqld] 섹션에 다음
라인을 추가할 수 있습니다:
1[mysqld] 2innodb_force_recovery = 1
옵션 파일 사용 방법에 대한 정보는 Section 6.2.2.2, “Using Option Files”를 참조하십시오.
주의
innodb_force_recovery를 0보다 큰 값으로 설정하는 것은
비상 상황에서 InnoDB 를 시작하고
테이블을 덤프하기 위한 용도로만 사용하십시오. 그 전에,
데이터베이스를 다시 만들어야 할 경우를 대비해 데이터베이스의 백업
복사본을 확보했는지 확인하십시오. 값이 4 이상이면 데이터
파일이 영구적으로 손상될 수 있습니다. 4 이상의
innodb_force_recovery 설정은, 별도의 물리적 데이터베이스 복사본에서
해당 설정을 성공적으로 테스트한 이후에만 프로덕션 서버
인스턴스에서 사용해야 합니다. InnoDB 복구를 강제로
진행할 때에는, 항상
innodb_force_recovery=1부터 시작하고 필요한 경우에만 값을 점진적으로
증가시켜야 합니다.
innodb_force_recovery의 기본값은 0입니다
(강제 복구 없이 정상 시작). 허용되는
innodb_force_recovery의 0이 아닌 값은 1에서 6까지입니다.
큰 값은 더 작은 값의 기능을 포함합니다. 예를 들어,
값 3은 값 1과 2의 모든 기능을 포함합니다.
innodb_force_recovery 값을 3 이하로 설정했을 때
테이블을 덤프할 수 있다면, 손상된 개별 페이지의 일부 데이터만
손실되었을 가능성이 비교적 큽니다. 값 4 이상은 데이터 파일이
영구적으로 손상될 수 있으므로 위험한 설정으로 간주됩니다.
값 6은 데이터베이스 페이지가 오래된 상태로 남게 되어, 이로 인해
B-trees 및 기타 데이터베이스 구조에 더 많은 손상을
가져올 수 있으므로 극단적인 설정으로 간주됩니다.
안전 장치로서, InnoDB 는
innodb_force_recovery가 0보다 클 때
INSERT,
UPDATE, 또는
DELETE 작업을 허용하지 않습니다.
innodb_force_recovery 설정 값이 4 이상이면
InnoDB 를 읽기 전용 모드로 전환합니다.
1
(SRV_FORCE_IGNORE_CORRUPT)서버가 손상된 페이지를
감지하더라도 계속 실행되게 합니다. 테이블을 덤프하는 데
도움이 되도록, 손상된 인덱스 레코드와 페이지를 건너뛰면서
SELECT * FROM tbl_name 이 실행되도록 시도합니다.
2
(SRV_FORCE_NO_BACKGROUND)마스터 thread 및 모든 purge thread 의 실행을 방지합니다. purge 작업 동안 예기치 않은 종료가 발생할 경우, 이 복구 값이 그러한 상황을 막아 줍니다.
3
(SRV_FORCE_NO_TRX_UNDO)crash recovery 이후에 트랜잭션 롤백을 실행하지 않습니다.
4
(SRV_FORCE_NO_IBUF_MERGE)insert buffer merge 작업을
방지합니다. 만약 이러한 작업이 크래시를 유발하는 경우,
이를 수행하지 않습니다. 테이블
statistics 를 계산하지 않습니다. 이 값은 데이터 파일을 영구적으로
손상시킬 수 있습니다. 이 값을 사용한 후에는 모든 보조
인덱스를 drop 및 recreate 할 준비를 해야 합니다.
InnoDB 를 읽기 전용으로 설정합니다.
5
(SRV_FORCE_NO_UNDO_LOG_SCAN)데이터베이스를 시작할 때 undo log를 확인하지
않습니다. InnoDB 는 완료되지 않은 트랜잭션도
커밋된 것으로 간주합니다. 이 값은 데이터 파일을 영구적으로
손상시킬 수 있습니다.
InnoDB 를 읽기 전용으로 설정합니다.
6
(SRV_FORCE_NO_LOG_REDO)복구와 관련된 redo log
롤 포워드를 수행하지 않습니다. 이 값은 데이터 파일을
영구적으로 손상시킬 수 있습니다. 데이터베이스 페이지를 오래된
상태로 남겨 두어, 결과적으로 B-trees 및 기타 데이터베이스 구조에
더 많은 손상을 가져올 수 있습니다.
InnoDB 를 읽기 전용으로 설정합니다.
테이블을 덤프하기 위해
SELECT를 사용할 수 있습니다.
innodb_force_recovery 값을 3 이하로 설정한 경우에는
DROP 또는 CREATE 테이블이
가능합니다. innodb_force_recovery 값이 3보다 큰
경우에도 DROP TABLE 은 지원됩니다.
innodb_force_recovery 값이 4보다 크면
DROP TABLE 은 허용되지 않습니다.
특정 테이블이 롤백 시 예기치 않은 종료를 유발한다는 것을
알고 있다면, 해당 테이블을 drop 할 수 있습니다. 실패한 대량
import 또는 ALTER TABLE 로 인해
롤백이 계속 진행되는 runaway rollback 을 발견한 경우,
mysqld 프로세스를 kill 한 다음
innodb_force_recovery를
3 으로 설정하여 롤백 없이 데이터베이스를
시작한 뒤, runaway rollback 을 유발하는 테이블을 DROP
할 수 있습니다.
테이블 데이터 내의 손상으로 인해 전체 테이블 내용을 덤프할 수
없는 경우, ORDER BY primary_key DESC 절이 포함된 쿼리를 사용하면
손상된 부분 이후의 테이블 일부를 덤프할 수 있습니다.
InnoDB 를 시작하기 위해 높은
innodb_force_recovery 값이
필요하다면, 복잡한 쿼리 (WHERE, ORDER BY 또는 기타 절을 포함하는 쿼리)가 실패하게
만드는 손상된 데이터 구조가 존재할 수 있습니다. 이 경우,
기본적인 SELECT * FROM t 쿼리만 실행할 수
있을 수도 있습니다.
17.20.2 Troubleshooting Recovery Failures
17.20.4 Troubleshooting InnoDB Data Dictionary Operations