- ある日、 OpenStack にあるサーバAが起動しなくなった :sob:
- OpenStack なのでディスクイメージは見ることができる
という状態。起動しないので mysqldump
のようなコマンドは使えないが、以下のように復旧した。
同じアーキ、同じOSでサーバを作り直す
Puppetなどでサーバ構成管理していればなんちゃないですね。していない場合は... ......
サーバAの母艦ノードに入る
いわゆる、compute nodeというもの。
拡張の種類にもよるが、 nova show
などで確認できるはず。また、一緒に instance_name
というものも確認できる、控えておく。
$ nova show test001 +--------------------------------------+------------------------------------------------------------------+ | Property | Value | +--------------------------------------+------------------------------------------------------------------+ ... | OS-EXT-SRV-ATTR:hypervisor_hostname | comp-node0014.example.cloud | | OS-EXT-SRV-ATTR:instance_name | foocloud01-0000063b | ...
入ったら、 guestmount
というすごい便利そうなコマンドがあって、それでサーバAのブートディスクをマウントできる。
root@comp-node0014:/# instance_name=foocloud01-0000063b ## /var/lib/nova/instances/${instance_name}/disk にあるはず root@comp-node0014:/# mkdir /tmp/${instance_name}-work root@comp-node0014:/# guestmount --ro -a /var/lib/nova/instances/${instance_name}/disk -m /dev/ubuntu-vg/root /tmp/${instance_name}-work
マウントできたら、 chroot
なりなんなりでサーバAのファイルシステムがどうなっていたか確認できる。
ここで、mysqlの既存のデータを持ってくる。
# chroot /tmp/${instance_name}-work root@comp-node0014:/# cd /var/lib root@comp-node0014:/var/lib# tar czvf mysql.tgz mysql/ mysql/ mysql/ibdata1 mysql/ib_logfile1 mysql/auto.cnf ... root@comp-node0014:/var/lib# exit ## 見える箇所にコピー # cp /tmp/${instance_name}-work/var/lib/mysql.tgz ./ ## umount忘れない # umount /tmp/${instance_name}-work
サーバBのmysqlデータを置き換える
このデータをアップロードした前提で、以下は新サーバでの操作。
## mysqlを止める ubuntu@serverB:~$ sudo systemctl stop mysql ## 持って行ったら /var/lib/mysql を差し替え ubuntu@serverB:~$ sudo mv /var/lib/mysql /var/lib/mysql.bak ubuntu@serverB:~$ tar xzf mysql.tgz ubuntu@serverB:~$ sudo mv ./mysql/ /var/lib/
ただ置き換えただけでは認識しないので、 mysql_upgrade
の実行。
ubuntu@serverB:~$ sudo mysql_upgrade -u root -p Enter password: Looking for 'mysql' as: mysql Looking for 'mysqlcheck' as: mysqlcheck Running 'mysqlcheck with default connection arguments Warning: Using a password on the command line interface can be insecure. Running 'mysqlcheck with default connection arguments Warning: Using a password on the command line interface can be insecure. mysql.columns_priv OK mysql.db OK mysql.event OK ...
sudo
しているのは、 /var/lib/mysql/mysql_upgrade_info
というファイルの読み書きができるユーザでこのコマンドを実施する必要があるため。mysql的なユーザは関係ない。
終わったら、mysqlを立ち上げ、mysqlクライアントからSQLなどでデータの復旧を確認する。
ubuntu@serverB:~$ mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 23 Server version: 5.6.25-0ubuntu0.15.04.1 (Ubuntu) Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show tables; ERROR 1046 (3D000): No database selected mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | foobar | | mysql | | performance_schema | +--------------------+ 4 rows in set (0.00 sec)
お疲れ様でした。