MySQL:MyISAMを修復する
修復の必要性の確認
MySQLクライアントから確認する
MySQLクライアントから対象のデータベースが選択できる状態であれば、まずSHOW TABLE STATUS で確認する
Engine が NULL になったり、「marked as crashed」などとレポートされているものはテーブル構造が破損している
壊れている対象が MyISAM だと断定できればいいがまだわからないのでファイルシステムから確認する code:sql
show table status like 'db_name'\G
*************************** 1. row ***************************
Name: XXXXX
Engine: NULL # ここに本来MyISAMとかが出てきてくれるはず
Version: NULL
Row_format: NULL
Rows: NULL
Comment: Table './XXXXX/XXXXX' is marked as crashed and last ...
1 row in set (0.00 sec)
ファイルシステムから確認する
MySQL の保存しているデータベースの実ファイルのあるディレクトリに移動する (/var/lib/mysql など)
配下を確認し、対象のテーブル名と同じファイル名を探す。(<データベース名>/<テーブル名>.*)
このときに、MYI, MYD, frm の組であれば MyISAM のデータベースであるとわかる 破損したテーブルを復旧する
MySQLクライアントから修復する
code:sql
# 今の状態を確認する
mysql> check table users;
+------------- --+-------+----------+---------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+------------- --+-------+----------+---------------------------------------------------+
| DATABASE.users | check | warning | Table is marked as crashed and last repair failed |
| DATABASE.users | check | status | OK |
+----------------+-------+----------+---------------------------------------------------+
2 rows in set (4.29 sec)
# リペアコマンドを叩く (割と時間がかる)
mysql> repair table users;
+----------------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------------+--------+----------+----------+
| DATABASE.users | repair | status | OK |
+----------------+--------+----------+----------+
1 row in set (21.55 sec)
# チェックする
mysql> check table users;
+----------------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------------+-------+----------+----------+
| DATABASE.users | check | status | OK |
+----------------+-------+----------+----------+
1 row in set (3.57 sec)
# 結果をみる (MyISAMと結果に出るようになった)
show table status like 'users'\G
*************************** 1. row ***************************
Name: users
Engine: MyISAM
Version: 10
Row_format: Dynamic
Rows: xxxx
1 row in set (0.00 sec)
# 念のため select もできることを確認する
mysql> select count(*) from users;
+----------+
| count(*) |
+----------+
| xxxx |
+----------+
1 row in set (0.00 sec)
修復ツールから修復する
MySQLクライアント上から REPAIR を発行しても修復ができないパターンがまれに存在する
そういう場合は、MySQLに同梱されている myisamchk を使用すると良い
code:sh
# 今の状態を確認する
myisamchk users.MYI
# リペアコマンドを叩く。割と時間がかる
myisamchk -r users.MYI