MySQL : # 126-테이블에 대한 잘못된 키 파일


108

MySQL 쿼리에서 다음 오류가 발생했습니다.

#126 - Incorrect key file for table

이 테이블에 대한 키를 선언하지도 않았지만 인덱스가 있습니다. 누구든지 문제가 무엇인지 알고 있습니까?


3
나뿐만 아니라 전망이 얻을
Elzo Valugi

4
TMP 폴더는 일반적으로 2 기가 바이트, 그것을보고 -h df라고하려고 한계가
Elzo Valugi

a를 수행 REPAIR TABLE했지만 여전히이 기능을 사용하고 공간이 /tmp있는 경우 서버를 재부팅 할 수 있습니다.
icc97

답변:


160

이런 일이 발생할 때마다 내 경험상 전체 디스크였습니다.

편집하다

램 디스크를 구성한 경우 큰 테이블을 변경하는 것과 같은 작업을 수행 할 때 전체 램 디스크가 원인 일 수 있다는 점도 주목할 가치가 있습니다. 크기를 늘릴 수없는 경우 이러한 작업을 허용하기 위해 ramdisk 행을 임시로 주석 처리 할 수 ​​있습니다.


4
또한 약 2Gb의 여유 공간이 있으며이 오류가 발생합니다. 하지만 내 데이터베이스는 약 1.7Gb이고 데이터베이스에는 ~ 1.5M 행이있는 테이블이 있습니다. 정리 후 여유 공간이 약 3.5-4Gb이면 오류가 사라집니다.
Sergey

2
내 시스템 (Fedora 18) /tmp에는 작은 tmpfs 파일 시스템이 있고 mysql은 거기에 임시 테이블을 쓰는 공간이 부족합니다. mysql.com에tmpdir 언급 된대로 구성 변수 를 설정해야했습니다
jcbwlkr 2013

1
이것이 원인 일 수 있지만, 이것은 나에게 전체 디스크 때문이 아닙니다. 1 % 만 가득 찬 10GB에 할당 된 Amazon RDS 인스턴스에서이 오류가 발생합니다. 메모리 부족도 원인 일 수 있습니다.
Cerin 2014 년

2
tmpdir = / mysql_tmp 또는 my.cnf에있는 항목을 설정할 수 있으며 루트 파일 시스템에 있어야합니다 (크지 만 크지 만)
Kevin Parker

디스크 공간이 있지만 동일한 오류가 발생했습니다. [root @ ADM-PROD-PERCONA-SL-RP-03 percona] # df -h Filesystem Size Used Avail Use % Mounted on / dev / xvda1 7.8G 1.6G 6.1G 21 % / devtmpfs 61G 80K 61G 1 % / dev tmpfs 61G 0 61G 0 % / dev / shm / dev / md0 3.0T 1.8T 1.2T 61 % / mnt
Ashish Karpe

35

우선, 키와 인덱스가 MySQL에서 동의어라는 것을 알아야합니다. CREATE TABLE Syntax 에 대한 문서를 보면 다음을 읽을 수 있습니다.

KEY일반적으로 INDEX. 키 속성 PRIMARY KEYKEY열 정의에 지정된 경우와 같이 지정할 수도 있습니다 . 이것은 다른 데이터베이스 시스템과의 호환성을 위해 구현되었습니다.


이제 발생하는 오류의 종류는 다음 두 가지 때문일 수 있습니다.

  • MySQL 서버의 디스크 문제
  • 손상된 키 / 테이블

첫 번째 경우 쿼리에 제한을 추가하면 문제가 일시적으로 해결 될 수 있음을 알 수 있습니다. 그렇게하는 경우 tmp수행하려는 쿼리 크기에 비해 너무 작은 폴더가 있을 수 있습니다 . 그런 다음 결정하거나 tmp더 크게 만들거나 쿼리를 더 작게 만들 수 있습니다! ;)

때로는 tmp충분히 크지 만 여전히 가득 차면 이러한 상황에서 수동으로 정리해야합니다.

두 번째 경우에는 MySQL 데이터에 실제 문제가 있습니다. 데이터를 쉽게 다시 삽입 할 수 있다면 테이블을 삭제 / 다시 생성하고 데이터를 다시 삽입하는 것이 좋습니다. 할 수 없다면 REPAIR table을 사용하여 테이블을 제자리에서 복구 해 볼 수 있습니다 . 일반적으로 매우 긴 프로세스로 실패 할 수 있습니다.


다음과 같은 전체 오류 메시지 를 확인하십시오.

'FILEPATH.MYI'테이블의 키 파일이 잘못되었습니다. 그것을 고치려고

수리를 시도 할 수 있음을 메시지에 언급합니다. 또한 얻은 실제 FILEPATH를 보면 더 많은 것을 찾을 수 있습니다.

  • 만약 그렇다면 /tmp/#sql_ab34_23fMySQL은 쿼리 크기 때문에 임시 테이블을 만들어야한다는 뜻입니다. / tmp에 저장하고 / tmp에 해당 임시 테이블을위한 공간이 충분하지 않습니다.

  • 대신 실제 테이블의 이름이 포함 된 경우이 테이블이 손상되었을 가능성이 매우 높으므로이를 복구해야합니다.


문제가 / tmp 크기와 관련이 있음을 확인하는 경우 수정에 대한 유사한 질문에 대한이 답변을 읽으십시오. MySQL, 오류 126 : 테이블에 대한 잘못된 키 파일 .


16

이 지침에 따라 tmp 디렉토리를 다시 만들고 문제를 해결할 수있었습니다.

모든 파일 시스템 및 해당 디스크 사용량을 사람이 읽을 수있는 형식으로 표시합니다.

df -h

파일이 열려있는 프로세스 찾기 /tmp

sudo lsof /tmp/**/*

그런 다음 umount /tmp/var/tmp:

umount -l /tmp
umount -l /var/tmp

그런 다음 손상된 파티션 파일을 제거하십시오.

rm -fv /usr/tmpDSK

그런 다음 멋진 새 것을 만듭니다.

/scripts/securetmp

securetmp Perl 스크립트를 편집하여 직접 tmp 디렉토리의 크기를 수동으로 설정할 수 있지만 스크립트를 실행하면 서버의 tmp 디렉토리 크기가 약 450MB에서 4.0GB로 증가했습니다.


9

오류 # 126은 일반적으로 손상된 테이블이있을 때 발생합니다. 이를 해결하는 가장 좋은 방법은 수리를 수행하는 것입니다. 이 기사가 도움이 될 수 있습니다.

http://dev.mysql.com/doc/refman/5.0/en/repair-table.html


모든 키를 삭제하고 최적화했습니다. 쿼리가 너무 느리면이 오류가 발생할 수 있습니까?
브라이언

잘 모르겠지만 이해를 바탕으로이 오류는 쿼리로 인한 것이 아닙니다. 아직 수리를 시도 했습니까?
junmats 2010 년

3

전체 텍스트 인덱스의 최소 단어 길이를 기본값 4에서 2로 낮추는 ft_min_word_len = 2에서 설정하면이 오류가 발생 my.cnf합니다.

테이블을 수리하면 문제가 해결되었습니다.


이것이 처음 설정을 변경할 때만 발생하는지 아니면 최소 단어 길이가 너무 작아서 발생할 수있는 일인지 알고 있습니까?
Y0lk

1

쿼리에서 제한을 사용하십시오. @Monsters X가 말한 것처럼 전체 디스크 때문입니다.

나는 또한이 문제에 직면하고 수천 개의 레코드가 있었기 때문에 쿼리 제한으로 해결했습니다. 이제 잘 작동합니다. :)


1

나는 이것이 오래된 주제라는 것을 알고 있지만 언급 된 해결책 중 어느 것도 나를 위해 일하지 않았습니다. 나는 다른 일을했습니다.

다음을 수행해야합니다.

  1. MySQL 서비스를 중지합니다.
  2. mysql \ data 열기
  3. ib_logfile0 및 ib_logfile1을 모두 제거하십시오.
  4. 서비스 다시 시작


1

이 문제를 다음과 같이 수정했습니다.

ALTER TABLE table ENGINE MyISAM;
ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field);
ALTER TABLE table ENGINE InnoDB;

도움이 될 수 있습니다


한 단계만으로도 비슷한 문제를 해결할 수 있었으며 현재 테이블 엔진을 사용하여 테이블을 다시 작성할 수 있습니다. 즉, myisam을 사용하는 경우 다음을 사용하십시오. ALTER IGNORE TABLE table ENGINE = MyISAM;
SeanDowney 2014

1

로 이동하여 /etc/my.cnf주석 처리tmpfs

#tmpdir=/var/tmpfs

이것은 문제를 해결합니다.

다른 답변에서 제안한 명령을 실행했으며 디렉토리가 작지만 비어 있었으므로 공간이 문제가되지 않았습니다.

/var/tmp$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/vzfs              60G   51G  9.5G  85% /
none                  1.5G  4.0K  1.5G   1% /dev
tmpfs                 200M     0  200M   0% /var/tmpfs
/var/tmpfs$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/vzfs              60G   51G  9.5G  85% /
none                  1.5G  4.0K  1.5G   1% /dev
tmpfs                 200M     0  200M   0% /var/tmpfs

0

쿼리와 관련된 각 테이블에 대해 복구 명령을 실행 해보십시오.

MySQL 관리자를 사용하여 카탈로그-> 카탈로그 선택-> 테이블 선택-> 유지 관리 버튼 클릭-> 수리-> FRM 사용으로 이동합니다.


0

이제 다른 답변으로 해결되었습니다. 동일한 쿼리에서 열과 인덱스의 이름을 바꾸면 오류가 발생했습니다.

작동하지 않는:

-- rename column and rename index
ALTER TABLE `client_types`
    CHANGE `template_path` `path` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    DROP INDEX client_types_template_path_unique,
    ADD UNIQUE INDEX `client_types_path_unique` (`path` ASC);

작품 (2 개 문) :

-- rename column
ALTER TABLE `client_types`
    CHANGE `template_path` `path` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;
-- rename index
ALTER TABLE `client_types`
    DROP INDEX client_types_template_path_unique,
    ADD UNIQUE INDEX `client_types_path_unique` (`path` ASC);

이것은 MariaDB 10.0.20에있었습니다. MySQL 5.5.48에서 동일한 쿼리에 오류가 없었습니다.


0
mysql> set global sql_slave_skip_counter=1; start slave; show slave status\G

그런 다음 오류가 있습니다.

 Error 'Table './openx/f_scraper_banner_details' is marked as crashed and should be repaired' on query. Default database: 'openx'. Query: 'INSERT INTO f_scraper_banner_details(job_details_id, ad_id, client_id, zone_id, affiliateid, comments, pct_to_report, publisher_currency, sanity_check_enabled, status, error_code, report_date) VALUES (10274859, 321264, 0, 31926, 0, '', -1, 'USD', 1, 'FAILURE', 'INACTIVE_BANNER', '2016-06-28 04:00:00')'

mysql> 수리 테이블 f_scraper_banner_details;

이것은 나를 위해 일했습니다.


0

내 문제는 잘못된 쿼리에서 비롯되었습니다. SELECT에서 참조되지 않은 FROM의 테이블을 참조했습니다.

예:

   SELECT t.*,s.ticket_status as `ticket_status`
   FROM tickets_new t, ticket_status s, users u

, users u나에게 문제를 일으킨 것입니다. 그것을 제거하면 문제가 해결되었습니다.

참고로 이것은 CodeIgniter 개발 환경에있었습니다.


0

ft_min_word_len (전체 텍스트 최소 단어 길이)을 줄인 후 테이블에 쓸 때이 메시지를 받았습니다 . 이를 해결하려면 테이블을 복구하여 인덱스를 다시 만드십시오.


0

mysqlcheck -r -f -uroot -p --use_frm db_name

일반적으로 트릭을 할 것입니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.