MySQL8.0 Clone 数据库克隆案例详解

环境配置:
主机名        IP地址             角色                
node222     172.16.1.222    数据源实例[donor]
node223     172.16.1.223    空实例,数据目标实例[recipient]
操作系统:CentOS Linux release 7.6.1810 (Core)
数据库版本:8.0.33 MySQL Community Server - GPL


注意事项:
执行CLONE INSTANCE语句需满足下面的先决条件:
donor和recipient必须有相同的MySQL服务器版本,克隆插件在8.0.17版本后支持;
donor和recipient必须运行在相同的操作系统和平台;
克隆数据,recipient必须有足够的磁盘空间;
InnoDB需要在数据目录外面创建表空间,可通过INFORMATION_SCHEMA.FILES查看;
克隆插件必须在donor和recipient激活,可通过SHOW PLUGINS查看;
donor和recipient必须有相同的MySQL服务器字符集和排序规则;
donor和recipient需要有相同的innodb_page_size和innodb_data_file_path设置;
若克隆加密或页压缩的数据,donor和recipient必须有相同的文件系统块大小;
若克隆加密的数据,需要安全的连接;
recipient上的clone_valid_donor_list设置必须包括donor MySQL服务器实例的主机地址;
一次只能有一个克隆操作,克隆期间不能有其他克隆操作,可通过clone_status查看;
克隆插件以1MB数据包和元数据的形式传输数据,在donor和recipient MySQL服务器实例上所需的最小max_allowed_packet是2MB;
donor上的Undo表空间文件名必须唯一,当数据克隆到recipient,undo表空间克隆到recipient 上innodb_undo_directory指定的位置或DATA DIRECTORY [ = ] 'clone_dir' 子句指定的目录;
默认,recipient MySQL服务器实例在克隆数据完成后自动重启;

node222,node223数据库安装配置略,安装的数据库版本要一样,都为8.0.33:

0.关闭firewalld,selinux,添加hosts主机名映射
systemctl stop firewalld
systemctl mask firewalld
 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config 

1.安装 Clone 插件[node222,node223都需要安装],以root用户登录:
通过 MySQL Client 安装 Clone 插件:
INSTALL PLUGIN CLONE SONAME "mysql_clone.so";

查看是否安装成功:
mysql> select * from information_schema.plugins where PLUGIN_NAME='clone';
+-------------+----------------+---------------+-------------+---------------------+----------------+------------------------+--------------------+--------------------+----------------+-------------+
| PLUGIN_NAME | PLUGIN_VERSION | PLUGIN_STATUS | PLUGIN_TYPE | PLUGIN_TYPE_VERSION | PLUGIN_LIBRARY | PLUGIN_LIBRARY_VERSION | PLUGIN_AUTHOR      | PLUGIN_DESCRIPTION | PLUGIN_LICENSE | LOAD_OPTION |
+-------------+----------------+---------------+-------------+---------------------+----------------+------------------------+--------------------+--------------------+----------------+-------------+
| clone       | 1.0            | ACTIVE        | CLONE       | 1.0                 | mysql_clone.so | 1.11                   | Oracle Corporation | CLONE PLUGIN       | GPL            | ON          |
+-------------+----------------+---------------+-------------+---------------------+----------------+------------------------+--------------------+--------------------+----------------+-------------+
1 row in set (0.00 sec)

2.在node222,node223上创建用户并授权:注意,即使是root用户,也没有BACKUP_ADMIN,CLONE_ADMIN权限
CREATE USER clone_user IDENTIFIED BY "Clone_password123.";
GRANT CLONE_ADMIN,BACKUP_ADMIN ON *.* to clone_user;

授予查看 Clone 进度等相关信息的权限:
GRANT SELECT ON performance_schema.* TO clone_user;
GRANT EXECUTE ON *.* to clone_user;

查看已授于的权限:
mysql> show grants for clone_user@'%';
+------------------------------------------------------------+
| Grants for clone_user@%                                    |
+------------------------------------------------------------+
| GRANT EXECUTE ON *.* TO `clone_user`@`%`                   |
| GRANT BACKUP_ADMIN,CLONE_ADMIN ON *.* TO `clone_user`@`%`  |
| GRANT SELECT ON `performance_schema`.* TO `clone_user`@`%` |
+------------------------------------------------------------+

克隆本地数据
本地克隆数据是将MySQL数据目录克隆相同服务器或节点到另一个目录 支持的语法如下,
CLONE LOCAL DATA DIRECTORY [=] '/path/to/clone_dir'
执行上述语句,对应的用户需要有BACKUP_ADMIN权限,而且用户创建的文件或表空间必须在数据目录中,同时,克隆的目的地需指定绝对路径,目录完整路径必须存在,但clone_dir必须不存在。
创建目录
[root@node222 ~]# mkdir /data/clone
[root@node222 ~]# chown -R mysql.mysql /data/clone/
克隆操作
mysql> clone local data directory='/data/clone/clone_data';
Query OK, 0 rows affected (1.27 sec)

查看克隆后的文件
[root@node222 clone_data]# ll /data/clone/clone_data/
总用量 70684
drwxr-x--- 2 mysql mysql       89 7月   2 17:06 #clone
-rw-r----- 1 mysql mysql    20810 7月   2 17:06 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 7月   2 17:06 ibdata1
drwxr-x--- 2 mysql mysql       23 7月   2 17:06 #innodb_redo
drwxr-x--- 2 mysql mysql        6 7月   2 17:06 mysql
-rw-r----- 1 mysql mysql 26214400 7月   2 17:06 mysql.ibd
drwxr-x--- 2 mysql mysql     4096 7月   2 17:06 nsy_tms
drwxr-x--- 2 mysql mysql       28 7月   2 17:06 sys
-rw-r----- 1 mysql mysql 16777216 7月   2 17:06 undo_001
-rw-r----- 1 mysql mysql 16777216 7月   2 17:06 undo_002

验证,使用克隆的目录启动数据库
[root@node222 ~]# systemctl stop mysqld
[root@node222 ~]# mysqld_safe --datadir=/data/clone/clone_data/ --user=mysql
2023-07-02T09:10:51.813779Z mysqld_safe Logging to '/var/log/mysqld.log'.
2023-07-02T09:10:51.885299Z mysqld_safe Starting mysqld daemon with databases from /data/clone/clone_data

通过客户端命令可以正常登录数据库:
[root@node222 clone_data]# mysql -uroot -p'123A123.' -hlocalhost

克隆远程数据
克隆远程MySQL服务器实例(donor)并将其传输至执行克隆操作的MySQL实例(recipient)
登录到 node223 节点执行 Clone 命令,
注意:需要先测试node223是否能连接到node222
[root@node223 ~]# mysql -uroot -p'Rscpass123.' -hlocalhost
SET GLOBAL clone_valid_donor_list = '172.16.1.222:3306';

##Clone 操作推荐在shell命令行下挂到后台执行,通过clone_user用户登录
[root@node223 ~]# mysql -uclone_user -p'Clone_password123.' -hlocalhost
CLONE INSTANCE FROM clone_user@172.16.1.222:3306 IDENTIFIED BY "Clone_password123.";

注意,数据库克隆只支持同版本号的操作,小版本号不同也会报错,无法执行如下:
ERROR 3864 (HY000): Clone Donor MySQL version: 8.0.31 is different from Recipient MySQL version 8.0.33.

查看 Clone 的信息
SELECT STATE, CAST(BEGIN_TIME AS DATETIME) as "START TIME",
CASE WHEN END_TIME IS NULL THEN
LPAD(sys.format_time(POWER(10,12) * (UNIX_TIMESTAMP(now()) - UNIX_TIMESTAMP(BEGIN_TIME))), 10, ' ')
ELSE
LPAD(sys.format_time(POWER(10,12) * (UNIX_TIMESTAMP(END_TIME) - UNIX_TIMESTAMP(BEGIN_TIME))), 10, ' ')
END as DURATION
FROM performance_schema.clone_status;

结果展示:

+-----------+---------------------+------------+
| STATE     | START TIME          | DURATION   |
+-----------+---------------------+------------+
| Completed | 2023-07-02 17:44:34 |    11.28 s |
+-----------+---------------------+------------+
1 row in set (0.50 sec)

检查 Clone 的操作进度:


SELECT STAGE, STATE, CAST(BEGIN_TIME AS TIME) as "START TIME",

  CASE WHEN END_TIME IS NULL THEN

  LPAD(sys.format_time(POWER(10,12) * (UNIX_TIMESTAMP(now()) - UNIX_TIMESTAMP(BEGIN_TIME))), 10, ' ')

  ELSE

  LPAD(sys.format_time(POWER(10,12) * (UNIX_TIMESTAMP(END_TIME) - UNIX_TIMESTAMP(BEGIN_TIME))), 10, ' ')


  END as DURATION,


  LPAD(CONCAT(FORMAT(ROUND(ESTIMATE/1024/1024,0), 0), " MB"), 16, ' ') as "Estimate",


  CASE WHEN BEGIN_TIME IS NULL THEN LPAD('0%', 7, ' ')


  WHEN ESTIMATE > 0 THEN


  LPAD(CONCAT(CAST(ROUND(DATA*100/ESTIMATE, 0) AS BINARY), "%"), 7, ' ')


  WHEN END_TIME IS NULL THEN LPAD('0%', 7, ' ')


  ELSE LPAD('100%', 7, ' ') END as "Done(%)"


FROM performance_schema.clone_progress;


结果展示:

+-----------+-----------+------------+------------+------------------+------------------+
| STAGE     | STATE     | START TIME | DURATION   | Estimate         | Done(%)          |
+-----------+-----------+------------+------------+------------------+------------------+
| DROP DATA | Completed | 17:44:35   |  228.07 ms |             0 MB | 0x20202031303025 |
| FILE COPY | Completed | 17:44:35   |     4.81 s |           229 MB | 0x20202031303025 |
| PAGE COPY | Completed | 17:44:40   |   11.62 ms |             0 MB | 0x20202031303025 |
| REDO COPY | Completed | 17:44:40   |    8.76 ms |             0 MB | 0x20202031303025 |
| FILE SYNC | Completed | 17:44:40   |  485.14 ms |             0 MB | 0x20202031303025 |
| RESTART   | Completed | 17:44:40   |     4.64 s |             0 MB | 0x20202031303025 |
| RECOVERY  | Completed | 17:44:45   |  366.84 ms |             0 MB | 0x20202031303025 |
+-----------+-----------+------------+------------+------------------+------------------+
7 rows in set (0.01 sec)


在接受者查询捐赠款的日志信息
mysql> SELECT BINLOG_FILE, BINLOG_POSITION FROM performance_schema.clone_status;
+---------------+-----------------+
| BINLOG_FILE   | BINLOG_POSITION |
+---------------+-----------------+
| binlog.000009 |             157 |
+---------------+-----------------+
1 row in set (0.01 sec)

等待 Recipient 节点完成 Clone

重启完成 Crash Recovery 之后,整个 Clone 操作就结束了。

最后核对一下两边的数据,发现数据一致

分割线
感谢打赏
江西数库信息技术有限公司
YWSOS.COM 平台代运维解决方案
 评论
 发表评论
姓   名:

Powered by AKCMS