7.6.3 MyISAM 테이블의 복구 방법
이 단원에서는 MyISAM
테이블 (확장자 .MYI
및 .MYD
)에 myisamchk를 사용하는 방법에 대해 설명합니다.
또한 CHECK TABLE
및 REPAIR TABLE
문을 사용하여 MyISAM
테이블을 체크하고 복구 할 수 있습니다. 섹션 13.7.2.2 "CHECK TABLE 구문」 및 섹션 13.7.2.5 "REPAIR TABLE 구문" 을 참조하십시오.
손상된 테이블의 징후로 예기치 않게 중단하는 쿼리와 같은 관찰 가능한 오류가 포함됩니다.
변경에 잠겨 있습니다tbl_name
.frm파일
찾을 수 없습니다 (오류 코드 :tbl_name
.MYInnn
).예기치 않은 파일의 끝
기록 파일이 충돌했습니다
테이블 핸들러에서 오류
nnn
을 가져옵니다
오류 정보를 얻으려면, perror nnn
를 실행합니다. 여기서 nnn
은 오류 번호입니다. 다음의 예는 perror를 사용하여 테이블의 문제를 나타내는 가장 일반적인 오류 번호의 의미를 찾는 방법을 보여줍니다.
shell> perror 126 127 132 134 135 136 141 144 145
MySQL error code 126 = Index file is crashed
MySQL error code 127 = Record-file is crashed
MySQL error code 132 = Old database file
MySQL error code 134 = Record was already deleted (or record file crashed)
MySQL error code 135 = No more room in record file
MySQL error code 136 = No more room in index file
MySQL error code 141 = Duplicate unique key or constraint on write or update
MySQL error code 144 = Table is crashed and last repair failed
MySQL error code 145 = Table was marked as crashed and should be repaired
오류 135 (레코드 파일에 여유가없는) 및 오류 136 (인덱스 파일에 여유가없는)은 간단한 수리에 수정할 수있는 오류는 없습니다. 이 경우 ALTER TABLE
을 사용하여 MAX_ROWS
및 AVG_ROW_LENGTH
테이블 옵션 값을 늘려야합니다.
ALTER TABLE tbl_name
MAX_ROWS = xxx
AVG_ROW_LENGTH = yyy
;
현재의 테이블 옵션 값을 알 경우, SHOW CREATE TABLE
을 사용합니다.
기타 오류의 경우, 테이블을 복구해야합니다. myisamchk는 일반적으로 발생하는 대부분의 문제를 발견하고 수정할 수 있습니다.
복구 프로세스는 여기에 표시된 최대 4 개의 스테이지가 있습니다. 시작하기 전에 위치를 데이터베이스 디렉토리로 변경하고 테이블 파일의 권한을 확인하십시오. Unix 그럼, mysqld를 실행하는 사용자에 의해 (및 확인 파일에 액세스 할 수 있기 때문에 확인하는 사용자도) 그들이 읽을 수 있는지 확인합니다. 파일을 수정해야한다는 사실을 알게되면 그들에게 쓸 수 있어야합니다.
이 섹션에서는 테이블 체크가 실패 ( 섹션 7.6.2 "MyISAM 테이블의 오류 검사 방법" 에서 설명하고있는 것 등) 경우 또는 myisamchk가 제공하는 확장 기능을 사용하는 경우에 대해 설명합니다.
테이블 유지 보수에 사용되는 myisamchk 옵션은 섹션 4.6.3 "myisamchk - MyISAM 테이블 유지 보수 유틸리티" 에서 설명하고 있습니다. myisamchk는 성능을 향상시킬 수있는 메모리 할당을 제어하기 위해 설정할 수있는 변수도 있습니다. 섹션 4.6.3.6 "myisamchk 메모리 사용량" 을 참조하십시오.
명령 행에서 테이블을 복원하려면 먼저 mysqld 서버를 중지해야합니다. 원격 서버에서 mysqladmin shutdown을 실행하면 mysqladmin가 돌아간 후 모든 문 처리를 중지하고 모든 인덱스 변경이 디스크에 플러시 될 때까지 잠시 동안 mysqld 서버가 계속 사용할 수 있는지에주의하십시오 .
1 단계 : 테이블 점검
myisamchk * .MYI 또는 시간이 있으면 myisamchk -e * .MYI을 실행합니다. -s
(사일런트) 옵션을 사용하면 불필요한 정보를 억제합니다.
mysqld 서버가 정지하고있는 경우, --update-state
옵션을 사용하여 myisamchk에 테이블을 "확인 됨"으로 표시하도록 지시합니다.
myisamchk가 오류를보고하고있는 테이블 만 복구해야합니다. 그런 테이블의 경우 2 단계로 이동합니다.
검사 중 예기치 않은 오류 ( out of memory
에러 등)을받은 경우, 또는 myisamchk가 충돌 한 경우 3 단계로 이동합니다.
2 단계 : 쉽고 안전한 복구
우선 myisamchk -r -q tbl_name
을 시도합니다 ( -r -q
는 "빠른 복구 모드"를 의미합니다). 이것은 데이터 파일에 액세스하지 않고 인덱스 파일을 복구하려고합니다. 데이터 파일에 필요한 모든 것이 포함 삭제 링크가 데이터 파일의 올바른 위치를 가리키고 있다면, 이것은 기능하는 것이며, 테이블이 수정됩니다. 다음 테이블의 복구를 시작합니다. 그렇지 않으면 다음 단계를 사용합니다.
계속하기 전에 데이터 파일의 백업을 만듭니다.
myisamchk -r
tbl_name
을 사용합니다 (-r
은 "복구 모드"를 의미합니다). 따라서 잘못된 행 삭제 된 행이 데이터 파일에서 삭제되어 인덱스 파일이 재 구축됩니다.앞서의 단계가 실패 할 경우, myisamchk --safe-Recover
tbl_name
을 사용합니다. 안전한 복구 모드에서 정상 복구 모드에서 처리되지 않는 경미한 사건을 처리하는 오래된 복구 방법을 사용합니다 (그러나 느려집니다).
복구 작업을 상당히 빠르게하는 경우 sort_buffer_size
와 key_buffer_size
변수의 값을 각각 myisamchk를 실행할 때 사용 가능한 메모리의 약 25 %로 설정하십시오.
복구시 예기치 않은 오류 ( out of memory
에러 등)을받은 경우 또는 myisamchk가 충돌 한 경우 3 단계로 이동합니다.
3 단계 : 어려운 복구
이 단계에 도달하는 것은 인덱스 파일의 첫 번째 16K 바이트의 블록이 손상되었거나 잘못된 정보가 포함되어있는 경우, 또는 인덱스 파일이 손실 된 경우에 한정되어야합니다. 이 경우 새 인덱스 파일을 작성해야합니다. 다음과 같이 실행합니다.
데이터 파일을 안전한 장소로 이동합니다.
테이블 설명 파일을 사용하여 새 (빈) 데이터 파일과 인덱스 파일을 만듭니다.
shell>
mysql
mysql>db_name
SET autocommit=1;
mysql>TRUNCATE TABLE
mysql>tbl_name
;quit
오래된 데이터 파일을 새로 만든 데이터 파일에 복사합니다. (이전 파일을 새 파일에 단순히 이동하지 마십시오. 뭔가 이상이있는 경우에 대비해 복사본을 보관해야합니다.)
복제를 사용하는 경우, 거기에는 파일 시스템 작업을 포함, 이들은 MySQL에 의해 기록되지 않기 때문에 위의 절차를 수행하기 전에 그만하십시오.
2 단계로 돌아갑니다. myisamchk -r -q가 기능 할 것입니다. (이것은 무한 루프가되지 않을 것입니다.)
전체 과정을 자동으로 실행하는 REPAIR TABLE
SQL 문을 사용 할 수 있습니다. tbl_name
USE_FRMREPAIR TABLE
을 사용하면 서버가 모든 작업을 수행하는 유틸리티와 서버 간의 불필요한 상호 작용의 가능성도 없습니다. 섹션 13.7.2.5 "REPAIR TABLE 구문" 을 참조하십시오.
4 단계 : 매우 어려운 복구
.frm
설명 파일도 충돌하는 경우에만이 단계에 도달하는 것입니다. 설명 파일은 테이블이 작성된 후에 변경되지 않기 때문에 이런 문제가 발생하지 않을 것입니다.
백업에서 설명 파일을 복원하고 3 단계로 돌아갑니다. 인덱스 파일을 복원하고 2 단계로 돌아갈 수 있습니다. 후자의 경우, myisamchk -r로 시작하십시오.
백업이 없지만, 테이블을 만드는 방법을 정확하게 알고있는 경우는 다른 데이터베이스에 테이블의 복사본을 만듭니다. 새로운 데이터 파일을 삭제하여 다른 데이터베이스에서
.frm
설명 파일과.MYI
인덱스 파일을 충돌 한 데이터베이스로 이동합니다. 이렇게하면 새로운 설명 파일과 인덱스 파일을 얻을 수 있지만,.MYD
데이터 파일은 그대로 남아 있습니다. 2 단계로 돌아 인덱스 파일의 재 구축을 시도합니다.