MySQLがクラッシュした時の復旧法

Last-modified: Sun, 18 Dec 2016 14:55:46 JST (2687d)
Top > MySQLがクラッシュした時の復旧法
  • 自宅のMySQLサーバがクラッシュして起動しなくなったので、復旧法をメモ。

環境はCentOS5 + MySQL5.5です。

状況:MySQLにガリガリバッチで更新中にサーバの電源が落ちた。

サーバを起動するも、MySQLのオートリカバリがコケて起動しない。

ログを見ると、なんかMySQL5.5の古いバージョンで起きるバグを踏んだみたい(汗

最悪昨日のバックアップから復元でも良いけど、できれば直前に戻したい。

  1. MySQLをシャットダウンします。(というか起動できていないですよね)
    # /etc/rc.d/init.d/mysqld stop
  2. 念のためMySQLディレクトリをバックアップします。
    # cp -r /var/lib/mysql /var/lib/mysql_bak
  3. MySQLを強制リカバリモードで起動します。
    my.cnfに以下追記
    [mysqld]
    innodb_force_recovery = 3
    
    innodb_purge_threads=0
  4. MySQLを起動させます。これで起動できれば良いのですが、自分は起動しませんでした・・・
    # /etc/rc.d/init.d/mysqld start
  5. MySQLが起動できなかった場合、起動するまでinnodb_force_recoveryの値を増やしていきます。(max6)
    ただし、4以上にすると、データファイルが永続的に破損する場合があるらしい。けど、既にMySQLが起動しないので破損もくそもない・・
  6. 自分は5で起動。起動したら即バックアップを取得する。
    通常mysqldumpで取得できるのはデータベースのみで、ユーザは取れないので忘れずユーザも取得する。
    # mysqldump -u root -p -x --all-databases --events > /tmp/alldata.dump
    # mysqldump -u root -p -x --allow-keywords mysql --events > /tmp/alluser.dump
  7. しかし、そうは上手く行きません。恐らくバックアップ中にテーブルが破損している旨のメッセージが出て止まるかもしれません。その場合は以下のようにして、該当テーブルをスキップします。
    # mysqldump -u root -p -x --all-databases --events --ignore-table=<DB名>.<破損テーブル名>  > /tmp/alldata.dump
  8. バックアップが取れたら、MySQLをシャットダウンし、アンインストールします。今回はMySQLのバージョンが古いのが原因と分かっているので。
    # /etc/rc.d/init.d/mysqld stop
    # yum remove mysql-server
  9. 削除したら残骸も消します。
    # rm -rf /var/lib/mysql
  10. mysql.cnfより追記したinnodb_force_recoveryやinnodb_purge_threadsを削除します。
  11. MySQLをインストールします。
    # yum install mysql-server
  12. MySQLを起動します。
    # /etc/rc.d/init.d/mysqld start
  13. mysql_secure_installationの実行など、MySQLをセットアップします。
  14. MySQLのログにエラーが出ていないことを念のため確認します。
    # more /var/log/mysqld.log
  15. 先ほど取得したバックアップをリストアします。
    # mysql -u root -p < ~/alldata.dump
    # mysql -u root -p mysql < ~/alluser.dump
  16. リストアが終わったら、念のためMySQLを再起動しておきます。
    # /etc/rc.d/init.d/mysqld restart
  17. 破損したテーブルを昨日のバックアップなどから個別に復元します。

Counter: 1002, today: 2, yesterday: 1

このページの参照回数は、1002です。