DATABASE

MariaDB 손상 복구 관련 정리 자료(1) -InnoDB

예나부기 2022. 9. 27.

우리 서비스에서는 데이터베이스를 MSSQL, MariaDB 두 가지 옵션으로 제공하는데,

라이선스, 비용 등을 고려하여 MariaDB를 기본 타입으로 제공하고 있다.

 

하지만 MariaDB의 치명적인 단점이 있었으니, 바로 테이블 crash 문제이다.

특히, InnoDB/MYISAM 데이터 엔진 중 어떤 엔진을 사용하냐에 따라 crash 위험성 차이가 있었다.

(사실 MYISAM엔진을 사용하고 있는 MariaDB인 경우에서 거의 대부분의 테이블 손상-복구 문제가 문제가 일어났음)

 

매번 손상이 일어날 때마다 복구 방법을 찾아보기 번거로워, 이번 기회에 정리를 하고자 한다.

먼저, 손상 가능성이 적은 InnoDB의 경우를 먼저 정리한다.

 

 

1)InnoDB 테이블이 손상되는 경우는 상당히 희박하다.

 

Double write, Checksum 그리고 기타 Validation 로직들과 버그 보완으로 인해

MYISAM에 비해 INNODB 테이블 스페이스 및 데이터 파일은 상당히 안정적임

 

2)대부분의 손상은 인덱스에서 발생한다.

 

INNODB 데이터 파일의 손상은 80-90% 정도가 인덱스에 발생한 손상인 경우이며

이 경우 단순히 ALTER TABLE 또는 데이터 덤프파일 덮어쓰기 만으로 해결된다.

 

3)이 이외의 INNODB 테이블의 문제인 경우 DB 전체를 덤프 후 다시 로드하는 것으로 해결될 수 있음

 

4)INNODBmyisamchk와 같은 별도의 복구 도구를 제공하지 않음

 

5)InnoDB는 완료되지 못한 트랜잭션, 디스크에 일부만 기록된 데이터 페이지 등에 대한 

복구 작업이 자동으로 진행됨

 

*데이터파일이 손상된 경우, MYSQL을 기동시켜서 데이터를 덤프받는 것이 유일한 방법입니다.


1.
서비스 중지

2. MYSQL 설정파일(my.ini)에 아래와 같이 설정

innodb_force_recovery = 1

-InnoDB Boot-up 과정에서 여러 가지 체크 및 정리 작업들을 하게 되는데, 이 중에서 하나라도 문제가 있을 경우 시작이 되지 않기 때문에 위와 같이 설정하면, 데이터 파일의 손상된 페이지가 발견되어도 무시하고 MySQL을 기동시킨다. 일단 MySQL이 기동 되면, SELECT * FROM tbl_name; 명령문을 실행하여 데이터를 덤프 하여 다시 적재하거나 다른 데이터베이스로 이전하는 것이 좋다.

3. 서비스 시작

4. 서비스가 정상 기동되지 않을 시 다른 복구 모드 (1~6) 선택하여 서비스 재 시작 (점차 윗 단계로! 대신 윗 단계로 갈수록 데이터 손실 가능성 늘어남)

5. 데이터베이스 덤프

- Mysql설치폴더/bin에서 mysqldump -u 계정 -p 데이터베이스명 > 백업할 파일명.sql

6. 데이터베이스 복원

- Mysql설치폴더/bin에서 mysqldump -a -u 계정 -p 데이터베이스명 < 백업한 파일명.sql

7. 복구 모드 삭제 후 서비스 재시작

-innodb_force_recovery 옵션 값

옵션 값  
1 손상된 페이지가 발견되어도 무시하고 mysql을 가동한다. 가동이 되면 테이블을 덤프하여 복구하거나 다른 데이터베이스로 이전하는 것이 좋다. (손상된 레코드와 페이지는 모두 건너뛰게 되므로 데이터를 잃게 됨)
2 메인 쓰레드가 구동되지 못하도록 한다. 만일 퍼지 연산 (purge operation)이 진행되는 동안 크래시가 발생한다면, 이 복구 값은 퍼지 연산이 실행되는 것을 막게 된다.
3 mysql종료하던 시점에 진행중인 트랜잭션이 있다면 mysql 단순히 그 연결을 끊는다. 다시 실행 후 innodb엔진이 롤백을 실행하는데 만약 데이터가 손상된 경우 롤백을 실행할 수 없기 때문에 이경우 사용되는 복구 모드이다.
4 INSERT, UPDATE, DELETE  연산자를 실행하지 않도록 한다. 테이블 통계값을 계산하지 않도록 한다.
5 데이터베이스를 시작할 때 운도 로그 (undo log)를 검사하지 않는다: InnoDB는 완벽하지 않은 트랜잭션도 실행된 것으로 다루게 된다.
6 mysql이 재시작전 가장 뒤에 발생한 체크포인트 이후 모든 트랜잭션을 버리고 복구하는 모드이다 복구 연결에서 로그 롤-포워드 (roll-forward)를 실행하지 않고 강제복구 한다.

 

댓글