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
可能であれば、安定した最新版へのアップグレードを検討。
-
前の記事
PHPのエラー『Warning: Function Argument Not Passed by Reference』の解決方法 2025.05.23
-
次の記事
java 配列のサイズを取得する 2025.05.25
コメントを書く