サーバ負荷による強制終了で壊れたmysqlのテーブルを修復する(REPAIR TABLEとmyisamchk)
会社で利用しているs3backup君がsqlのテーブルがクラッシュしててバックアップできないよーとエラーを吐き出していたので修正しました。modxを使ってるサイトだったんですがmodxのテーブルを修正しました。
こんな感じのエラーでした。
RuntimeError: error dumping the MySQL database hoge_db:
mysqldump: Got error: 145: Table ‘./hoge_db/modx_event_log’ is marked as crashed and should be repaired when using LOCK TABLES
REPAIR TABLE での確認、修復
「REPAIR TABLE」というコマンドがあるらしい。あんまり壊れたことがなかったので初めて知った。
mysqlに接続して、コマンドをテーブル名に対して打ち込むようです。
$ mysql -d hoge_db -u root -p
mysql> REPAIR TABLE modx_event_log;
これで修正したよ!というログが表示されたら完了、Warningとか出なければOKだそうで。
myisamchk での確認、修復
MyISAM を使っているときだけですが、myisamchk というチェックコマンドがあるらしい
myisamchk ユーティリティはユーザのデータベース テーブルの情報を収集し、チェック、修復、もしくは最適化します。
myisamchk は MyISAM テーブルとともに作動します(データやインデックスを記憶するための .MYD や .MYI テーブル)。
$ find / -name "*modx_event_log*"
find: File system loop detected; `/var/named/chroot/var/named' is part of the same file system loop as `/var/named'.
/var/lib/mysql/hoge_db/modx_event_log.MYD
/var/lib/mysql/hoge_db/modx_event_log.frm
/var/lib/mysql/hoge_db/modx_event_log.MYI
$ myisamchk /var/lib/mysql/hoge_db/modx_event_log.MYI
Checking MyISAM file: /var/lib/mysql/hoge_db/modx_event_log.MYI
Data records: 2102 Deleted blocks: 0
- check file-size
- check record delete-chain
- check key delete-chain
- check index reference
- check data record references index: 1
- check data record references index: 2
- check record links
こんな感じでした。多分さっきのREPAIR TABLEでなおっちまったんだと思います。
以下は参考サイト引用。
書かれているように駄目なときはWarningが出るっぽい。
$ sudo myisamchk /var/lib/mysql/hoge/posts.MYI
Checking MyISAM file: /var/lib/mysql/hoge/posts.MYI
Data records: 111016 Deleted blocks: 0
myisamchk: warning: Table is marked as crashed and last repair failed
myisamchk: warning: 2 clients are using or haven't closed the table properly
- check file-size
myisamchk: warning: Size of datafile is: 13600153700 Should be: 13512913956
- check record delete-chain
- check key delete-chain
- check index reference
- check data record references index: 1
myisamchk: warning: Auto-increment value: 136262 is smaller than max used value: 136263
- check data record references index: 2
- check data record references index: 3
- check data record references index: 4
なんにせよ直ったっぽい。
とりあえずメモでした。