MySQLのエラー『エラー144:Table is Marked as Crashed』の解決方法

MySQLのエラー『エラー144:Table is Marked as Crashed』の解決方法

MySQLでテーブルにアクセスしようとした際に「Error 144: Table is marked as crashed and should be repaired」というエラーが表示される場合がある。このエラーは主にMyISAMストレージエンジンを使用しているテーブルがクラッシュ(破損)したことを示している。サーバの強制終了、ディスク容量不足、ハードウェア障害、または不適切なシャットダウンが原因で発生することが多い。

1. エラーの発生条件

MyISAM形式のテーブルが破損している状態でSELECTやUPDATEなどのクエリを実行するとエラー144が発生する。

SELECT * FROM users;

ERROR 144 (HY000): Table './mydb/users' is marked as crashed and should be repaired

2. 使用しているストレージエンジンの確認方法

該当テーブルがMyISAMかどうかを以下のクエリで確認できる。

SHOW TABLE STATUS LIKE 'users';

Engineが「MyISAM」となっている場合、修復対象になる。

3. 最も基本的な修復方法:REPAIR TABLEコマンド

MySQLのREPAIR TABLE文を使うことで、MyISAMテーブルを手動で修復できる。

REPAIR TABLE users;

修復が成功すると、「status」が「OK」になる。

4. コマンドラインからの修復:myisamchk

MySQLサーバを一時停止させたうえで、ファイル単位で修復を行うにはmyisamchkコマンドを使う。

systemctl stop mysqld

cd /var/lib/mysql/mydb
myisamchk -r users.MYI

systemctl start mysqld

この方法はREPAIR TABLEで修復できなかった場合に有効。

5. 簡易チェック:テーブルの検査のみ行う

破損しているかどうかの確認には、以下のようにオプションなしで実行。

myisamchk users.MYI

結果として「error」「warning」などの表示があれば修復が必要。

6. テーブルの完全再構築

REPAIRでも回復しない場合、一度テーブルをダンプして再作成する。

mysqldump -u root -p mydb users > users_backup.sql

DROP TABLE users;

mysql -u root -p mydb < users_backup.sql

バックアップと復元で破損した状態を回避できる。

7. クラッシュの原因を特定するためのログ確認

クラッシュが繰り返し起こる場合、原因を探るためにエラーログを確認する。

cat /var/log/mysqld.log

異常終了やディスクエラーが記録されていないか確認する。

8. 自動修復設定を有効にする

MySQLの設定で、MyISAMの自動修復を有効にできる。ただし自己責任で設定。

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

my.cnfに記述してMySQLを再起動すると適用される。

9. テーブルファイルの物理的な確認

MyISAMのテーブルは「.MYD」「.MYI」「.frm」の3つのファイルで構成される。

ls -l /var/lib/mysql/mydb/users.*

サイズが0だったり、不自然な変更がある場合は破損している可能性が高い。

10. テーブル修復時の注意点

REPAIR TABLEやmyisamchkの実行中は、対象テーブルにアクセスしないようにする。

特に本番環境ではトラフィック制限をかけるなどして、修復処理中の整合性を保つ。

11. ストレージエンジンをInnoDBへ変更する検討

MyISAMは破損しやすい構造であるため、可能であればInnoDBへの移行を検討する。

ALTER TABLE users ENGINE=InnoDB;

InnoDBはトランザクション対応・クラッシュ耐性があり、安全性が高い。

12. 定期的なバックアップと検査の導入

クラッシュの被害を最小限に抑えるためには、定期的なバックアップとテーブル検査が重要。

mysqldump -u root -p mydb > mydb_backup.sql
myisamchk -s /var/lib/mysql/mydb/*.MYI

監視スクリプトやcronで定期的に実行することで、トラブルの予兆を早期に発見できる。