xtraBackupを使用した、mysqlデータの新サーバーへの移行

# やりたいこと
 Virtualbox上の「CentOS 6.5 & Zabbix 2.4.5 → CentOS 7.3 & Zabbix 3.0」
 にバージョンアップしたい！

　mysqlのデーターをなるべく速く、簡単に移行したい！

# 結果
 xtrabackupを使用して、mysql 65GBのデータ
　→　バックアップ：３時間　、　リストア：１．５時間

# 課題
　・Zabbix 3.0 はCentOS7(64bit OS only)が標準となる
　　→　Zabbixはupdateで簡単に移行可能
　　→　CentOSはupdateでは難しい（手順はあるようだが、不要なゴミが残る）

　・mysqlのデータベースが100GB近くあり、高速なデーターの移行方法の検討が必要
　　→　mysqldumpではバックアップは問題ないが、リストアが遅すぎて使えない
　　　（３０時間以上掛かっても終わらないため、中断した）
# 移行方法
　・事前に新サーバーを別途作成して、新環境でCentOS7 & Zabbix 3.0を構築
　・最後にxtrabackupでデータのみ引っ越す
# 環境
　ホストＯＳ　　　　・Windows2008R2 Server　　・Virtualbox 5.1（仮想ソフト）
　ゲストＯＳ元環境　・centos6.5　・zabbix2.4.5　・mysql5.6　・xtrabackup
　ゲストＯＳ新環境　・centos7.3　・zabbix3.0.9　・mysql5.6　・xtrabackup
　ｚａｂｂｉｘ　　　２０万アイテムを５分間隔で監視、ＤＢ　６５ＧＢ程度
# 手順１　「元環境でxtrabackupでバックアップを実施」
・rpmでパッケージを追加します

```ruby:
# rpm -Uhv https://www.percona.com/redir/downloads/percona-release/redhat/percona-release-0.1-4.noarch.rpm
```

・yumでインストールします

```ruby:
# yum install xtrabackup
```

・フォルダを作成します

```ruby:
# mkdir -p /backup/xtrabackup/
```

・ファイル数を確認します

```ruby:
# find /var/lib/mysql -type f | wc -l
```

・ファイルアクセス数を増やします

```ruby:
# ulimit -n 10000  <-- /var/lib/mysqlのファイル数より大きな値を指定
```

・サービス状態の確認

```ruby:
# service mysqld start        <--   （必須）
# service zabbix-server stop  <--   （任意）
                                  ※開始だと高負荷になり、監視もキューが溜まるため停止しましょう
```

上記で、バックアップ準備は完了です。

・「innobackupex」を実行し「コピー」します。
　　--parallel=16　　　（任意）：同時にコピーする数を指定します。
　　　（私の環境では、「なし」、「4」,「8」なども検証しましたが、「16」が「なし」の２倍高速でした）
　　--database='zabbix'（不可）：指定すると、mysql起動時エラーが発生します

```ruby:
# time innobackupex --parallel=16 /backup/xtrabackup/
 ～
 ～
innobackupex: completed OK!  <-- 完了
real    165m27.646s (02:45)
```

・もう一度「innobackupex」を実行し「ログをフラッシュ」します。
　　--apply-log　（必須）：これを最後に実施しないと、mysql起動時シーケンスエラーが発生します
　　/backup/xtrabackup/*：コピー実行開始時のフォルダが作成されています。ＴＡＢで補完して選択してください

```ruby:
# time innobackupex --apply-log /backup/xtrabackup/2017-06-17_13-41-10
 ～
 ～
innobackupex: completed OK!  <-- 完了
real    3m18.972s (00:03)
```

ゲストＯＳを停止します。

# 手順２　「新環境で元環境の仮想ディスクをマウント」
・Virtualboxで元環境の仮想ディスクを新環境のファイルを追加します

![image.png](https://qiita-image-store.s3.amazonaws.com/0/187576/1f76a22d-86c2-eed1-f6ab-2417e23a02bd.png)
・新環境を起動します。元環境は停止が必要です
# 手順３　「新環境でxtrabackupでリストアを実施」
・rpmでパッケージを追加します

```ruby:
# rpm -Uhv https://www.percona.com/redir/downloads/percona-release/redhat/percona-release-0.1-4.noarch.rpm
```

・yumでインストールします

```ruby:
# yum install xtrabackup
```

・サービス状態の確認

```ruby:
# service mysqld stop        <--   （必須）
# service zabbix-server stop  <--   （必須）
```

・mysqlのファイルを削除

```ruby:
# rm -rf /var/lib/mysql
```

・「lvscan」でマウントパスを確認

```ruby:
# lvscan
  ACTIVE            '/dev/vg_fmv003centos/lv_root' [95.70 GiB] inherit  <-- /dev/*/*_root
```

・マウントポイントを作成

```ruby:
# mkdir /mnt/old_centos
```

・マウントします

```ruby:
# mount /dev/vg_fmv003centos/lv_root /mnt/old_centos
```

・「innobackupex」を実行し「リストア」します
　　--copy-back （必須）：リストア（コピー）を指定します
　　--parallel=16（不可）：無視されます
　　/backup/xtrabackup/*：コピー実行開始時のフォルダが作成されています。ＴＡＢで補完して選択してください

　　※残念ながらmysql →　mariadbなどへの移行はできません。同一に合わせる必要あり。
　　xtrabackupのリストアは正常に完了しますが、mysqlが「エラー」で開始できません。
　　
　　よってCentOS7の標準の「mariadb」は「Remove」して「mysql5.6」を「install」しました

```ruby:
# time innobackupex --copy-back /mnt/old_centos/backup/xtrabackup/2017-06-17_13-41-10/
 ～
 ～
innobackupex: completed OK!  <-- 完了
real    90m22.733s (01:30)
```

・所有者を変更します

```ruby:
# chown -R mysql:mysql /var/lib/mysql
```

・「mysql」設定を復元します

```ruby:
# cp /mnt/old_centos/etc/my.cnf /etc
```

・「mysqld」のサービスを開始します

```ruby:
# systemctl start mysqld
```

・正常に開始できれば完了です

# まとめ
色々な方法でトライした結果、本手順に行き着きました。

　・mysqldumpのリカバリが遅くて使えない！
　　　→　xtrabackupを使用する
　・新環境へのバックアップデータの移行に時間がかかる！
　　　→　virtualboxで仮想ディスクを割り当て元環境のバックアップに直接アクセスする
　・mysql　→　mariadbへ移行したいなら、遅くてもmysqldumpを使用するしかない

でした。参考になれば幸いです。