xtrabackup8.0で mysql8.0 のbackup/resotreやって見た


##前提
innodb_cluster前提で、mysqlshでクラスタを構築しました。


`dba.configureInstance("instance1")`
以下を設定してくれるっぽい。

```
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
```

`dba.createCluster("mycluster")`
`cluster.addInstance("instance2")`
以下を設定してくれるっぽい。

```
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "127.0.0.1:24901"
group_replication_group_seeds= "127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903"
group_replication_bootstrap_group=off
```

物理バックアップ前提で、xtrabackup8.0でバックアップ・リストア

##とりあえず[マニュアル](https://www.percona.com/doc/percona-xtrabackup/8.0/backup_scenarios/full_backup.html)通りでやって見ると

```
# xtrabackup --backup --target-dir=$bk_dir
# xtrabackup --prepare --target-dir=$bk_dir
# rm -rf $data_dir
# xtrabackup --copy-back --target-dir=$bk_dir
# chown -R mysql. $data_dir
# systemctl start mysqld
mysql> reset master;
mysql> set global gtid_purged=xxxxxxxxxxxxxx;
```

##Groupreplication起動して見ます
```
mysql> set global group_replication_bootstrap_group=ON;
mysql> start group_replication;
mysql> set global group_replication_bootstrap_group=OFF;
```

##group name知らないよと怒られます
```
2019-06-19T10:49:52.008040Z 0 [ERROR] [MY-011685] [Repl] Plugin group_replication reported: 'The group name option is mandatory'
2019-06-19T10:49:52.008054Z 0 [ERROR] [MY-011660] [Repl] Plugin group_replication reported: 'Unable to start Group Replication on boot'

```

##WHY?
私の場合はmysqlshで設定したため、$data_dir/mysqld-auto.cnfに設定情報が保存されています。(set persistで設定した場合もこちらに保存されます)

xtrabackupは該当ファイルをBKしてくれないので、`rm`でGroupreplicationの設定がすべて飛んでしまったわけです。

もう一つ気付いたのは`$data_dir/auto.cnf`も飛んでしまいました。
こちらはサービス起動時に、なければ自動生成してくれますが、
mysql_innodb_cluster_metadata.instancesに古いuuidが残っている。新しいreplica setなので問題ないとか？

```
mysql> select * from mysql_innodb_cluster_metadata.instances\G
*************************** 1. row ***************************
      instance_id: 1
          host_id: 1
    replicaset_id: 1
mysql_server_uuid: e4ca1264-927e-11e9-81ea-fa163e024c6f　←古いまま
略
```

例えばsecondaryでリストアした場合、server_uuidが変わってしまうと知らないものと判断されるのでclusterにrejoinできなくなります。

[マニュアル](https://dev.mysql.com/doc/refman/8.0/en/mysql-innodb-cluster-working-with-cluster.html)によれば、auto.cnfは再生成させて、`cluster.remove`して`cluster.rescan`して`cluster.addInstance`してとのことです。
>If you are rejoining an instance which has changed in some way then you might have to modify the instance to make the rejoin process work correctly. For example, when you restore a MySQL Enterprise Backup backup, the server_uuid changes. Attempting to rejoin such an instance fails because InnoDB cluster instances are identified by the server_uuid variable. In such a situation, information about the instance's old server_uuid must be removed from the InnoDB cluster metadata and then a Cluster.rescan() must be executed to add the instance to the metadata using it's new server_uuid. For example:


##でもprimaryの場合はどうすればいいでしょう？innodb_clusterの考えは既存クラスタを捨てて再度作るとのこと？
一応`auto.cnf`と`mysqld-auto.cnf`を別途バックアップ取ってリカバリしたらうまく行けそうでしたが、まだまだ情報少ない。。。
そもそもリストアのやり方が間違っていたら教えてください。
##2019/07/09追記
試行錯誤の結果、`auto.cnf`と`mysqld-auto.cnf`はリストア直前(mysqld-auto.cnfにはpersistなどで動的に更新されるため)に退避し、リストア後に戻す方法にしました。
(今のところ安定して問題もなし)
cluster.remove ⇒cluster.rejoinメタデータまで更新されましたが、残念ながらmember追加するたびに作成されるユーザ`mysql_innodb_cluster_xxxxxxxx`は残ってしまいました。

リストア前のサービス停止とリストア後のサービス起動は[こちら](https://qiita.com/wenhujin/items/5a5889db28282bda3a06)を参照。

##まとめ

mysqlsh超便利ですが、運用を考えるとまだまだ考えることいっぱいですね。。