복붙노트

[SQL] tmp를 테이블에 대한 MySQL의 잘못된 키 파일 만들기 여러 조인

SQL

tmp를 테이블에 대한 MySQL의 잘못된 키 파일 만들기 여러 조인

나는 종종 도움을 여기에 오지 않는하지만 난 꽤 이것에 의해 좌절 그리고 난 누군가가 그것을 전에 발생했습니다 기대하고있다.

좀 더 사용하여 테이블에서 레코드를 가져 오기 위해 시도 할 때마다 하나는 내가이 오류가 가입보다 :

#126 - Incorrect key file for table '/tmp/#sql_64d_0.MYI'; try to repair it

이 쿼리는 오류가 발생합니다 그래서 :

SELECT * FROM `core_username`
INNER JOIN `core_person` ON (`core_username`.`person_id` = `core_person`.`id`)
INNER JOIN `core_site` ON (`core_username`.`site_id` = `core_site`.`id`)
ORDER BY `core_username`.`name` ASC LIMIT 1

그러나이 사람은하지 않습니다 :

SELECT * FROM `core_username`
INNER JOIN `core_person` ON (`core_username`.`person_id` = `core_person`.`id`)
ORDER BY `core_username`.`name` ASC LIMIT 1

그리고 어느 쪽이 한 것입니다 :

SELECT * FROM `core_username`
INNER JOIN `core_site` ON (`core_username`.`site_id` = `core_site`.`id`)
ORDER BY `core_username`.`name` ASC LIMIT 1

이 문제의 원인은 무엇입니까? 나는 정말 TMP 테이블을 수리에 대해 이동하지만 새로운 tmp를 테이블마다 같이 정말 그게 문제라고 생각하지 않는 방법을 모르겠어요. 사용자 이름 테이블 (지금 233718 개 기록) 상당히 큰하지만 나는 그것과 아무 상관이있다 의심한다.

어떤 도움이 많이 주시면 감사하겠습니다.

업데이트 : 몇 가지 추가 테스트 후, 내가 결과를 정렬 할 때 오류 만 발생하는 것으로 보인다. 즉,이 쿼리는 내가 기대 내게 줄 것이다 :

SELECT * FROM `core_username`
INNER JOIN `core_person` ON (`core_username`.`person_id` = `core_person`.`id`)
INNER JOIN `core_site` ON (`core_username`.`site_id` = `core_site`.`id`)
LIMIT 1

하지만 난을 추가하는 경우 :

ORDER BY `core_username`.`name` ASC

오류가 트리거됩니다. 내가 현재 사용하고 웹 서버에만 특정에 일어나고있다. 나는 데이터베이스를 다운로드 및 로컬 호스트뿐만 아니라 다른 서버에 같은 일을하려고하면 그것을 잘 실행됩니다. MySQL의 버전은 5.0.77입니다.

이 알고 내가 무엇 일어나고있는 것은이 블로그 게시물에 설명 된대로 작성되는 TMP 테이블이 너무 크고 MySQL의 초크 있다는 것을 매우 확신합니다. 난 아직 확실하지 솔루션이 어떻게 될지, 그래도입니다 ...

해결법

  1. ==============================

    1.때때로 때이 오류가 임시 테이블에 발생합니다

    때때로 때이 오류가 임시 테이블에 발생합니다

    #126 - Incorrect key file for table '/tmp/#sql_64d_0.MYI'; try to repair it
    

    / tmp를 폴더에 공간이 실행되고 있기 때문에이 될 수 있습니다. 일부 Linux 설치에, / tmp를 자체 파티션에 있고 많은 공간이없는 - 큰 MySQL의 쿼리를 채울 것입니다.

    당신은 \ tmp에 별도의 파티션에 있는지 여부를 확인하기 위해 DF -h를 사용할 수 있으며, 얼마나 많은 공간하면 할당된다.

    그것의 자신의 파티션에 공간이 부족하면 다음 중 하나를 수행 할 수 있습니다

    (가) 수정 / tmp를 그래서 그 parition은 (재 할당하거나 주 파티션으로 이동하여 중 - 예를 들어, 여기 참조) 더 공간이 있는지  (b)는 서로 다른 파티션에 다른 임시 폴더를 사용할 수 있도록 예컨대, MySQL은의 구성을 변경 의 / var / tmp를

  2. ==============================

    2.쿼리를 실행하는 동안 큰 테이블로 작업 할 때이 매크로 블럭의 수백을 먹을 수있는 사용 가능한 공간 (귀하의 경우 / tmp를) TMPDIR 당신의 MySQL을 확인하십시오. 이런 식으로 뭔가가 나를 위해 일한 :

    쿼리를 실행하는 동안 큰 테이블로 작업 할 때이 매크로 블럭의 수백을 먹을 수있는 사용 가능한 공간 (귀하의 경우 / tmp를) TMPDIR 당신의 MySQL을 확인하십시오. 이런 식으로 뭔가가 나를 위해 일한 :

    $ while true; do df -h /tmp; sleep .5; done
    
  3. ==============================

    3.이 실행

    이 실행

    REPAIR TABLE `core_username`,`core_site`,`core_person`;
    

    또는이 작업을 수행 :

    select * from (
     SELECT * FROM `core_username`
     INNER JOIN `core_person` ON (`core_username`.`person_id` = `core_person`.`id`)
     INNER JOIN `core_site` ON (`core_username`.`site_id` = `core_site`.`id`)
     LIMIT 1)
    ORDER BY `name` ASC
    
  4. ==============================

    4.당신은 "TABLE 분석"을 실행 찾을 수 있습니다.

    당신은 "TABLE 분석"을 실행 찾을 수 있습니다.

    우리는이 문제가 갑자기 큰 테이블 (~ 100M 행)에 표시했고, MySQL은 TMP가 ~ 600M로 제한으로 / 실패 1기가바이트 이상의 임시 테이블을 작성하는 / tmp를 사용하려고했습니다.

    이것은 InnoDB의 테이블에 대한 통계가 오히려 부실 있다고 밝혀졌다. 실행 한 후, "... 표 분석"통계가 업데이트되었고, 문제는 클리어. 더 정확한 통계로, MySQL은 제대로 쿼리를 최적화 할 수 있었고 큰 tmp 파일이 더 이상 필요하지 않았다.

    우리는 지금 모든 테이블 통계 신선한을 유지하기 위해 정기적으로 "mysqlcheck의 -Aa"실행합니다.

  5. ==============================

    5.나는 500K + 기록했다 테이블에 대한 쿼리와 함께이 문제를 가지고 있었다. 그것은 확인에 거의 있었다 / tmp 디렉토리에 .MYI 파일을 가리키는 나에게 오류의 똑같은 유형을주고 있었다. 난 이미 /etc/my.cnf에 파일에 힙 및 임시 파일 크기를 증가했다.

    나는 500K + 기록했다 테이블에 대한 쿼리와 함께이 문제를 가지고 있었다. 그것은 확인에 거의 있었다 / tmp 디렉토리에 .MYI 파일을 가리키는 나에게 오류의 똑같은 유형을주고 있었다. 난 이미 /etc/my.cnf에 파일에 힙 및 임시 파일 크기를 증가했다.

    쿼리의 문제는 참으로 오류없이 쿼리 작업을했다 생략, 마지막에 ORDER 절을 포함 않았다이었다. 또한 한계가 있었다. 나는 테이블에서 가장 최근의 5 개 기록을 볼려고 노력했다. 주문 절이 포함으로 숨 막혀하고 오류를 주었다.

    무슨 일이 벌어지고 무엇 mysqld가 순서를 적용하는 거대한 테이블의 모든 레코드와 내부 임시 테이블을 생성 하였다.

    나는이 문제를 가지고 있다는 방법은 추가로 적용하는 것입니다 WHERE 조건 일부 작은 세트에 거대한 테이블에서 레코드를 제한. 나는 편리에서 필터링을 할 수있는 날짜 필드를했다.

    난 그 사람을 도움이되기를 바랍니다.

  6. ==============================

    6.유닉스에서 MySQL은 임시 파일을 저장하는 디렉토리의 경로 이름으로 TMPDIR 환경 변수의 값을 사용합니다. TMPDIR이 설정되지 않은 경우, MySQL은 보통 / tmp 디렉토리 인 / var / tmp를, 또는은 / usr / tmp에있는 시스템 기본을 사용합니다.

    유닉스에서 MySQL은 임시 파일을 저장하는 디렉토리의 경로 이름으로 TMPDIR 환경 변수의 값을 사용합니다. TMPDIR이 설정되지 않은 경우, MySQL은 보통 / tmp 디렉토리 인 / var / tmp를, 또는은 / usr / tmp에있는 시스템 기본을 사용합니다.

    윈도우, NetWare 및 OS2에서 위해 MySQL의 체크 TMPDIR, TEMP 및 TMP 환경 변수의 값. 첫 번째는 설정 될 것으로를 들어, MySQL은 그것을 사용하고 그 나머지를 확인하지 않습니다. \ WINDOWS \ TEMP : TMPDIR, TEMP 또는 TMP의 아무것도 설정하지 않으면, MySQL은 보통 C 인 Windows 시스템 기본값을 사용합니다.

    임시 파일 디렉토리를 포함하는 파일 시스템이 너무 작 으면, 당신은 충분한 공간이있는 파일 시스템의 디렉토리를 지정 mysqld를에 --tmpdir 옵션을 사용할 수 있습니다.

    5.0에서 --tmpdir 옵션은 라운드 로빈 방식에서 사용되는 여러 가지 경로리스트로 설정할 수 있습니다. 윈도우, NetWare 및 OS / 2, 유닉스 및 세미콜론 문자 ( "") : 경로는 콜론 문자 ( "")로 구분해야합니다.

  7. ==============================

    7.저도 같은 문제가 발생합니다.

    저도 같은 문제가 발생합니다.

    여기 내 솔루션입니다 : 1. 그나마 사용 "을 선택 *". 그냥 당신이 필요 필드를 선택합니다. 2. 분할 쿼리. 선택한 필드가 너무 많은 경우, 일부 쿼리에 대한 분할이 결과가 될 수 있습니다. 당신은 "array_merge ()"할 수있는 결과 나중에되지 변경 결과를 포함하는 변수를 원하는 경우.

    내 경우에, 나는 5 개 쿼리는 PHP를 사용하여 다음 배열 병합에 쿼리를 분할합니다.

    문제는 MySQL 서버에 거짓말입니다. 이 응용 프로그램 개발자 (예 : 우리 나) 수행을하지 previlege을 가지고 단지 것입니다.

  8. ==============================

    8.나는 비슷한 문제가 있었다. 내 자신의 경우, 문제점은 잘못된 소유자 / 허가에 발생했습니다. 난 그냥 MySQL의 사용자에게 내 데이터 디렉토리의 소유자를 변경했고,이 문제를 해결.

    나는 비슷한 문제가 있었다. 내 자신의 경우, 문제점은 잘못된 소유자 / 허가에 발생했습니다. 난 그냥 MySQL의 사용자에게 내 데이터 디렉토리의 소유자를 변경했고,이 문제를 해결.

  9. ==============================

    9.MySQL은 쿼리, 거기에 공간이 없기 때문에 만, 파일의 tmp를 증가 ...

    MySQL은 쿼리, 거기에 공간이 없기 때문에 만, 파일의 tmp를 증가 ...

    mount -o remount,size=[NEW MAX SIZE HERE] tmpfs /tmp
    

    링크 참조 :

    일반 오류 : 테이블 '/tmp/#sql_254c_0.MYI'126 잘못된 키 파일; 수리하려고

    [ERROR]은 / usr / sbin에 / mysqld를 표 '/mysqltmp/#sql_ca1a_0.MYI'잘못된 키 파일; 수리하려고

    / tmp를 파티션 크기를 증가하는 방법

  10. ==============================

    10.3 개 테이블 중 하나에 대한 인덱스 키는 3 개 테이블에 복구 명령을 실행 해보십시오, 나쁜 수 있습니다.

    3 개 테이블 중 하나에 대한 인덱스 키는 3 개 테이블에 복구 명령을 실행 해보십시오, 나쁜 수 있습니다.

  11. ==============================

    11.(가) 키워드 EXPLAIN 사용하는 것은 최선의 방법을 최적화이 쿼리를 찾는 데 도움이 될 수 있습니다. 기본적으로, 당신이해야 할 것은 가능한 한 빨리 가능한 한 작게 결과 세트를 얻을 수있다. 당신이 끝날 때까지 core_username의 모든 행의 결과 세트가있는 경우, 당신이 그것을 주문 때의 ...이 위험을 실행합니다.

    (가) 키워드 EXPLAIN 사용하는 것은 최선의 방법을 최적화이 쿼리를 찾는 데 도움이 될 수 있습니다. 기본적으로, 당신이해야 할 것은 가능한 한 빨리 가능한 한 작게 결과 세트를 얻을 수있다. 당신이 끝날 때까지 core_username의 모든 행의 결과 세트가있는 경우, 당신이 그것을 주문 때의 ...이 위험을 실행합니다.

    당신은 문제없이 core_username 만에 주문을 할 수 있다면, 당신은 하위 쿼리로 분 () 행을 얻을 수 있습니다.

  12. from https://stackoverflow.com/questions/2090073/mysql-incorrect-key-file-for-tmp-table-when-making-multiple-joins by cc-by-sa and MIT license