cloneプラグインとは
ローカルまたはリモートサーバーから無停止で物理バックアップするツール。このプラグインが導入する前は無停止で物理バックアップする場合は「MySQL Enterprise Backup」などを使用する必要がありました。バックアップするのはinnodbのみが対象になります。
リモートのMySQLサーバーからcloneする手順について記載しています。MySQLのバージョンは8.0.17です。
- clone先のサーバーのホスト名は
mysql_target
- clone元のサーバーのホスト名は
mysql_source
とします
インストール
- clone先・元のMySQLサーバー双方にcloneプラグインをインストールします
mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
Query OK, 0 rows affected (0.02 sec)
INFORMATION_SCHEMA.PLUGINSをSELECTして以下のように表示されていればOKです
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'clone';
+-------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------+---------------+
| clone | ACTIVE |
+-------------+---------------+
ユーザ作成
- clone元でBACKUP_ADMINを持ったユーザを作成します
mysql> CREATE USER 'source_user'@'mysql_source' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.02 sec)
mysql> GRANT BACKUP_ADMIN on *.* to 'source_user'@'mysql_source';
Query OK, 0 rows affected (0.01 sec)
- clone先でCLONE_ADMINを持ったユーザを作成します
mysql> CREATE USER 'target_user'@'localhost' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT CLONE_ADMIN on *.* to 'target_user'@'localhost';
Query OK, 0 rows affected (0.01 sec)
- clone先でclone_valid_donor_listにclone元の「ホスト:ポート名」を設定します
mysql> SET GLOBAL clone_valid_donor_list = 'mysql_source:3306';
Query OK, 0 rows affected (0.00 sec)
cloneの実行
mysql> CLONE INSTANCE FROM 'source_user'@'mysql_source':3306 IDENTIFIED BY 'password';
ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process).
エラーが表示されていますが、cloneが実行されると再起動が走ります。今回実行した環境がmysqlを直接起動したので再起動が失敗しましたがsystemd経由で起動させると再起動は成功します
再起動させたくない場合は、DATA DIRECTORYで出力先ディレクトリーを指定します
mysql> CLONE INSTANCE FROM 'source_user'@'mysql_source':3306 IDENTIFIED BY 'password' DATA DIRECTORY = '/tmp/mysql_clone';
Query OK, 0 rows affected (1.08 sec)
まとめ
リモートにあるMySQLサーバーをcloneする例を書きましたが、今後のMySQLサーバーのバックアップのデフォルトスタンダードのソリューションになるかもしれないですね。内部的にどうゆう仕組みで動いているのかちょっと興味が湧いてきたのでその辺りも調べて分かったら記事にしたいと思っています。