recovery 모드를 이용하게된 원인
1. 일부 느린 쿼리로 인한 DB 서버 CPU 가 98% 이상 유지하면서 mariadb 프로세스가 중단
프로세스가 강제로 죽으면서 일부 데이터에 손상을 받은것으로 확인
2. 현재 mariadb 쿼리 현황 확인 show full processlist;
show full processlist;
많이 실행되고있는 쿼리 찾아서 속도 개선 ( INDEX 추가 및 변경 ) 쿼리플랜 보면서 수정
mariadb recovery 모드로 실행 - - 원인 파악 및 수정 - - mariadb 삭제 및 재설치 - - dump 파일 import
위 순서는 각자 상환에 맞게 해야 할거 같습니다.
innodb_force_recovery = 1 실행되면 mariadb 삭제 안하고 dump 파일 import 만으로 해결되는 경우도 있는거 같습니다.
설정
MySQL(mariadb)의 설정 파일(my.cnf, my.ini)에 설정하면된다.
innodb_force_recovery = 1 ~ 6
옵션 1 ~ 6 단계 까지 있다.
위 오류에서는 4단계를 했을때 실행이 되었다.
# vi /etc/my.cnf
innodb_force_recovery = 1
옵션 설명
1 ( SRV_FORE_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)를 실행하지 않고 강제복구한다.
옵션 설명은 참조 : https://yumserv.tistory.com/150
'공부 > SQL' 카테고리의 다른 글
MySQL(MariaDB) 문자열 대소문자 구분 (1) | 2024.02.07 |
---|---|
[MySQL] mariaDB Query Plan 계획(실행계획) (0) | 2024.01.08 |
MySQL ON DUPLICATE KEY (insert 기존에 있으면 update ) (0) | 2017.04.14 |
Mysql 덤프 / 임포트 하기 Dump / Import (0) | 2016.09.08 |
[Oracle, MySQL, MSSQL] LPAD, RPAD 함수 REPLICATE 함수 (0) | 2016.02.17 |