CentOS Stream 8
Sponsored Link

MySQL 8.0 : クローン機能を利用する
2021/05/27
 
MySQL 8.0.17 で実装されたクローン機能を使用した MySQL データのバックアップです。
[1] デフォルトではクローンプラグインは有効になっていないため、有効にしておきます。
# バージョン確認

[root@www ~]#
/usr/libexec/mysqld --version

/usr/libexec/mysqld Ver 8.0.21 for Linux on x86_64 (Source distribution)
[root@www ~]#
vi /etc/my.cnf.d/mysql-server.cnf
# [mysqld] 内に追記

[mysqld]
.....
.....
plugin-load=mysql_clone.so
[root@www ~]#
systemctl restart mysqld
# プラグイン確認

[root@www ~]#
mysql -u root -p -e "select plugin_name, plugin_status, plugin_type from information_schema.plugins where plugin_name = 'clone';"

Enter password:
+-------------+---------------+-------------+
| plugin_name | plugin_status | plugin_type |
+-------------+---------------+-------------+
| clone       | ACTIVE        | CLONE       |
+-------------+---------------+-------------+
[2] ローカルホスト上の任意のディレクトリにクローンを取得します。
# クローンを取得するディレクトリを作成

[root@www ~]#
mkdir /home/mysql_backup

[root@www ~]#
chown mysql. /home/mysql_backup

# クローン取得を実行

# 指定する取得先ディレクトリがすでに存在しているとエラーとなるため

# 存在しないディレクトリ名を指定する

[root@www ~]#
mysql -u root -p -e "clone local data directory = '/home/mysql_backup/backup01/';"
[root@www ~]#
ll /home/mysql_backup/backup01

total 167940
drwxr-x---. 2 mysql mysql       89 May 26 19:20 '#clone'
-rw-r-----. 1 mysql mysql     3669 May 26 19:20  ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 May 26 19:20  ibdata1
-rw-r-----. 1 mysql mysql 50331648 May 26 19:20  ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 May 26 19:20  ib_logfile1
drwxr-x---. 2 mysql mysql        6 May 26 19:20  mysql
-rw-r-----. 1 mysql mysql 25165824 May 26 19:20  mysql.ibd
drwxr-x---. 2 mysql mysql       28 May 26 19:20  sys
drwxr-x---. 2 mysql mysql       28 May 26 19:20  test_database
-rw-r-----. 1 mysql mysql 10485760 May 26 19:20  undo_001
-rw-r-----. 1 mysql mysql 10485760 May 26 19:20  undo_002
[3] SELinux を有効にしている場合は、クローン取得先のディレクトリに応じてポリシーの変更が必要です。
当例のように [/home] 配下に取得する場合は、以下のようなポリシー変更をします。
[root@www ~]#
vi mysqld-clone.te
# 以下の内容で新規作成

module mysqld-clone 1.0;

require {
        type mysqld_t;
        type user_home_dir_t;
        class dir { add_name create remove_name write };
        class file { create getattr open read unlink write };
}

#============= mysqld_t ==============
allow mysqld_t user_home_dir_t:dir { add_name create remove_name write };
allow mysqld_t user_home_dir_t:file { create getattr open read unlink write };

[root@www ~]#
checkmodule -m -M -o mysqld-clone.mod mysqld-clone.te

checkmodule: loading policy configuration from mysqld-clone.te
checkmodule: policy configuration loaded
checkmodule: writing binary representation (version 19) to mysqld-clone.mod
[root@www ~]#
semodule_package --outfile mysqld-clone.pp --module mysqld-clone.mod

[root@www ~]#
semodule -i mysqld-clone.pp

[4] [CLONE INSTANCE FROM] 句を使用して、リモートホスト間で直接データコピーすることも可能です。
公式ドキュメントでは、コピー元を ドナー (Donor)、コピー先を レシピエント (Recipient) と表記してあります。
# ドナー上でクローン用のユーザーを作成して [BACKUP_ADMIN] 権限付与

[root@www ~]#
mysql -u root -p

Enter password:

mysql> create user 'clone_user'@'%' identified by 'password';
Query OK, 0 rows affected (0.09 sec)

mysql> grant BACKUP_ADMIN on *.* to 'clone_user'@'%';
Query OK, 0 rows affected (0.10 sec)

# レシピエント上でクローン用のユーザーを作成して [CLONE_ADMIN] 権限付与

[root@node01 ~]#
mysql -u root -p

Enter password:

mysql> create user 'clone_user'@'%' identified by 'password';
Query OK, 0 rows affected (0.11 sec)

mysql> grant CLONE_ADMIN on *.* to 'clone_user'@'%';
Query OK, 0 rows affected (0.04 sec)


# レシピエント上でクローン実行
# 事前に [set global clone_valid_donor_list = (ドナーのIPアドレス:ポート)] をセット
# データはデフォルトの [/var/lib/mysql] 配下にコピーされる
mysql> set global clone_valid_donor_list = '10.0.0.31:3306';
Query OK, 0 rows affected (0.00 sec)

mysql> clone instance from clone_user@10.0.0.31:3306 identified by 'password';
Query OK, 0 rows affected (2.64 sec)

# クローン状況確認
# [Completed] であればコピー完了
mysql> select STATE from performance_schema.clone_status;
+-----------+
| STATE     |
+-----------+
| Completed |
+-----------+
1 row in set (0.00 sec)


# データコピー先ディレクトリを指定する場合は [data directory = '***'] を付与する
# コピー先ディレクトリを変更する場合 [2], [3] に記載の通り、事前にディレクトリの作成や適切な権限の設定が必要
mysql> clone instance from clone_user@10.0.0.31:3306 identified by 'password' data directory = '/home/mysql_backup/backup01/';
関連コンテンツ