14.19.2 InnoDB 복구 강제 실행
데이터베이스 페이지의 손상을 조사하기 위해 SELECT ... INTO OUTFILE 을 사용하여 데이터베이스에서 테이블을 덤프 할 수 있습니다. 일반적으로이 방법으로 취득 된 데이터의 대부분이 완전한 상태에 있습니다. 심각한 손상은 SELECT * FROM 명령문 또는 tbl_nameInnoDB 의 백그라운드 작업이 충돌하거나 표명하고, 경우에 따라서는 InnoDB 의 롤 포워드 복구가 충돌 할 수 있습니다. 이런 경우 테이블을 덤프 할 수 있도록 innodb_force_recovery 옵션을 사용하여 백그라운드 작업을 수행하지 않도록하고 InnoDB 스토리지 엔진을 강제로 실행시킬 수 있습니다. 예를 들어, 서버를 다시 시작하기 전에 옵션 파일의 [mysqld] 섹션에 다음 줄을 추가 할 수 있습니다.
[mysqld] innodb_force_recovery = 1
innodb_force_recovery 를 0보다 큰 값으로 설정하는 것은 긴급 상황에서 InnoDB 를 시작하고 테이블을 덤프 할 수있는 경우에만하십시오. 그것을하기 전에 데이터베이스를 다시 작성해야하는 경우에 대비하여 데이터베이스의 백업 복사본이 있는지 확인하십시오. 4 이상의 값을 지정하면 데이터 파일이 영구적으로 손상 될 수 있습니다. 프로덕션 서버 인스턴스에서 4 이상의 innodb_force_recovery 설정을 사용하는 것은 사용하는 데이터베이스의 개별 물리 복사 설정을 성공적으로 테스트 한 후에 만하십시오. InnoDB 의 복구를 강제로 실행하는 경우는 항상 innodb_force_recovery=1 에서 시작해야하는 경우에만이 값을 1 씩 늘리도록하십시오.
innodb_force_recovery 은 기본적으로 0입니다 (복구가 강제로 실행되지 않는 일반 부팅). innodb_force_recovery 의 허용되는 0 이외의 값은 1에서 6까지입니다. 큰 값은 작은 값의 기능이 포함되어 있습니다. 예를 들어, 3의 값은 값 1과 2의 모든 기능이 포함되어 있습니다.
3 다음 innodb_force_recovery 값을 사용하여 테이블을 덤프 할 경우 손상된 개별 페이지에서 일부 데이터 만 손실되지 않기 때문에 비교적 안전합니다. 4 이상의 값은 데이터 파일이 영구적으로 손상 될 수 있기 때문에 위험하다고 간주됩니다. 6 값은 데이터베이스 페이지가 폐지 된 상태로 유지되고 그에 따라 B 트리와 다른 데이터베이스 구조에 더 많은 손상이 도입 될 가능성이 있기 때문에 매우 위험하다고 간주됩니다.
안전 장치 innodb_force_recovery 가 0보다 큰 경우, InnoDB 는 INSERT , UPDATE 또는 DELETE 조작을 방지합니다. MySQL 5.6.15 시점에서는 4 이상 innodb_force_recovery 설정은 InnoDB 를 읽기 전용 모드로합니다.
1(SRV_FORCE_IGNORE_CORRUPT)손상된 페이지 를 감지 한 경우에도 서버가 동작 할 수 있도록합니다.
SELECT * FROM에서 손상된 인덱스 레코드와 페이지 넘기를 시도합니다. 이 테이블의 덤프에 도움이됩니다.tbl_name2(SRV_FORCE_NO_BACKGROUND)마스터 스레드 와 모든 퍼지 스레드 가 실행되지 않도록합니다. 제거 작업 중에 충돌이 발생 뻔 경우이 복구 값에 의해 해결됩니다.
3(SRV_FORCE_NO_TRX_UNDO)충돌 복구 의 후 트랜잭션 롤백 을 실행하지 않습니다.
4(SRV_FORCE_NO_IBUF_MERGE)삽입 버퍼 병합 작업을 피할 수 있습니다. 그 조작에 의해 충돌이 발생 뻔 경우는 그것이 해결됩니다. 테이블 통계 를 계산하지 않습니다. 이 값을 지정하면 데이터 파일이 영구적으로 손상 될 수 있습니다. 이 값을 사용한 후 모든 보조 인덱스를 삭제하고 다시 작성하도록 준비하십시오. MySQL 5.6.15 시점에서는
InnoDB를 읽기 전용으로 설정합니다.5(SRV_FORCE_NO_UNDO_LOG_SCAN)데이터베이스를 시작할 때 Undo 로그 를 참조하지 않습니다.
InnoDB는 완료되지 않은 트랜잭션조차 커밋 된 것으로 처리합니다. 이 값을 지정하면 데이터 파일이 영구적으로 손상 될 수 있습니다. MySQL 5.6.15 시점에서는InnoDB를 읽기 전용으로 설정합니다.6(SRV_FORCE_NO_LOG_REDO)복구에 관련한 Redo 로그 의 롤 포워드하지 않습니다. 이 값을 지정하면 데이터 파일이 영구적으로 손상 될 수 있습니다. 데이터베이스 페이지를 폐지 된 상태로 유지하고이를 통해 B 트리와 다른 데이터베이스 구조에 더 많은 손상이 발생할 수 있습니다. MySQL 5.6.15 시점에서는
InnoDB를 읽기 전용으로 설정합니다.
테이블에서 SELECT 를 실행하여 테이블을 덤프하고 3 다음 innodb_force_recovery 값을 사용하여 테이블의 DROP 또는 CREATE 를 수행 할 수 있습니다. 롤백시 특정 테이블에서 충돌이 발생하는 것을 알고 있다면, 그 테이블을 삭제할 수 있습니다. 실패한 대량 가져 오기 또는 ALTER TABLE 의해 롤백 폭주가 발생하는 경우는 mysqld 프로세스를 강제 종료하고 innodb_force_recovery 를 3 으로 설정하고 롤백없이 데이터베이스를 시작한 후 롤백 폭주의 원인 이 테이블의 DROP 을 수행 할 수 있습니다.
테이블 데이터의 손상으로 인해 테이블의 전체 내용을 덤프 할 수없는 경우는 ORDER BY 절이 포함 된 쿼리에서 손상된 부분의 뒤에있는 테이블의 부분을 덤프 할 수 있습니다. primary_key DESC
InnoDB 를 시작하기 위해 innodb_force_recovery 를 큰 값으로 할 필요가있는 경우는 복잡한 쿼리 ( WHERE , ORDER BY 또는 기타의 어구를 포함한 쿼리)를 실패시킬 수있는 손상된 데이터 구조가 존재할 가능성 수 있습니다. 이 경우 기본적인 SELECT * FROM t 쿼리 만 실행되지 않을 수 있습니다.