MySQLのエラー『エラー126:Index File is Crashed』の解決方法

MySQLのエラー『エラー126:Index File is Crashed』の解決方法

MySQLで「エラー126:Index file is crashed」メッセージが出る場合、MyISAMストレージエンジンで管理されているテーブルのインデックスファイル(`.MYI`ファイル)が破損している。これはサーバーの異常終了、ハードディスクの不良、または過剰な書き込み負荷などで発生しやすい。

1. エラー内容の例

ERROR 126 (HY000): Index file is crashed and should be repaired

2. 発生条件

  • MyISAMエンジンを使っているテーブルで発生
  • サーバーの強制終了、電源断などで不正終了した
  • ディスクの不良で`.MYI`ファイルに破損が発生
  • 不正なデータ操作やバグによる影響

3. エンジン確認方法(MyISAMかどうか)

SHOW TABLE STATUS WHERE Name = 'your_table_name';

「Engine」列が「MyISAM」であれば対象となる。

4. 修復コマンド(REPAIR TABLE)

最も基本的な修復方法は、REPAIR TABLEコマンドを使用する。

REPAIR TABLE your_table_name;

修復が成功すれば、再度操作が可能になる。

5. myisamchkを使った修復(停止中のMySQLに対して)

MySQLが停止している状態で、myisamchkを直接使って修復を行う。

myisamchk -r /var/lib/mysql/your_database/your_table_name.MYI

修復オプションの意味:

  • -r: 通常の修復
  • -o: 再構築モード(より慎重な修復)
  • –backup: 修復前にバックアップを作成

6. 念のためのバックアップ

修復操作の前には、以下のようにテーブルのファイルをバックアップしておくことが望ましい。

cp /var/lib/mysql/your_database/your_table_name.* /backup/location/

7. 修復の確認

修復後、以下のコマンドでテーブルの整合性を確認できる。

CHECK TABLE your_table_name;

8. エンジンをInnoDBに変更する検討

MyISAMはインデックス破損に弱いため、InnoDBに変更することで障害に強くなる。

ALTER TABLE your_table_name ENGINE=InnoDB;

InnoDBはトランザクション対応、クラッシュリカバリ機能あり。

9. 自動修復設定の活用(MyISAM限定)

MySQLの設定ファイルに以下を追加すると、起動時に自動で破損を検知して修復できる。

[mysqld]
myisam-recover-options=FORCE,QUICK

10. 破損を防ぐための対策

  • 不意のシャットダウンを防ぐ(UPSなどの導入)
  • MyISAMではなくInnoDBの利用を検討
  • 定期的なバックアップとCHECK TABLE
  • ディスクのSMARTチェックやファイルシステムの整合性確認

11. myisamchkをスクリプトで一括処理

複数テーブルに対して一括でチェックするスクリプト例:

#!/bin/bash
cd /var/lib/mysql/your_database/
for file in *.MYI; do
  myisamchk -r $file
done

12. REPAIR TABLEとmyisamchkの違い

  • REPAIR TABLE:MySQLサーバーを通して実行するため安全性が高い
  • myisamchk:MySQL停止中に直接ファイル操作、詳細な修復が可能