DATABASE

MariaDB 손상 복구 관련 정리 자료(2) -MYISAM

예나부기 2022. 9. 27.

사실 대부분의 테이블 손상이 일어나는 경우는 MariaDB-MYISAM의 조합이다.

(InnoDB의 경우 이 전 포스팅을 참고)

https://yenbook.tistory.com/108

 

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

우리 서비스에서는 데이터베이스를 MSSQL, MariaDB 두 가지 옵션으로 제공하는데, 라이선스, 비용 등을 고려하여 MariaDB를 기본 타입으로 제공하고 있다. 하지만 MariaDB의 치명적인 단점이 있었으니,

yenbook.tistory.com

MYISAM의 경우 하나의 테이블에 대해 기본적으로 3개의 파일을 생성한다.

/mysql/data/DB/테이블명.frm 테이블의 구조를 정의하는 파일
/mysql/data/DB/테이블명.MYD 데이터 파일
/mysql/data/DB/테이블명.MYI 인덱스 파일

myisamchk(데이터 파일의 상태를 체크하거나 손상된 데이터 파일을 복구하는 유틸리티)를 사용할 경우

check tablerepair table에 비해 빠른 속도로 복구가 가능하다.

 

myisamchk 유틸리티 옵션 리스트

구분 명령어 설명
Global 옵션 -#, --debug=… Debug 로그를 출력함
-?, --help 도움말을 출력
-s, --silent 침묵 모드로 작동
검사도중 에러가 발생했을 때만 출력
-v, --verbose 상세 정보를 출력
체크 옵션 -c, --check 테이블에 오류가 없는지 체크
-e, --extend-check 테이블에 오류가 없는지 세밀하게 검사
오류를 수정했음에도 계속해서 오류가 발생할 때 이 옵션을 부여한다. 대신 체크 속도는 느림
-F, --fast 제대로 닫히지 않은 테이블만 체크
-C, --check-only-changed 마지막으로 체크한 이후로 변경된 테이블만 체크
-f, --force 체크 중 에러가 발견되면 바로 복구 시작
-i, --information 체크된 테이블의 정보를 출력
-m, --medium-check --extend-check 체크보다 빠르게 체크
복구 옵션 -B, --backup .MYD 파일의 백업 파일을 ‘<파일명>-<생성시간>.BAK’라는 이름으로 생성
-D, --data-file-length=<크기> 복구 후 다시 생성할 데이터 파일의 최대 크기를 지정
-e, --extend-check 로우 단위로 세밀하게 복구한다.
파일이 완전히 손상된 경우에만 이 옵션을 사용
-f, --force 기존의 임시 파일을 덮어씀
-r, --recover 손상된 테이블을 복구
-o, --safe-recover 예전 버전의 복구 방법을 사용하여 복구
-r보다는 느리지만 -r옵션에서 복구할 수 없는 것들을 일부 복구함
-q, --quick 데이터 파일(.MYD)를 제외하고 빠르게 복구

 

복구 방법 1~4까지 순서대로 실행해본다. 각 방법마다 에러 발생 시 아래의 방법으로 이동한다.

 

복구 방법 1

1)테이블 체크

myisamchk *.MYI를 실행하거나,

시간이 더 있다면 myisamchk -e *.MYI를 실행하여 어떤 테이블에 오류가 있는지 체크한다.

2)myisamchk -r -q <테이블명> 을 실행하여 빠른 복구를 실행

-q 옵션을 부여하여 데이터파일 (.MYD)은 건드리지 않고 인덱스 파일을 복구함

 

복구 방법 2

1)데이터 파일을 백업

2)myisamchk -r <테이블명> 을 실행하여 복구 모드로 복구를 실행한다.

오류가 있는 행을 삭제하면서 새로운 인덱스 파일을 생성한다.

3)복구되지 않을 시 myisamchk –safe-recover <테이블명> 을 실행한다.

 

복구 방법 3

1)데이터 파일(.MYD)를 다른 장소로 이동한다. (복사X)

2)mysql> 에 접속하여 해당 테이블을 삭제한다. TRUNCATE TABLE

3)이동시켜둔 데이터 파일을 원래 위치로 복사 (이동X)

4)myisamchk -r -q <테이블명> 실행하여 복구

 

.frm 파일이 심하게 손상되어 위 방법으로 복구되지 않을 시, 다음과 같이 시도한다.

 

복구 방법 4

1)새로운 데이터 베이스에서 새 테이블을 생성하여 .frm.MYI파일을 만든다.

2)복구 방법 2와 동일하게 진행

 

복구 방법 5

1)톰캣중지
2)아래 복구 방법을 하나씩 해본다!

-repair table 테이블명;
-repair table 테이블명 use_frm;
-myisamchk --recover 테이블명;
-mysqlcheck -u root -p --auto-repair DB명;
3)톰캣 재가동

 

복구 방법 6

1) stop the MySQL database - MYSQL 중지
2) take backup of your .frm, .myd, myi files - data폴더 안에 있는 .frm, .myd, .myi 파일 백업
3) delete all the files from mysql data directory. - data 폴더 안에 있는 해당 테이블과 관련된 파일 모두 삭제
4) start MySQL Database - MYSQL 서비스 시작해서 테이블이 사라졌는지 확인
5) Re-create table again by using CREATE Table statement. - CREATE문을 사용하여 해당 테이블 재생성
6) Stop the MySQL database. - MYSQL 중지
7) Copy .myd & .myi files back into the data directory by replacing the ones there. - myd, .myi 파일을 data폴더에 덮어쓰기
8) At last, begin MySQL database again. - MYSQL 재시작

 

 

댓글