복붙노트

[SQL] MySQL은, 오류 126 : 테이블에 대한 잘못된 키 파일

SQL

MySQL은, 오류 126 : 테이블에 대한 잘못된 키 파일

나는 관련이 다음과 같은 질문을 읽고,하지만 대답은 나를 만족하지 않았다 : MySQL이 : # 126 - 테이블에 대한 잘못된 키 파일을

쿼리를 실행할 때이 오류를 얻을 수

내가, 내가 하나 찾을 cant't 문제를 찾을려고 할 때 그래서 복구 명령으로 문제를 해결하는 방법을 모르겠어요. 나는 다른 방법으로이 문제를 일으키는 원인이되는 문제를 찾을 수있는 방법에 대한 포인터는 그때 이미 시도되어 있습니까?

mysql>       SELECT
    ->         Process.processId,
    ->         Domain.id AS domainId,
    ->         Domain.host,
    ->         Process.started,
    ->         COUNT(DISTINCT Joppli.id) AS countedObjects,
    ->         COUNT(DISTINCT Page.id)   AS countedPages,
    ->         COUNT(DISTINCT Rule.id)   AS countedRules
    ->       FROM Domain
    ->         JOIN CustomScrapingRule
    ->           AS Rule
    ->           ON Rule.Domain_id = Domain.id
    ->           LEFT JOIN StructuredData_Joppli
    ->             AS Joppli
    ->             ON Joppli.CustomScrapingRule_id = Rule.id
    ->         LEFT JOIN Domain_Page
    ->           AS Page
    ->           ON Page.Domain_id = Domain.id
    ->         LEFT JOIN Domain_Process
    ->           AS Process
    ->           ON Process.Domain_id = Domain.id
    ->       WHERE Rule.CustomScrapingRule_id IS NULL
    ->       GROUP BY Domain.id
    ->       ORDER BY Domain.host;
ERROR 126 (HY000): Incorrect key file for table '/tmp/#sql_2b5_4.MYI'; try to repair it
root@scraper:~# mysqlcheck -p scraper
Enter password: 
scraper.CustomScrapingRule                         OK
scraper.Domain                                     OK
scraper.Domain_Page                                OK
scraper.Domain_Page_Rank                           OK
scraper.Domain_Process                             OK
scraper.Log                                        OK
scraper.StructuredData_Joppli                      OK
scraper.StructuredData_Joppli_Product              OK
mysql> select count(*) from CustomScrapingRule;
+----------+
| count(*) |
+----------+
|       26 |
+----------+
1 row in set (0.04 sec)

mysql> select count(*) from Domain;
+----------+
| count(*) |
+----------+
|        2 |
+----------+
1 row in set (0.01 sec)

mysql> select count(*) from Domain_Page;
+----------+
| count(*) |
+----------+
|   134288 |
+----------+
1 row in set (0.17 sec)

mysql> select count(*) from Domain_Page_Rank;
+----------+
| count(*) |
+----------+
|  4671111 |
+----------+
1 row in set (11.69 sec)

mysql> select count(*) from Domain_Process;
+----------+
| count(*) |
+----------+
|        2 |
+----------+
1 row in set (0.02 sec)

mysql> select count(*) from Log;
+----------+
| count(*) |
+----------+
|       41 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from StructuredData_Joppli;
+----------+
| count(*) |
+----------+
|    11433 |
+----------+
1 row in set (0.16 sec)

mysql> select count(*) from StructuredData_Joppli_Product;
+----------+
| count(*) |
+----------+
|   130784 |
+----------+
1 row in set (0.20 sec)
root@scraper:/tmp# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       20G  4.7G   15G  26% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            237M  4.0K  237M   1% /dev
tmpfs            49M  188K   49M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            245M     0  245M   0% /run/shm
none            100M     0  100M   0% /run/user

해결법

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

    1.당신의 쿼리를 필요로하는 큰 중간 결과 집합을 반환하는 것 같습니다 MySQL의 임시 위치 설정을위한 임시 테이블의 생성 및 그 디스크 테이블 (/ tmp를)은 결과 임시 테이블에 큰 충분하지 않습니다.

    당신의 쿼리를 필요로하는 큰 중간 결과 집합을 반환하는 것 같습니다 MySQL의 임시 위치 설정을위한 임시 테이블의 생성 및 그 디스크 테이블 (/ tmp를)은 결과 임시 테이블에 큰 충분하지 않습니다.

    당신은 그것을 다시 마운트하여 tmpfs를 파티션의 크기를 증가 시도해 볼 수도 있습니다 :

    mount -t tmpfs -o remount,size=1G tmpfs /tmp
    

    당신은 편집을 / etc / fstab에 의한 변경 사항을 영구적으로 만들 수 있습니다

    이 작업을 수행 할 수없는 경우에는 디스크의 위치를 ​​변경 시도 할 수 일시적으로 당신의 my.cnf 파일에서 "TMPDIR"항목을 편집하여 테이블 (또는 추가 그것은이) 아직없는 경우. 기억이 디렉토리 당신 MySQL의 사용자가 쓸 수 있어야 선택

    당신은 또한 증가시켜 디스크의 임시 테이블에의 생성을 방지 시도해 볼 수도 있습니다 MySQL의 구성 옵션에 대한 값 :

    tmp_table_size
    max_heap_table_size
    

    큰 값이다. 당신은 위의 매개 변수의 양을 증가해야합니다

    예:

    set global tmp_table_size = 1G;
    set global max_heap_table_size = 1G;
    
  2. ==============================

    2.당신의 / 리눅스 파일 시스템에 마운트 TMP 경우 즉, 자주 1메가바이트에서 크기 오버 플로우로 장착

    당신의 / 리눅스 파일 시스템에 마운트 TMP 경우 즉, 자주 1메가바이트에서 크기 오버 플로우로 장착

    $ df -h
    Filesystem      Size  Used Avail Use% Mounted on
    udev            7.9G   12K  7.9G   1% /dev
    tmpfs           1.6G  348K  1.6G   1% /run
    /dev/xvda1      493G  6.9G  466G   2% /
    none            4.0K     0  4.0K   0% /sys/fs/cgroup
    none            5.0M     0  5.0M   0% /run/lock
    none            7.9G     0  7.9G   0% /run/shm
    none            100M     0  100M   0% /run/user
    overflow        1.0M  4.0K 1020K   1% /tmp               <------
    

    이 때문에 당신은 지정하지 않는 / 자신의 파티션으로 TMP 및 루트 파일 시스템이 가득하고 / tmp 디렉토리가 대체로 다시 마운트 된 것으로 보인다.

    나는 EC2 볼륨에 공간이 실행 ​​한 후이 문제에 달렸다. 나는 볼륨 크기를 조절하면, 나는 복잡한보기를 실행하는 동안 채우고 / tmp를 오버 플로우 파티션으로 달렸다.

    당신이 삭제 한 후에이 문제를 해결하려면 공간 / 크기 조정, 바로 대체 마운트를 해제하고 원래의 지점 (일반적으로 루트 파티션)에서 다시 마운트해야합니다 :

    sudo umount -l /tmp
    

    참고 : -l이 유유히 디스크를 마운트 해제합니다.

  3. ==============================

    3.여러 사람에 복잡한 쿼리를 분할하면 임시 테이블 크기를 증가 할 필요없이 빠른 것

    여러 사람에 복잡한 쿼리를 분할하면 임시 테이블 크기를 증가 할 필요없이 빠른 것

  4. ==============================

    4.내 경우에는 내가 임시 위치에서 불과 명확한 임시 파일 :

    내 경우에는 내가 임시 위치에서 불과 명확한 임시 파일 :

    의 my.ini

    TMPDIR = "D : / XAMPP / tmp를"

    그리고 그것은 나를 위해 일했습니다.

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

    5.당신은 검색 쿼리에서 사용하는 테이블을 복구해야합니다. 이 문제는 일반적으로 검색 쿼리를 발생합니다.

    당신은 검색 쿼리에서 사용하는 테이블을 복구해야합니다. 이 문제는 일반적으로 검색 쿼리를 발생합니다.

    "테이블 _"로 이동 -> 동작 -> 수리 (한 번의 클릭) 효과를 적용하는 데 다소 시간이 걸릴 수 있습니다

  6. from https://stackoverflow.com/questions/19003106/mysql-error-126-incorrect-key-file-for-table by cc-by-sa and MIT license