MySQL 쿼리에서 다음 오류가 발생했습니다.
#126 - Incorrect key file for table
이 테이블에 대한 키를 선언하지도 않았지만 인덱스가 있습니다. 누구든지 문제가 무엇인지 알고 있습니까?
REPAIR TABLE
했지만 여전히이 기능을 사용하고 공간이 /tmp
있는 경우 서버를 재부팅 할 수 있습니다.
MySQL 쿼리에서 다음 오류가 발생했습니다.
#126 - Incorrect key file for table
이 테이블에 대한 키를 선언하지도 않았지만 인덱스가 있습니다. 누구든지 문제가 무엇인지 알고 있습니까?
REPAIR TABLE
했지만 여전히이 기능을 사용하고 공간이 /tmp
있는 경우 서버를 재부팅 할 수 있습니다.
답변:
이런 일이 발생할 때마다 내 경험상 전체 디스크였습니다.
편집하다
램 디스크를 구성한 경우 큰 테이블을 변경하는 것과 같은 작업을 수행 할 때 전체 램 디스크가 원인 일 수 있다는 점도 주목할 가치가 있습니다. 크기를 늘릴 수없는 경우 이러한 작업을 허용하기 위해 ramdisk 행을 임시로 주석 처리 할 수 있습니다.
/tmp
에는 작은 tmpfs 파일 시스템이 있고 mysql은 거기에 임시 테이블을 쓰는 공간이 부족합니다. mysql.com에tmpdir
언급 된대로 구성 변수 를 설정해야했습니다
우선, 키와 인덱스가 MySQL에서 동의어라는 것을 알아야합니다. CREATE TABLE Syntax 에 대한 문서를 보면 다음을 읽을 수 있습니다.
KEY
일반적으로INDEX
. 키 속성PRIMARY KEY
은KEY
열 정의에 지정된 경우와 같이 지정할 수도 있습니다 . 이것은 다른 데이터베이스 시스템과의 호환성을 위해 구현되었습니다.
이제 발생하는 오류의 종류는 다음 두 가지 때문일 수 있습니다.
첫 번째 경우 쿼리에 제한을 추가하면 문제가 일시적으로 해결 될 수 있음을 알 수 있습니다. 그렇게하는 경우 tmp
수행하려는 쿼리 크기에 비해 너무 작은 폴더가 있을 수 있습니다 . 그런 다음 결정하거나 tmp
더 크게 만들거나 쿼리를 더 작게 만들 수 있습니다! ;)
때로는 tmp
충분히 크지 만 여전히 가득 차면 이러한 상황에서 수동으로 정리해야합니다.
두 번째 경우에는 MySQL 데이터에 실제 문제가 있습니다. 데이터를 쉽게 다시 삽입 할 수 있다면 테이블을 삭제 / 다시 생성하고 데이터를 다시 삽입하는 것이 좋습니다. 할 수 없다면 REPAIR table을 사용하여 테이블을 제자리에서 복구 해 볼 수 있습니다 . 일반적으로 매우 긴 프로세스로 실패 할 수 있습니다.
다음과 같은 전체 오류 메시지 를 확인하십시오.
'FILEPATH.MYI'테이블의 키 파일이 잘못되었습니다. 그것을 고치려고
수리를 시도 할 수 있음을 메시지에 언급합니다. 또한 얻은 실제 FILEPATH를 보면 더 많은 것을 찾을 수 있습니다.
만약 그렇다면 /tmp/#sql_ab34_23f
MySQL은 쿼리 크기 때문에 임시 테이블을 만들어야한다는 뜻입니다. / tmp에 저장하고 / tmp에 해당 임시 테이블을위한 공간이 충분하지 않습니다.
대신 실제 테이블의 이름이 포함 된 경우이 테이블이 손상되었을 가능성이 매우 높으므로이를 복구해야합니다.
문제가 / tmp 크기와 관련이 있음을 확인하는 경우 수정에 대한 유사한 질문에 대한이 답변을 읽으십시오. MySQL, 오류 126 : 테이블에 대한 잘못된 키 파일 .
이 지침에 따라 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로 증가했습니다.
오류 # 126은 일반적으로 손상된 테이블이있을 때 발생합니다. 이를 해결하는 가장 좋은 방법은 수리를 수행하는 것입니다. 이 기사가 도움이 될 수 있습니다.
전체 텍스트 인덱스의 최소 단어 길이를 기본값 4에서 2로 낮추는 ft_min_word_len = 2
에서 설정하면이 오류가 발생 my.cnf
합니다.
테이블을 수리하면 문제가 해결되었습니다.
이 문제를 다음과 같이 수정했습니다.
ALTER TABLE table ENGINE MyISAM;
ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field);
ALTER TABLE table ENGINE InnoDB;
도움이 될 수 있습니다
table
ENGINE = MyISAM;
로 이동하여 /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
이제 다른 답변으로 해결되었습니다. 동일한 쿼리에서 열과 인덱스의 이름을 바꾸면 오류가 발생했습니다.
작동하지 않는:
-- 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에서 동일한 쿼리에 오류가 없었습니다.
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;
이것은 나를 위해 일했습니다.