사이트 내 전체검색
[MySQL]Table 손상 및 복구
로빈아빠
https://cmd.kr/server/1102 URL이 복사되었습니다.

본문

[출처] : http://webtech.tistory.com/40

 

MySQL을 운영하다보면 여러가지 이유로 Table에 손상을 입어 MySQL을 사용할 수 없을 때가 종종 발생한다.
참 당황스럽기도 하고, 처음 접할때는 눈앞이 노랗게 보이기도 한다.
그렇지만 무엇보다 중요한 것은 침착함이다.
경험을 할수록 침착해지고 잘 대처 할 수 있어 지기는 하지만...가능하면 일어나지 말았으면 하는 일이다.

이런 일에 대처하기 위해
1. 왜 Table이 문제가 생기는지?
2. 어떻게 복구해야 하는지?
3. 어떻게 예방해야 하는지?

알아보고자 한다.


1. Table(MyISAM) 손상이 발생하는 원인

 MyISAM Table은 SQL문장이 리턴 되기전에 모두 기록되기 때문에 믿을만 하다고 mysql.com에서는 밝히고 있으며 다음과 같은 이유로 문제가 발생 할 수 있다고 한다.

1) 기록(write)되는 중간에 mysqld이 죽었을 때.

2) 갑작스럽게(의도하지 않은) 컴퓨터가 shutdown 되었을 때.

3) 하드웨어 오류

4) 외부프로그램에 의해 Table을 변경하는 동시에 서버에 의해 변경작업이 이뤄질 때.

5) MySQL이나 MyISAM코드의 버그.


전형적인 증세는 다음과 같다.

1) Table로 부터 데이터를 Select할때 아래와 같은 error가 발생.
    Incorrect key file for table: '...'. Try to repair it

2) rows를 찾을 수 없거나 불완전한 결과를 반환.




2. 어떻게 복구해야 하는지?


 MyISAM Table의 상태는 CHECK TABLE 쿼리로 확인 할 수 있으며, REPAIR TABLE로 깨진(corrupted) MyISAM Table을 복구 할 수 있다. 만약 mysqld이 실행중이지 않다면, myisamchk명령어를 사용해 check와 복구를 할 수 있다.

자세한 정보는 아래 링크를 참조하기 바란다.
http://dev.mysql.com/doc/refman/6.0/en/check-table.html
http://dev.mysql.com/doc/refman/6.0/en/repair-table.html
http://dev.mysql.com/doc/refman/6.0/en/myisamchk.html


 myisamchk는 repair table와 check table을 사용하는 것 보다 빠른 속도를 제공하지만 몇가지 주의를 해야 한다.
myisamchk는 반드시 mysqld을 죽이거나 해당 Table에 Lock을 걸어놓고 실행해야 한다. 그리고 Lock을 건 경우 반드시 Lock을 다시 풀어주어야 한다.

쿼리(repair table와 check table)에 의한 체크와 복구는 위의 링크를 통해 쉽게 이해 할 수 있으므로 여기에서는 myisamchk를 이용한 복구에 대해서 알아보고자 한다.

 myisamchk는 database의 table들의 정보를 가져오거나 체크(check), 복구(repair), 최적화(optimize)등을 할 수 있는 유틸리티이다. 이는 MyISAM Table에서만 사용이 가능하고, Patition Table에서의 사용은 지원하지 않는다.
(Table들은 각각 .MYD와 .MYI파일을 가지며, 각각 데이터와 인덱스를 위한 파일이다.)

사용법
shell> myisamchk [options] tbl_name ...

옵션에 대해서는 myisamchk --help를 통해 알 수 있다.
tbl_name은 체크나 복구를 원하는 Table의 이름이다.

가장 간단한 사용법은 정보를 보는 다음과 같은 명령이다.

shell> myisamchk user
Checking MyISAM file: user
Data records:       8   Deleted blocks:       0
- check file-size
- check record delete-chain
- check key delete-chain
- check index reference
- check data record references index: 1
- check record links


shell> myisamchk -d user
MyISAM file:         user
Record format:       Packed
Character set:       latin1_swedish_ci (8)
Data records:                    8  Deleted blocks:                 0
Recordlength:                  344
table description:
Key  Start  Len  Index    Type
1     1       180   unique  char packed stripped 
      181     48               char stripped     

아무런 옵션이 없으면 기본적으로 대상 Table을 check한다.
-d 옵션은 Table의 간략한 정보를 출력하라는 의미이다.

[myisamchk -d user]는 [myisamchk -d user.MYI]로 하는 것과 동일하다.

이는 하나의 Table을 대상으로 할때 Table의 이름만 써도 되는 것을 의미 한다. 여러개의 테이블을 함께 체크하기 위해서는 
myisamchk -d *.MYI
와 같은 형식으로 사용하면 된다. 물론 다른 디렉토리에 파일이 있다면 경로를 적어 주어야 한다.


주의 할 사항을 위에서도 잠시 언급하였지만 다시 한번 아래와 같이 정리를 하고자 한다.

주의 : 
 myisamchk가 동작하는 동안 Table을 사용하는 다른 프로그램(주로 mysqld)이 있어서는 안된다. 즉, myisamchk가 동작하는 동안는 누구도 그 Table에 접근하지 않는 것이 좋다는 것이다. MySQL server를 종료하거나 모든 Table들을 Lock을 거는 것이 가장 좋다.
 간혹, myisamchk가 동작중에 다음과 같은 error가 발생할때가 있다.
warning: clients are using or haven't closed the table properly

이는 다른 프로그램에 의해 아직 파일이 닫히지 않았거나 닫기 없이 죽었을 때 그 Table을 대상으로 myisamchk를 돌렸다는 의미이다. 때때로 이런 것들이 MyISAM Table을 손상시키기도 한다. 
만약 mysqld가 동작중이라면, Table의 변경사항이 없도록 하거나, 메모리에 있는 버퍼를 FLUSH TABLES를 사용해 비워 주어야 한다.
그러나 myisamchk를 이용해 check만을 할 경우 가장 쉬운 방법은 mysql내에서 CHECK TABLE을 사용하는 것이다.

다음은 myisamchk의 옵션들이다.

Table 4.9. myisamchk Option Reference

FormatConfig FileDescriptionIntroduction
--analyzeanalyzeAnalyze the distribution of key values 

댓글목록

등록된 댓글이 없습니다.

1,139 (6/23P)

Search

Copyright © Cmd 명령어 3.138.105.4