MySQLが起動しない

The server quit without updating PID file (xxxxx.pid)
とか出る。 まぁ権限がないんだろうなと思って以下をチェック

  • xxxx.pidが存在しているかどうか確認する。あったら消す
  • xxxx.pidを作ろうとしているディレクトリの所有者がmysqlになっているか確認する
    • またはmysqlが書き込み可能か確認する

で、だ。確認したところファイルはないし所有者はmysqlになってるし…なんだこれ。
とりあえずエラーメッセージは無視してエラーログを見るとこんな感じのメッセージが

InnoDB: Error: could not open single-table tablespace file .\xat\payments.ibd  
InnoDB: We do not continue the crash recovery, because the table may become  
InnoDB: corrupt if we cannot apply the log records in the InnoDB log to it.  
InnoDB: To fix the problem and start mysqld:  
InnoDB: 1) If there is a permission problem in the file and mysqld cannot  
InnoDB: open the file, you should modify the permissions.  
InnoDB: 2) If the table is not needed, or you can restore it from a backup,  
InnoDB: then you can remove the .ibd file, and InnoDB will do a normal  
InnoDB: crash recovery and ignore that table.  
InnoDB: 3) If the file system or the disk is broken, and you cannot remove  
InnoDB: the .ibd file, you can set innodb_force_recovery > 0 in my.cnf  
InnoDB: and force InnoDB to continue crash recovery here.  

要約すると

  1. 書き込み権限あるか確認してね!
  2. データが要らないかリストア可能ならデータファイルを全削除して立ち上げてみてね!
  3. my.cnfにinnodbforcerecoveryを0以上で設定してみてね!

って感じ?
1.はもうやったし今回のケースではバックアップもないし消えたら会社が一つ消えるレベルの話?だったので3.を試すことにした。
my.confのバックアップを取って、からmy.confを修正。
sudo nano /etc/my.conf
以下の内容を書き込む
innodb_force_recovery = 1

起動しないのでリカバリーのレベルをあげる
innodb_force_recovery = 2
起動しない
innodb_force_recovery = 3
起動しない
innodb_force_recovery = 4
起動しない
innodb_force_recovery = 5
起動しない
・・・innodbforcerecoveryのレベルは0~6らしいので次であがらなかったらアウト…。

innodb_force_recovery = 6
起動した!

これでdumpができるのだが…できないときもある。そのときの対応はまた後日。 ほぼ確実にTableが壊れているので復旧作業が必要になるのと、innodb_force_recovery設定中はテーブルの変更が無視されるらしいので注意。

あぁ論文かかねばならないのにこんな対応していていいのだろうか…。