TL;DR
- 日々の覚書: MySQL 8.0.17でついにCloneプラグインが入った で紹介した
CLONE LOCAL DATA
は現在のdatadirをローカルのファイルシステムに一貫性のある形でコピーするステートメントだった - これをスレーブになるサーバーに転送してやってももちろん良いんだけど、そこまで一括でやってくれる
CLONE INSTANCE FROM
のステートメントも存在する - スレーブ増やすのが捗る
CLONE INSTANCE FROM を使うためには、データのコピー元( ドキュメント 上では ドナー(Donor) )とコピー先(同 レシピエント(Recipient) )それぞれのMySQLでCloneプラグインが有効化されていないといけない。
donor> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
recipient> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
ちなみにレシピエントでCloneプラグインが有効になってないとそもそもCLONEステートメントが転けるし、
recipient> CLONE INSTANCE FROM cloner@127.0.0.1:12345 IDENTIFIED BY '';
ERROR 1524 (HY000): Plugin 'clone' is not loaded
ドナーで有効になっていないと
recipient> CLONE INSTANCE FROM cloner@127.0.0.1:12345 IDENTIFIED BY '';
ERROR 3862 (HY000): Clone Donor Error: 1524 : Plugin 'clone' is not loaded.
とそれぞれ違うエラーが出る(レシピエントとしてのエラー3862と、ドナーが返したであろうエラーの1524が1つのメッセージに混じっていてちょっと面白い)
Cloneプラグインを両方で有効化したら、ドナーになるインスタンスでアカウントを作成する。必要になる権限は
BACKUP_ADMIN
のみ。ここは CLONE LOCAL DATA
の時といっしょ。donor> CREATE USER clone_user;
Query OK, 0 rows affected (0.01 sec)
donor> GRANT BACKUP_ADMIN ON *.* TO clone_user;
Query OK, 0 rows affected (0.00 sec)
レシピエント側で
CLONE INSTANCE FROM
を実行する。ユーザー名、ホスト名やIPアドレス、ポートの部分は クォートしない ( CHANGE MASTER TO
はクォートしないといけないのに…)、パスワードを設定していなくても(そんなことがあるのか) IDENTIFIED BY ..
はつけないと構文エラーになる、あたりが注意点。
ポート番号も、デフォルトの3306でも省略できずちゃんとフルで書かないとシンタックスエラーって言われる。
recipient> CLONE INSTANCE FROM clone_user@172.17.0.10:3306 IDENTIFIED BY '';
ERROR 3869 (HY000): Clone system configuration: 172.17.0.10:3306 is not found in clone_valid_donor_list:
recipient> SET GLOBAL clone_valid_donor_list = '172.17.0.10:3306';
Query OK, 0 rows affected (0.00 sec)
recipient> CLONE INSTANCE FROM clone_user@172.17.0.10:3306 IDENTIFIED BY '';
これでデータのコピーが始まる。
コピーが終わると勝手に RESTART ステートメントが走っておしまい。
(
コピーが終わると勝手に RESTART ステートメントが走っておしまい。
(
RESTART
の条件である「 mysqld_safe
や systemd
にぶら下がっていること」が満たされてないとシャットダウンだけするっぽい)
再起動してきたら、
performance_schema.clone_status
あたりからbinlogの情報とかgtid_executedとかが拾えるのでいつも通り CHANGE MASTER TO
でレプリケーションを構成してやればスレーブが出来上がる。
レプリケーション用のアカウントとかはよしなに今までと同じ感じで作っておく。
donor> use performance_schema
Database changed
donor> show tables like '%clone%';
+----------------------------------------+
| Tables_in_performance_schema (%clone%) |
+----------------------------------------+
| clone_progress |
| clone_status |
+----------------------------------------+
2 rows in set (0.01 sec)
donor> SELECT * FROM clone_status;
+------+------+-----------+-------------------------+-------------------------+-----------------+----------------+----------+---------------+---------------+-----------------+-------------------------------------------------------------------------------------------+
| ID | PID | STATE | BEGIN_TIME | END_TIME | SOURCE | DESTINATION | ERROR_NO | ERROR_MESSAGE | BINLOG_FILE | BINLOG_POSITION | GTID_EXECUTED |
+------+------+-----------+-------------------------+-------------------------+-----------------+----------------+----------+---------------+---------------+-----------------+-------------------------------------------------------------------------------------------+
| 1 | 0 | Completed | 2019-07-26 10:49:46.370 | 2019-07-26 11:01:59.458 | 172.17.0.10:3306 | LOCAL INSTANCE | 0 | | binlog.000003 | 155 | 7470a831-4aed-11e9-b334-70106f4f8c56:1-8218993,
ee20abe3-33e8-11e9-8a63-1c98ec2973a4:1-16 |
+------+------+-----------+-------------------------+-------------------------+-----------------+----------------+----------+---------------+---------------+-----------------+-------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
donor> CHANGE MASTER TO master_host= '172.17.0.1', master_port= 3306, master_user = 'replicator', master_password= '', master_log_file= 'binlog.000003', master_log_pos= 155;
gtid_mode=ON
ならもっと楽ですね! 捗る!!!
0 件のコメント :
コメントを投稿