何が原因でMySQLサーバのMyISAMテーブル壊れた   利用できるプラットフォーム: MySQLサーバー - バージョン:4.0〜5.5 - リリース:5.5 MySQLサーバ - バージョン:4.0 - リリース:4.0 MySQLサーバー - バージョン:4.0〜5.5 - リリース:4.0〜5.5   目標: MyISAMテーブルが壊れた具体的な原因を説明する   解決策 MyISAMストレージエンジンはとっても頼りになれる。もしMyISAM テーブルが壊れたことがよくあれば、それについての原因をよく考えるほうがいい。データを検索するときに、以下のエラ情報が出たら、テーブルが壊れたことと意味している: Error 1034 Incorrect key file for table: '...'. Try to repair it あるいは: Error 126 = Index file is crashed Error 127 = Record-file is crashed Error 134 = Record was already deleted (or record file crashed) Error 144 / Error 1195 = Table is crashed and last repair failed Error 145 / Error 1194 = Table was marked as crashed and should be repaired   問合せで見つけ出したテーブルなのに見つけない時に、あるいは不完全なデータが返した時に、壊れたと仮定してもいいと思う。CHECK TABLE文でMyISAMテーブルが壊れているかを検証できる。 いろんな原因でMyISAMを壊れる。可能性が大きいから小さいまでの順にすれば:
  1. サーバシャットダウン、あるいはハードウェアトラブルでこわれた
  • 書き込む中に,mysqldプロセスが殺されるかシャットダウンするか損害を及ぼす。
  • 電源トラブルのせいでMySQLを実行するサーバが閉じて壊れるかもしれない。
  • ハードウェアのトラブルが出るかも知れない。例えば、サーバのディスクトラブル。
  • RAMの損害:ハードウェアを再起動すればこのトラブルが解決できる。システムメモリーでこわれたデータがあれば、電源を切らずに再起動すればいいと思う。このトラブルが極まれに現れる。けど、ハードウェアに損害があれば、よく発生する。
サーバを再起動して、自動的なリカバリがこの問題を解決するが、時々REPAIR TABLE SQL文でより深刻なテストが必要としている。テーブルが大きいな場合に、サーバがアウトラインさせて、より早くリカバリしたい時にmyisamchkを使ってください。CPUのコールが多く、いろんなインディクスオプションが失敗したら、myisamchkオプションでスレッドを選択してください、より速くなるから。このオプションは時々失敗するので、見つけ出したら必要とするスレッドが一つの場合があまりない。   2.ほかのプログラムによる損害
  • もしほかの外部的なプログラムを使っているとしたら、例えばmyisamchk。これはサーバが運用している時に上書きされて、壊れるかもしれない。
  • 一部のアンチウイルスソフトウェアもよく損害を及ぶので、時々古いテーブルをリカバリする。あるいは必要とするファイルをテストする。
この場合の第一歩はどんなファイルを変更されたことである。テーブルをリカバリするのは一時的な方法である。
  1. bugによる損害
  • 2007夏の前のバーションのサーバ建設を使う。2006年から2007年まで、MySQLはいろんなシステムテストを実行して、レアでコピしにくいMyISAM損害bugを見つけ出す。おおよそ2007の夏で、ほぼすべてのbugに関連する損害トラブルが古いバーションによるもので、リカバリ機能が強い新バーションがあまり影響されていないから、バーションを2007夏のバーションにより近くにアップロードしてください。
  • もしbugでまたこわれたとしたら、最近のサーバ機能と状況を確認してください。今日では、新しいバグの損傷は通常、顧客固有の結合および並行性の高い文、または新しい機能と高い並行性に伴う。
エラ報告でよく再起動されるmysqldでテーブルがシャットダウンしたことによる損害を受けたかを確認できる。エラ報告がサーバトラブルによるものと示されて、損害が正常操作の間で起こったとすれば、それはバグによるものかもしれない。それで、トラブルを示されるためにコピできるテストを作成して、My Oracle SupportでSupport Requestを起動し、トラブルを報告してください。もう一度言うけど、REPAIR TABLE SQL文でこわれたMyISAM表テーブルをリカバリできる。Mysqldを運用していない場合に、myisamchkコマンドでテーブルをリカバリできる。