14.19.2 InnoDB 복구 강제 실행
데이터베이스 페이지의 손상을 조사하기 위해 SELECT ... INTO OUTFILE
을 사용하여 데이터베이스에서 테이블을 덤프 할 수 있습니다. 일반적으로이 방법으로 취득 된 데이터의 대부분이 완전한 상태에 있습니다. 심각한 손상은 SELECT * FROM
명령문 또는 tbl_name
InnoDB
의 백그라운드 작업이 충돌하거나 표명하고, 경우에 따라서는 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_name
2
(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
쿼리 만 실행되지 않을 수 있습니다.