본문 바로가기

Program/MySQL

Mysql - myisamchk.exe 사용하기

 MySQL 서버를 사용하다보면 예기치 못한 문제가 발생하여 데이터가 손상되는 경우가 생길 수
 
있다. 만약 테이블 타입이 InnoDB 라면 트랜잭션이 적용되기 때문에 그러한 경우 자동으로
 
데이터를 복구하지만 테이블 타입이 MyISAM 이라면 데이터가 손상될 확률이 좀 더 높다. 그런
 
경우 myisamchk 유틸리티를 사용하면 손상된 데이터를 수동으로나마 복구할 수 있다. 테이블을
 
체크하고 복구하는 SQL CHECK TABLE REPAIR TABLE 이 있으나 myisamchk 에 비해
 
속도는 느리다. CHECK TABLE REPAIR TABLE 에 대해서는 Appendix 장의
'SQL
레퍼런스' 를 참고 할 수 있다.

myisamchk 유틸리티는 데이터 파일의 상태를 체크하거나 손상된 데이터 파일을 복구하는 데
 
사용되는 유틸리티이다. 테이블을 안전하게 유지, 보수하고 싶다면 주기적으로 myisamchk
 
실행하여 상태를 검사해보는 것이 좋을 것이다.
 myisamchk
유틸리티를 이용하여 데이터 파일의 상태를 보거나 체크할 때는 상관없지만 데이터
 
파일을 복구하려 할 때는 반드시 MySQL 서버를 종료한 상태에서 실행해야 한다.
 
만약 MySQL 서버를 종요할 수 없는 피치못할 상황이라면 테이블에 Lock 를 건 다음 myisamchk
 
유틸리티를 실행하도록 한다.

 myisamchk
유틸리티의 사용 형식은 다음과 같다.

 myisamchk [옵션] <테이블명>

이 때 <테이블명> 에는 테이블명만 써서 해당 테이블을 검사할 수도 있고, *.MYI 라고 패턴문자
를 사용하여 해당 디렉토리 내의 모든 테이블을 검사할 수도 있다.

다음은 myisamchk 를 이용하는 예제인데 orders 테이블의 정보를 출력하는 모습을 보여주고 있다.


C:\windows\system32>myisamchk -d c:\APM_Setup\Server\MySQL\data\shopsample\orders

MyISAM file:         c:\APM_Setup\Server\MySQL\data\shopsample\orders
Record format:       Fixed length
Character set:       latin1 (8)
Data records:        8  Deleted blocks:      0
Recordlength:        17

table description:
Key Start Len Index   Type
1   2     4   unique  long

 

myisamchk 유틸리티에서 사용할 수 있는 옵션은 크게 Global 옵션, 체크 옵션, 복구 옵션 그리고
 
그 밖의 옵션으로 나눌 수 있다. Global 옵션은 유틸리티에서 전반적으로 사용되는 일반적인
 
옵션이고, 체크 옵션은 테이블의 상태를 체크하는데 사용하는 옵션이며, 복구 옵션은 테이블을
 
복구할 때 사용하는 옵션이다. 먼저 Global 옵션은 다음과 같다.

 

Global 옵션

설 명

-#, --debug=...

Debug 로그를 출력한다

-?, --help

도움말을 출력한다.

-t, --tmpdir=<경로>

임시 파일의 경로를 설정한다

-s, --silent

침묵 모드로 작동한다. 검사도중 에러가 발생했을 때만 출력한다

-v, --verbose

상세 정보를 출력한다

-V, --version

버전을 출력한다

-w, --wait

테이블에 Lock 이 걸려있으면 기다린다

 

다음은 -d -v 옵션을 이용하여 테이블의 정보를 상세하게 출력한 모습이다.

C:\windows\system32>myisamchk -d -v c:\APM_Setup\Server\MySQL\data\shopsample\orders

MyISAM file:         c:\APM_Setup\Server\MySQL\data\shopsample\orders
Record format:       Fixed length
Character set:       latin1 (8)
File-version:        1
Creation time:       2006-10-20 23:51:37
Status:              changed
Auto increment key:              1  Last value:                    17
Data records:                    8  Deleted blocks:                 0
Datafile parts:                  8  Deleted data:                   0
Datafile pointer (bytes):        4  Keyfile pointer (bytes):        3
Datafile length:               136  Keyfile length:              2048
Max datafile length:   73014444030  Max keyfile length:   17179868159
Recordlength:                   17

table description:
Key Start Len Index   Type                     Rec/key         Root  Blocksize
1   2     4   unique  long                           1         1024       1024

 

체크 옵션은 다음과 같다.

체크 옵션

설 명

-c, --check

테이블에 오류가 없는지 체크한다.

-e, --extend-check

테이블에 오류가 없는지 좀 더 세밀하게 검사한다

-F, --fast

오류를 수정했음에도 불구하고 계속해서 오류가 발생할때

이 옵션을 부여한다. 대신 체크 속도는 느리다

-C, --check-only-changed

테이블이 제대로 닫혀있는지 체크한다

-f, --force

마지막으로 체크한 이후로 변경된 테이블만 체크한다

체크중 에러가 발견되면 에러 테이블을 표시해놓고 바로 복구를 시작한다

-i, --information

체크된 테이블의 정보를 출력한다

-m, --medium-check

--extend-check 체크보다 빠르게 체크한다.

-U, --update-state

일반적으로 많이 사용한다.

-T, --read-only

에러가 발견된 테이블을 표시해둔다.
에러가 발견되어도 테이블에 표시해두지 않는다.

 

- 다음은 -eis 옵션을 주고 테이블을 체크한 모습이다.

C:\windows\system32>myisamchk -eis -v c:\APM_Setup\Server\MySQL\data\shopsample\orders
Checking MyISAM file: c:\APM_Setup\Server\MySQL\data\shopsample\orders
No recordlinks
block_size 1024:
Key:  1:  Keyblocks used:   6%  Packed:    0%  Max levels:  1
Total:    Keyblocks used:   6%  Packed:    0%

Records:                 8    M.recordlength:       17   Packed:             0%
Recordspace used:      100%   Empty space:           0%  Blocks/Record:   1.00
Record blocks:           8    Delete blocks:         0
Record data:           136    Deleted data:          0
Lost space:              0    Linkdata:              0



다음으로 복구 옵션과 그 밖의 옵션은 다음과 같다.

복구 옵션

설 명

-B, --backup

.MYD 파일의 백업 파일을 '<파일명>-<생성시간>.BAK' 라는 이름으로 만든다.

--correct-checksum

테이블의 checksum 정보를 바로 잡는다.

-D, --data-file-length=<크기>

복구후 다시 생성할 데이터 파일의 최대 크기를 지정한다.

-e, --extend-check

로우 단위로 세밀하게 복구한다. 따라서 많을 쓰레기 값들이 생길 수 있다.

파일이 완전히 손상된 경우에만 이 옵션을 사용하도록 한다.

-f, --force

기존의 임시 파일을 덮어쓴다.

-r, --recover  

거의 모든 것을 복구한다.

n, --sort-recover

임시 파일이 매우 크더라도 강제적으로 정렬해서 복구한다.

-o, --safe-recover

예전 버전의 복구 방법을 사용하여 복구한다. -r 보다는 느리지만 -r 옵션에서 복구할 수 없는 몇가지 것들을 복구할 수 있다.

--character-sets-dir=...

문자셋 디렉토리를 지정한다

--set-characater-set=<문자셋>

문자셋을 지정한다

-q, --quick

데이터 파일(.MYD) 를 제외하고 빠르게 복구한다.

 

그밖의 옵션

설 명

-a, --analyze

키의 분포를 분석한다. 몇몇 JOIN 을 빠르게 할 것이다.

-d, --description

테이블의 정보를 출력한다.

-S, --sort-index

인덱스 블록을 정렬한다. 다음 값 읽기(read-next) 의 속도를 향상시킨다.

-R, --sort-records =<인덱스 번호>    

인덱에 따라 로우를 정렬한다. SELECT ORDER BY 속도를 향상 시킬 수 있다. <인덱스 번호> SHOW INDEX FROM <테이블명> 으로알 수 있다.

 

테이블의 데이터 파일은 시스템이 전원이 나가서 MySQL 서버가 비정상 종료된 경우나 하드웨어의
결함 등으로 손상될 수 있다.

테이블이 손상된 경우에는 다음과 같은 에러가 출력될 수 있다.
 
<
테이블명>.frm' is locked against change

- Can't find file <테이블명>.MYI' (Errcode: <에러코드>)
- Unexpected end of file
- Record file is crashed

- 테이블이 손상되면 myisamchk 를 이용하여 복구를 실행하게 되는데, 손상된 부분을 찾아 복구하는
 
과정을 알아보자.

- 그전에 먼저 테이블의 데이터 파일에 대해 알아야 할 필요가 있다. 앞서 설명한 바가 있지만 하나의
 
테이블에 대해 기본적으로 3 개의 파일이 생성된다. 각각의 파일은 다음과 같다.

파 일

설 명

<테이블명>.MYI

인덱스 파일이다

<테이블명>.frm

테이블의 구조를 정의하는 파일이다

<테이블명>.MYD

데이터 파일이다.

 

- 에러 코드에 대한 에러 메세지를 보는 방법

- MySQL bin 디렉토리를 보면 perror 라는 유틸리티를 찾을 수 있다. 이 유틸리티는 MySQL
 
에러 코드에 대한 메시지를 확인할 때 사용할 수 있는 유틸리티이다. 사용 방법은 다음과 같다.

perror [
옵션] [<에러코드1> [<에러모드2>...]]

 perror 을 이용하여 몇 개의 에러 코드에 대한 메시지를 출력한 예이다.

C:\windows\system32>perror 126 127 132

MySQL error:  126 = Index file is crashed
MySQL error:  127 = Record-file is crashed
MySQL error:  132 = Old database file

 

- 테이블의 복구 과정은 다음과 같이 진행된다.

- 1 단계 : 테이블 체크

- 먼저 myisamchk *.MYI 를 실행하거나 시간이 더 있다면 myisamchk -e *.MYI 를 실행하여 어떤 테이블에 오류가 있는지 체크한다. 테이블의 오류가 체크되면 2 단계로 넘어가고, 체크가 되지 않거나
체크 도중 에러가 발생하면 3 단계로 넘어간다

- 2 단계 : 쉬우면서 안전한 복구

- 오류가 있는 테이블을 발견하였으므로 myisamchk -r -q <테이블명> 을 실행하여 빠른 복구를 실행한다.

-q 옵션을 부여하였기 때문에 데이터 파일(.MYD) 은 건드리지 않고 인덱스 파일을 복구할 것이다.
이런 식으로 계속해서 다음 테이블을 복구한다

- 그래도 복구가 되지 않으면 다음과 같이 시도한다

- 1. 데이터 파일을 백업해둔다.

- 2. myisamchk -r <테이블명> 을 실행하여 복구 모드로 복구를 실행한다. 오류가 있는 로우를  삭제하면서 새로운 인덱스 파일을 생성할 것이다.

- 3. 그래도 안되면 myisamchk --safe-recover <테이블명> 을 실행한다. 예전 버전의 복구 방법 이지만 이 옵션으로 복구될 수도 있다.

- 복구 도중 에러가 발생하면 3 단계로 넘어간다.

- 3 단계 : 어려운 복구

- 이 단계는 인덱스 파일의 처음 16K 가 손상되거나 잘못된 정보를 가지고 있을 때 혹은 인덱스 파일이 없을 때 실시하게 된다. 이러한 경우 필요에 따라 다음과 같이 인덱스 파일을 생성하도록 한다.

- 1. 데이터 파일(.MYD) 을 다른 장소로 이동한다. 복사가 아니라 이동이다.
- 2. mysql>
에 접속하여 해당 테이블을 삭제한다. TRUNCATE TABLE 문장을 사용할 것을  권장한다.
- 3.
앞서 이동시켜둔 데이터 파일을 원래 위치로 복사하자. 이 때는 이동이 아니라 복사를 시켜서  만약의 사태를 대비한다.
- 4. myisamchk -r -q <
테이블명> 을 실행하여 복구한다. .frm 파일과 .MYD 파일을 이용하여  인덱스 파일(.MYI) 이 복구될 것이다.

- 4 단계 : 매우 어려운 복구

- 이 단계는 .frm 파일마저 심하게 손상되었을 때 실행한다. 사실 최초 테이블을 생성항 이후 .frm 파일은 변경될 일이 없기 때문에 .frm 파일이 손상되는 일은 거의 발생하지 않는다.

- 이러한 경우 다음과 같은 방법으로 복구를 실시한다.

- 1.
백업해둔 파일이 있다면 백업해둔 .frm 파일을 원래 자리로 복사시키고 3 단계를 실시한다그리고 백업해둔 .MYI 파일을 원래 자리로 복사시키고 2 단계를 실시한다. 그리고 나서  마지막으로 myisamchk -r 을 실행한다.

- 2.
백업해둔 파일은 없지만 테이블의 구조를 알고 있다면 .frm 파일과 .MYI 파일은 복구할 수  있다. 먼저 다른 곳에서 새로 테이블을 생성하여 .frm .MYI 파일을 만들 수 있다. 물론  .MYD 파일은 새로 만들 수는 없을 것이다. 2 단계로 가서 기존의 .MYD 파일을 이용하여  .MYI 파일을 재구성한다.

 

'Program > MySQL' 카테고리의 다른 글

MySql 기본 폼  (0) 2007.10.11
mysql쿼리문  (0) 2007.10.03