MySQLがクラッシュした時の復旧法
Last-modified: Sun, 18 Dec 2016 14:55:46 JST (2914d)
Top > MySQLがクラッシュした時の復旧法
- 自宅のMySQLサーバがクラッシュして起動しなくなったので、復旧法をメモ。
環境はCentOS5 + MySQL5.5です。
状況:MySQLにガリガリバッチで更新中にサーバの電源が落ちた。
サーバを起動するも、MySQLのオートリカバリがコケて起動しない。
ログを見ると、なんかMySQL5.5の古いバージョンで起きるバグを踏んだみたい(汗
最悪昨日のバックアップから復元でも良いけど、できれば直前に戻したい。
- MySQLをシャットダウンします。(というか起動できていないですよね)
# /etc/rc.d/init.d/mysqld stop
- 念のためMySQLディレクトリをバックアップします。
# cp -r /var/lib/mysql /var/lib/mysql_bak
- MySQLを強制リカバリモードで起動します。
my.cnfに以下追記[mysqld] innodb_force_recovery = 3 innodb_purge_threads=0
- MySQLを起動させます。これで起動できれば良いのですが、自分は起動しませんでした・・・
# /etc/rc.d/init.d/mysqld start
- MySQLが起動できなかった場合、起動するまでinnodb_force_recoveryの値を増やしていきます。(max6)
ただし、4以上にすると、データファイルが永続的に破損する場合があるらしい。けど、既にMySQLが起動しないので破損もくそもない・・ - 自分は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
- しかし、そうは上手く行きません。恐らくバックアップ中にテーブルが破損している旨のメッセージが出て止まるかもしれません。その場合は以下のようにして、該当テーブルをスキップします。
# mysqldump -u root -p -x --all-databases --events --ignore-table=<DB名>.<破損テーブル名> > /tmp/alldata.dump
- バックアップが取れたら、MySQLをシャットダウンし、アンインストールします。今回はMySQLのバージョンが古いのが原因と分かっているので。
# /etc/rc.d/init.d/mysqld stop # yum remove mysql-server
- 削除したら残骸も消します。
# rm -rf /var/lib/mysql
- mysql.cnfより追記したinnodb_force_recoveryやinnodb_purge_threadsを削除します。
- MySQLをインストールします。
# yum install mysql-server
- MySQLを起動します。
# /etc/rc.d/init.d/mysqld start
- mysql_secure_installationの実行など、MySQLをセットアップします。
- MySQLのログにエラーが出ていないことを念のため確認します。
# more /var/log/mysqld.log
- 先ほど取得したバックアップをリストアします。
# mysql -u root -p < ~/alldata.dump # mysql -u root -p mysql < ~/alluser.dump
- リストアが終わったら、念のためMySQLを再起動しておきます。
# /etc/rc.d/init.d/mysqld restart
- 破損したテーブルを昨日のバックアップなどから個別に復元します。
Counter: 1411,
today: 4,
yesterday: 0
このページの参照回数は、1411です。