- ある日、 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)
お疲れ様でした。
参考です