mita2 database life

主にMySQLに関するメモです

Group Replication を試す(4) リカバリ

Group Replication で特定のサーバのデータが吹き飛んでしまった場合の復旧手順を確認。 動いているサーバからdumpを取って、復旧すれば良いのだが、、、
--single-transaction で mysqldump しようとすると、GRではSavepoint がサポートされていないため、 コケる。。。
https://bugs.mysql.com/bug.php?id=81494 で修正の要望が出されている

-bash-4.1$ mysqldump --all-databases --single-transaction -uroot --triggers --routines --events -p > dump.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: Couldn't execute 'SAVEPOINT sp': The MySQL server is running with the --transaction-write-set-extraction!=OFF option so it cannot execute this statement (1290)
--single-transactionが使えないので、--lock-all-tables を使う。テーブルがロックされてしまうので、バックアップ中にはバックアップを取得するサーバには更新が行われないようにする必要がある。 3台構成だと、壊れていてるやつが1台、バックアップ取得用に1台ということでサービス用が1台になってしまう。。。
  1. アプリからのアクセスをなくす
  2. STOP GROUP_REPLIACTION (他のノードから更新を受け取らないようにする)
  3. mysqldump
  4. START GROUP_REPLICATION
  5. 追いついたら、アプリからのアクセスを復旧
-bash-4.1$ mysqldump --all-databases --lock-all-tables -uroot --triggers --routines --events -p > dump.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
後は、壊れたやつにダンプしたデータを流しこんで、START GROUP_REPLICATIONすれば復旧できる。
mysql> reset master;
Query OK, 0 rows affected (0.02 sec)

mysql> source dump.sql

mysql> start group_replication;
Query OK, 0 rows affected (2.22 sec)

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+---------------------------------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+---------------------------------------+-------------+--------------+
| group_replication_applier | 0cdd0b6a-cd84-11e6-b223-fa163e0b2b7c | gr02 | 3306 | ONLINE |
| group_replication_applier | 1edf2e1d-cd83-11e6-961b-fa163e83e8e7 | gr01 | 3306 | ONLINE |
| group_replication_applier | a1c37edb-cd89-11e6-a463-fa163e49d992 | gr03 | 3306 | ONLINE |
+---------------------------+--------------------------------------+---------------------------------------+-------------+--------------+
3 rows in set (0.00 sec)
ちなみにGroup ReplicationのGTIDのUUID部分はgroup_replication_group_name で指定したものが使われる
-bash-4.1$ grep -A2 GTID_PURGED dump.sql
SET @@GLOBAL.GTID_PURGED='1edf2e1d-cd83-11e6-961b-fa163e83e8e7:1,
87e5ed8c-cd83-11e6-bc3c-fa163e83e8e7:1-12947';

-bash-4.1$ grep group_name /etc/my.cnf
loose-group_replication_group_name="87e5ed8c-cd83-11e6-bc3c-fa163e83e8e7"