ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

OpenStack 上にある MySQL のデータを、ファイルベースでサーバAからサーバBに復旧する手順

  • ある日、 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)

お疲れ様でした。

参考です