MySQLのMyISAM形式のテーブルで「Incorrect information in file: *.frm」エラーが出たときの修復方法

先日ファイルシステムを復旧した際に、MySQLのあるテーブルでSELECT文などを実行すると以下のようなエラーが出るようになりました。

ERROR 1033 (HY000): Incorrect information in file: *.frm

今回の対象のテーブル形式はMyISAMだったのですが、エラーメッセージでググって見てもInnoDBの場合の記事ばかりで参考にならなくて困りました。偶然MySQLリファレンスのテーブルの修復方法で該当しそうな項目を発見し、うまく修復をすることができました。
滅多にない話のようですが、エラーメッセージと修復方法を結びつける記事がないので、後々に誰かの参考になるかもしれないので記事にしておきます。
MySQLのバージョンは5.0です。

frmファイルとは何か?

MySQLは一つのデータベースを一つのディレクトリとして扱います。
テーブルを作成すると、データベースのディレクトリ以下にテーブル名 + MYD、MYI、frmという拡張子を持つ3つのテーブルを構成するファイルが生成されます。

MYD データ本体
MYI インデックス
frm テーブルの構造

frmファイルの修復

frmがテーブルの構造を持つファイルだとわかったので、同じテーブル構造を持つfrmファイルで上書きしてやれば修復ができそうなことが推測できます。
バックアップがある場合は、そこのfrmファイルをコピーして修復したいfrmファイルに上書きすればOKです。
バックアップがない場合、以下のような手順で行います。

  1. 別のデータベースで同じ構造を持つテーブルのCREATE文を実行する
  2. MySQLサーバを停止する
  3. 別のデータベースのディレクトリ以下にあるfrmファイルを、直したいデータベースのディレクトリへ移動して上書きする*1

上記の手順を終えた後に、MySQLを起動して該当テーブルでSELECT文を実行するとエラーを出さずに実行できるはずです。frmのコピー元のテーブルはもう必要ないのでDROPしてください。
うまく動かないときは、frmファイルのパーミッションが適切でない場合があるので変更してみてください。
frmファイルを上書きするだけでうまくいくと思いますが、MYIファイルのコピーも必要な場合があるようです。その場合はREPAIR TABLEでインデックスを再生成してください。

*1:Windowsの場合は"C:\Program Files\MySQL\MySQL Server 5.0\data"以下、Linuxの場合は"/var/lib/mysql"以下にデータベースのディレクトリがあります