Jiniya

WEB

Mysql 및 MariaDB 에서 InnoDB 복구하는법

InnoDB 엔진을 사용하다 보면 일부 .frm 또는 .ibd 파일들이 손상되어 복구가 필요한 일이 생깁니다. 백업파일이 없더라도 ibdata1파일만 존재한다면 복구가 가능합니다.

MySQL 이 innoDB 오류로 인하여 시작이 안된다면 /etc/my.cnf 을 수정하여 다음과 같이 추가해줍니다.

 

 

/**

* MySQL 설정파일 보통 /etc/my.cnf 에 위치

*/

[mysqld]

innodb_force_recovery = 1

 

 

위 처럼 추가 후 옵션값이 1일때 시작이 안된다면 1~6 사이 변경하며 재시작 해줍니다. 1~3정도로 시작이 된다면 mysqldump등을 이용해 백업해줍니다. 백업 후 문제되는 데이터베이스를 삭제하고 백업받았던 dump를 복원하시면 됩니다.

복원이 완료 되면 innodb_force_recovery = 1 항을 삭제한 후 재시작 합니다.

 

 

1 (SRV_FORCE_IGNORE_CORRUPT)

서버가 깨진 페이지를 발견한다고 하더라도 계속 구동하도록 만든다. Try to make SELECT * FROM tbl_name로 하여금 깨진 인덱스 레코드와 페이지를 건너 띄도록 만들며, 이렇게 하면 테이블을 덤핑하는데 도움이 된다.

2 (SRV_FORCE_NO_BACKGROUND)

메인 쓰레드가 구동되지 못하도록 한다. 만일 퍼지 연산 (purge operation)이 진행되는 동안 크래시가 발생한다면, 이 복구 값은 퍼지 연산이 실행되는 것을 막게 된다.

3 (SRV_FORCE_NO_TRX_UNDO)

복구 다음에 트랜젝션 롤백을 실행하지 않는다.

4 (SRV_FORCE_NO_IBUF_MERGE)

삽입 버퍼 병합 연산 (insert buffer merge operations)까지 금지한다. 만일 이 연산이 크래시의 원인이 된다면, 그것을 실행하지 않도록 한다. 테이블 통계값을 계산하지 않도록 한다.

5 (SRV_FORCE_NO_UNDO_LOG_SCAN)

데이터베이스를 시작할 때 운도 로그 (undo log)를 검사하지 않는다: InnoDB는 완벽하지 않은 트랜젝션도 실행된 것으로 다루게 된다.

6 (SRV_FORCE_NO_LOG_REDO)

복구 연결에서 로그 롤-포워드 (roll-forward)를 실행하지 않는다.