MySQLのエラー『Incorrect Key File for Table』の解決方法

MySQLのエラー『Incorrect Key File for Table』の解決方法

「Incorrect Key File for Table」というエラーは、MySQLが一時的な操作に使うテーブルファイルを作成・操作できないときに発生する。典型的には、ディスク容量不足、ファイルシステムの制限、一時テーブルサイズの上限超過、もしくは破損したMyISAMテーブルが関与している。特に、大量のデータをJOINやORDER BYなどで扱うときにこのエラーが表れる。

1. エラーの発生条件と再現例

このエラーは、内部で生成される一時テーブルがメモリ内で処理しきれず、ディスクに書き出されるときに発生する。

SELECT * FROM orders o
JOIN customers c ON o.customer_id = c.id
ORDER BY o.created_at DESC;

このようなクエリにおいて、ディスクにあるテンポラリファイル `/tmp/#sql_*` にアクセスできない、または破損している場合に発生する。

2. エラーメッセージの例

ERROR 1034 (HY000): Incorrect key file for table '/tmp/#sql_abc_1.MYI'; try to repair it

このメッセージが表示された場合、まず疑うべきはテンポラリディレクトリ(通常は /tmp)に関する問題。

3. /tmp ディレクトリの容量確認

一時ファイルが書き出される `/tmp` ディレクトリの空き容量が足りないとエラーになる。

df -h /tmp

空き容量が少ない場合は、ログファイル削除や別パーティションへの移行が必要。

4. tmpdir の変更で回避

MySQLのテンポラリファイル保存先を別ディレクトリに変更し、容量不足を回避する。

[mysqld]
tmpdir=/var/mysqltmp

変更後にディレクトリ作成と権限付与が必要。

sudo mkdir /var/mysqltmp
sudo chown mysql:mysql /var/mysqltmp
sudo systemctl restart mysqld

5. 一時テーブルサイズの設定見直し

一時テーブルがメモリ内で処理される最大サイズに制限があり、それを超えるとディスクにスワップされる。

SHOW VARIABLES LIKE 'tmp_table_size';
SHOW VARIABLES LIKE 'max_heap_table_size';

推奨は以下のように両方を同じ値に設定し、サイズを増加させる。

SET GLOBAL tmp_table_size = 256*1024*1024;
SET GLOBAL max_heap_table_size = 256*1024*1024;

6. MyISAMテーブルの破損

MyISAMを使用している場合、テーブルが破損しているとエラーが出ることがある。

REPAIR TABLE your_table;

InnoDBを使用することで、こうした破損リスクを低減できる。

ALTER TABLE your_table ENGINE=InnoDB;

7. OSのファイル数制限(ulimit)確認

システムが開けるファイル数に制限があると、一時ファイル作成に失敗する。

ulimit -n
# 必要に応じて増加
ulimit -n 65536

永続化したい場合は `/etc/security/limits.conf` を変更。

8. 一時ファイルの手動削除

クラッシュや強制終了後に残るゴミ一時ファイルが干渉することがある。

sudo find /tmp -name 'sql_*' -delete

9. ファイルシステムの制限

一時ファイルのサイズがファイルシステムの制限(例:FAT32は最大4GB)を超える場合、書き込みに失敗する。

df -T /tmp

ext4やxfsなど制限の緩いファイルシステムが推奨。

10. テーブル構造の見直し

JOINやORDER BYで無駄に大きな中間テーブルが作られていないか確認し、インデックス設計を見直す。

EXPLAIN SELECT * FROM orders o
JOIN customers c ON o.customer_id = c.id
ORDER BY o.created_at DESC;

インデックスが欠けていると、MySQLは巨大な一時テーブルを作成してしまう。

11. MySQLのバージョンを確認

一部のバージョンでは、テンポラリファイル処理周りにバグが存在することがある。

mysql --version

可能であれば、安定した最新版へのアップグレードを検討。