linux/DB

InnoDB 테이블 손상 시 강제 복구

배움엔 끝이없다 2021. 7. 2. 08:30
728x90
반응형

웬만하면 MySQL 서버의 코드 버그로 인해 비정상적인 셧다운이 되지 않는다. 하지만 MySQL 서버에 장착한 별도의 플러그인, Custom으로 개발한 UDF 사용, 하드웨어 장애 등의 원인으로 비정상적 종료가 될 수 있다.

 

특별한 명령이 없었는데 MySQL 서버가 재시작 된다면 MySQL 서버의 에러로그 파일에 "Segmentation fault" 메시지가 있는지 확인해야 한다. 이와 같이 "Segmentation fault" 메시지가 존재하고 서버가 셧 다운 되었다면, 데이터 파일 혹은 InnoDB의 로그파일 손상되었을 수 있다.

 

my.cnf 에서 



[mysqld]

innodb_force_recovery = 1





옵션값은 0~6까지있는데 0보다 큰 값으로 설정되어있으면 INSERT, UPDATE , DELETE 연산을 하지못한다고하며 큰값으로 설정될수록 아래숫자의 사항을 포함하게된다고합니다. 옵션값을 4로한다면 깨진 페이지에 잃어버린 데이터에대해서는 상대적으로 안전하다고함



옵션값 1 (SRV_FORCE_IGNORE_CORRUPT) : 손상된 페이지가 발견되어도 무시하고 mysql을 가동한다 가동이되면 테이블을 덤프하여 복구시키거나 다른데이터베이스로 이전하는것이 좋다 (손상된 레코드와 페이지는 모두 건너뛰게됨으로 데이터를 잃게됨)



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



온션값 3 (SRV_FORCE_NO_TRX_UNDO) : mysql종료하던 시점에 진행중인 트랜잭션이있다면 mysql 단순히 그 연결을 끊는다. 다시실행후 innodb엔진이 롤백을 실행하는데 만약 데이터가 손상된경우 롤백을 실행할수없기때문에 이경우 사용되는 복구모드이다.



옵션값 4 (SRV_FORCE_NO_IBUF_MERGE) :  INSERT, UPDATE , DELETE  연산자를 실행하지 않도록 한다. 테이블 통계값을 계산하지 않도록 한다.



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



옵션값 6 (SRV_FORCE_NO_LOG_REDO) : mysql이 재시작전 가장뒤에 발생한 체크포인트 이후 모든 트랜잭션을 버리고 복구시키는 모드이다 복구 연결에서 로그 롤-포워드 (roll-forward)를 실행하지 않고 강제복구한다



설정한 숫자가 커질수록 손실되는 데이터가 많아지므로 되도록 강제복구모드 설정을 낮은숫자 1 -> 2 -> 3 -> 4 -> 5 -> 6  순으로 시도해보는 것이 좋다.

728x90
반응형
LIST

'linux > DB' 카테고리의 다른 글

bulk_insert_buffer_size 설정  (0) 2021.07.15
mysql 언어셋 확인  (0) 2021.07.07
mysql LOCK TABLES 오류  (0) 2021.06.30
mysqlbinlog 사용법  (0) 2021.06.30
mysql logrotate 설정  (0) 2021.06.14