関連性のある次の質問を読みましたが、返信は私を満足させませんでした: MySQL:#126-テーブルの不正なキーファイル
クエリを実行すると、このエラーが発生します
エラー126(HY000):テーブルのキーファイルが正しくありません `
問題を見つけようとしても、見つけられないので、repairコマンドで修正する方法がわかりません。他の方法でこの問題を引き起こしている問題を見つける方法へのポインタはありますか?
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
クエリが一時テーブルの作成を必要とする大きな中間結果セットを返し、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;
私の場合、一時的な場所から一時ファイルを消去するだけです:
my.ini
tmpdir = "D:/ xampp/tmp"
そしてそれは私のために働いた。
複雑なクエリを複数のクエリに分割すると、一時テーブルのサイズを増やす必要がなくなり、より高速になります。
Linuxファイルシステム上の/tmp
マウントがオーバーフローとしてマウントされ、多くの場合1MBのサイズの場合
$ 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
は、ディスクを遅延してアンマウントします。