乐于分享
好东西不私藏

MySQL8.0 clone插件

MySQL8.0 clone插件

本文为墨天轮数据库管理服务团队第 188 期技术分享,作者孙文龙原创内容如需转载请联系小墨(VX:modb666)并注明来源。

定 义

Donor 捐赠者,指要被克隆的mysql实例,即克隆源端。 IP 地址 192.168.1.10
Recipient 收件人, 指接受克隆数据的mysql实例,即克隆目标端. IP 地址 192.168.1.11

1、安装插件

方式一 修改配置文件
[mysqld]plugin-load-add=mysql_clone.so
方式二 动态加载
mysql > install plugin clone soname 'mysql_clone.so';

2、本地克隆

mysql>createuser clone_user identified by'xxxx';mysql>GRANT BACKUP_ADMIN ON*.*TO'clone_user';mysql> CLONE LOCAL DATA DIRECTORY ='/data4/clone_test/recipient';
注意:
‘/data4/clone_test/recipient’将数据克隆到的本地目录的完整路径, 必须是绝对路径,其中/data4/clone_test 路径必须已经存在,且mysqld进程必须有对此目录的写入权限,最后一级的recipient 目录必须还不存在。
本地克隆操作不支持克隆驻留在数据目录之外的用户创建的表或表空间。试图克隆这样的表或表空间会导致以下错误:
error 1086(HY000):文件“/path/to/tablespace_name.ibd”已存在。克隆与源表空间具有相同路径的表空间将导致冲突,因此被禁止。
所有其他用户创建的InnoDB表和表空间、InnoDB系统表空间、重做日志和撤消表空间都克隆到指定的目录。
查看克隆状态

3、远程克隆

3.1 前提
  • mysql8.0.17开始支持clone插件,在8.0.37版本之前, Donor 实例和Recipient 实例 版本号必须一致, 包括小版本号。从8.0.37开始支持不同小版本之间使用clone插件。以前的限制仍然适用于早于8.0.37的版本。例如,不允许在8.0.36和8.0.42版本之间克隆
  • Donor 实例和Recipient 必须运行在同样的操作系统和硬件平台上。例如,如果Donor实例在Linux 64位平台上运行,则recipient方实例也必须在该平台上运行
  • recipient 实例 必须有足够的空间
  • 如果Donor实例在data_dir 目录额外创建了表空间, 则克隆操作必须能通过全路径访问到这些表空间文件。Recipient 上必须有相同的路径。这些表空间可以通过查询Information Schema.FILES表进行确认
  • Donor上安装且激活了的插件, 也必须在Recipient 上激活
  • Recipient 必须保持和Donor相同的字符集和排序规则
  • Recipient中的 innodb_page_size 和 innodb_data_file_path 配置项必须和Donor相同
  • 对于Donor来说, 同时只能有一个克隆操作在执行,可以通过查询information_scheme.clone_status 表来确认
  • 克隆插件将会以1MB大小的数据包传递数据, 因此Donor和 Recipient 的max_allowed_packet 参数需要设置为2MB以上
  • 确保Donor上的undo表空间文件名是唯一的
mysql> SELECT TABLESPACE_NAME, FILE_NAME FROM INFORMATION_SCHEMA.FILESWHERE FILE_TYPE LIKE ‘UNDO LOG’;
  • 远程克隆完成之后,Recipient 实例进程将被尝试重启, 所以其必须通过 mysqld_safe 或 systemd 等进程管理工具进行管理,否则的话,实例关闭后,需手动拉起
3.2 克隆
Donor 上创建用户
mysql>CREATEUSER donor_clone_user IDENTIFIED BY'xxxx';mysql>GRANT BACKUP_ADMIN on*.*to donor_clone_user;
Recipient上的操作
mysql>CREATEUSER recipient_clone_user IDENTIFIED BY'xxxxx';mysql>GRANT CLONE_ADMIN on*.*to recipient_clone_user;mysql>SETGLOBAL clone_valid_donor_list ='192.168.1.10:3306';-- 使用创建的recipient_clone_user 用户从新登陆数据库, 执行克隆操作mysql> CLONE INSTANCE FROM donor_clone_user@192.168.1.10:3306       IDENTIFIED BY'xxxx '
克隆到指定目录
默认情况下,远程克隆操作会在从Donor MySQL Server实例克隆数据之前,从Recipient数据目录中删除用户创建的数据对象(schema、表、表空间)和二进制日志。通过克隆到指定目录,可以避免从当前Recipient数据目录中删除数据。
克隆到指定目录的过程和之前的操作相同,只需要额外添加一个 DATA DIRECTORY 参数
mysql> CLONE INSTANCE FROM donor_clone_user@192.168.1.10:3306       IDENTIFIED BY'xxxx ' DATA DIRECTORY ='/data4/clone_test/recipient';
3.3 复制过程中的文件
克隆过程中依次执行
  • 获取备份锁 (Backup Lock)。备份锁和 DDL 互斥。注意,获取的不仅仅的是 Recipient 上的备份锁,Donor 上的同样也要获取。
  • Drop 用户表空间。注意,Drop 的只是用户表空间,不是数据目录,也不包括 ib_buffer_pool、ibdata 等系统文件。
  • 从 Donor 实例拷贝数据。对于用户表空间,会直接拷贝。对于系统文件 ,则会重命名为 xxx.#clone,不会直接替代原文件。如
克隆数据时,将创建以下目录和文件以供内部使用。
#clone:包含克隆操作使用的内部克隆文件。在数据克隆到的目录中创建。
#ib_archive:包含内部存档的日志文件,在克隆操作期间存档在捐赠者上。
*.#clone:在远程克隆操作期间,从收件人数据目录中删除数据并克隆新数据时,在收件人上创建的临时数据文件。
  • 重启实例。在启动的过程中,会用 xxx.#clone 替换掉原来的系统文件。
3.4 查看复制进度
performance_schema.clone_status表提供当前或上次执行的克隆操作的状态。克隆操作有四种可能的状态:未启动、正在进行、已完成和失败。
clone_progress表按阶段提供当前或上次执行的克隆操作的进度信息。克隆操作的阶段包括DROP DATA、FILE COPY、PAGE_COPY、REDO_COPY,FILE_SYNC、RESTART和RECOVERY。
3.5 终止克隆
可以在Recipient实例上通过查询performance_schema.clone_status 表中的PID列, 获取执行克隆操作的会话信息, 然后通过kill query pid 命令终止克隆操作

4、启动数据库

克隆完成之后,就可以正常启动数据库
$> mysqld_safe --defaults-file=/etc/my.cnf

5、克隆插件的限制

  • 克隆期间,会阻塞 DDL 。同样,DDL 也会阻塞克隆命令的执行。不过从 MySQL 8.0.27 开始,克隆命令不会阻塞 Donor 上的 DDL 。
  • Clone Plugin 不会拷贝 Donor 的配置参数。
  • Clone Plugin 不会拷贝 Donor 的 Binlog。
  • Clone Plugin 只会拷贝 InnoDB 表的数据,对于其它存储引擎的表,只会拷贝表结构。
  • Donor 实例中如果有表通过 DATA DIRECTORY 子句设置了路径,在进行本地克隆时,会提示文件已存在。在进行远程克隆时,路径必须存在且有可写权限。
  • 不允许通过 MySQL Router 连接 Donor 实例。
  • 执行 CLONE INSTANCE 操作时,指定的 Donor 端口不能为 X Protocol 端口。
参考文档 https://dev.mysql.com/doc/refman/8.0/en/clone-plugin.html

THE END

墨天轮从乐知乐享的数据库技术社区蓄势出发,全面升级,提供多类型数据库管理服务。墨天轮数据库管理服务旨在为用户构建信赖可托付的数据库环境,并为数据库厂商提供中立的生态支持。

服务官网:https://www.modb.pro/service

点击进入服务团队主页

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » MySQL8.0 clone插件

评论 抢沙发

4 + 8 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮