MySQLを動かしたままHDのdumpバックアップを取ったらISAMデータベースが壊れた
いつもハードディスクのバックアップを取る際にMySQLは止めた状態でやっていたのですが今回は横着してデータベースを起動させたままスナップショットdumpをしてディスクのコピーを取ってコピー先のディスクを起動させたところ以下のエラーが出るようになった。 answer_isamテーブルがクラッシュしましたよって言ってますね・・・ 因みにテーブル名から分かるようにこのテールはMyISAMテーブルで作成してあります。
DBIx::Class::ResultSet::next(): DBI Exception: DBD::mysql::st execute failed: Table 'answer_isam' is marked as crashed and should be repaired [for Statement "SELECT me.answer_id, me.
テーブルのエラーチェック
MySQLには check table コマンドがあり MyISAMテーブルとInnoDBテーブルに対してエラーチェックを行うコマンドです。 クラッシュしたテーブル answer_isam テーブルをチェックしてみた所やはりエラーと言われました。
mysql> check table answer_isam; +---------------------+-------+----------+-----------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +---------------------+-------+----------+-----------------------------------------------------------+ | omakase.answer_isam | check | warning | Table is marked as crashed | | omakase.answer_isam | check | error | Size of datafile is: 20414672 Should be: 20415580 | | omakase.answer_isam | check | error | Corrupt | +---------------------+-------+----------+-----------------------------------------------------------+ 3 rows in set (0.00 sec)
破損したテーブルの修復
MySQLには破損された可能性があるテーブルを修復するコマンド repair table があります。 repairはCSVテーブル、MyISAMテーブル、ARCHIVEテーブルに対して実行できます。 今回問題となったテーブルはMyISAMテーブルなのでrepairコマンドで修復してみます。
mysql> repair table omakase.answer_isam; +---------------------+--------+----------+--------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +---------------------+--------+----------+--------------------------------------------------------------------+ | omakase.answer_isam | repair | info | Found link that points at 20414672 (outside data file) at 20277440 | | omakase.answer_isam | repair | warning | Number of rows changed from 581577 to 581539 | | omakase.answer_isam | repair | status | OK | +---------------------+--------+----------+--------------------------------------------------------------------+ 3 rows in set (2.20 sec)
修復後の確認
修復完了後再度 check table コマンドで確認するとテーブルが修復されているのが分かります。
mysql> check table answer_isam; +---------------------+-------+----------+----------+ | Table | Op | Msg_type | Msg_text | +---------------------+-------+----------+----------+ | omakase.answer_isam | check | status | OK | +---------------------+-------+----------+----------+
created: