克隆插件(Clone Plugin)是MySQL 8.0.17引入的一个重要特性,专为Group Replication和节点快速扩展设计。通过这个插件,用户可以高效地在本地或从远程MySQL实例克隆数据。克隆过程基于InnoDB存储引擎,包含架构、表、表空间以及数据字典元数据的物理快照。该插件允许复制完整的数据目录,用于MySQL服务器的快速配置和同步。
克隆的主要用途
本地克隆:
- 实例备份:将MySQL实例备份到本地目录。
- 数据目录迁移:用于数据目录迁移,特别适用于由于目录大小规划不当或非逻辑卷管理等原因需要的同一机器上的数据移动。
远程克隆:
- 快速扩展MGR节点:通过远程克隆迅速为Group Replication添加新节点。
- 主从复制搭建:快速搭建主从复制的从库节点,简化从库的同步过程。
克隆插件使用的前提条件
- MySQL版本要求:源库(Donor)和目标库(Recipient)必须为MySQL 8.0.17或更高版本,并且版本号完全一致。此外,两者都需要安装Clone Plugin。
- 操作系统和架构要求:源库和目标库的操作系统、位数(32位或64位)需要一致。
- 字符集和校验集一致:包括
character_set_server
、collation_server
、character_set_filesystem
在内的字符集设置必须相同。 - InnoDB页面大小一致:
innodb_page_size
及innodb_data_file_path
的配置必须一致。 - 并发操作限制:当前版本只支持单次克隆操作,不支持并发克隆。未来版本可能会支持并发操作。
- Recipient需要重启:克隆完成后,目标库实例需要重启,因此应通过
mysqld_safe
或systemd
进行管理。
克隆操作的限制
- 事务与DDL操作的限制:在MySQL 8.0.27之前,克隆过程中允许DML(数据操作)并发执行,但DDL(数据定义)会被阻塞。8.0.27及之后版本支持启用
clone_block_ddl
参数,在不影响克隆的情况下允许并发DDL。 - 配置和日志文件不会克隆:Clone Plugin不会复制源库的配置文件和二进制日志文件。
- 仅支持InnoDB存储引擎:对于其他存储引擎的表,克隆只会复制表结构而不包含数据。
- 绝对路径要求:远程克隆时,目标目录的绝对路径必须存在并具备写权限。
- 克隆操作端口限制:不能使用X Protocol端口进行克隆操作。
克隆操作的类型
-
本地克隆:在同一服务器上克隆数据,常用于备份或数据目录的迁移。
- 语法:
sql<button class="flex gap-1 items-center py-1">复制代码</button>
CLONE LOCAL DATA DIRECTORY = 'clone_dir';
BACKUP_ADMIN
权限。
- 语法:
-
远程克隆:从远程MySQL实例(源库)克隆数据到本地实例(目标库)。数据通过网络传输,默认情况下会覆盖目标库的数据目录,但也可以指定其他目录以避免数据覆盖。
- 语法:
sql<button class="flex gap-1 items-center py-1">复制代码</button>
CLONE INSTANCE FROM 'user'@'host':port IDENTIFIED BY 'password' [DATA DIRECTORY = 'clone_dir'] [REQUIRE [NO] SSL];
- 语法:
关键参数
clone_ddl_timeout
:控制克隆操作等待DDL操作完成的最大时间,默认值为300秒。如果超时未获取到锁,克隆会失败。clone_autotune_concurrency
:决定是否自动调整克隆过程中并发线程数,默认开启。最大线程数受clone_max_concurrency
参数控制。clone_buffer_size
:设置本地克隆时的缓冲区大小,默认4MB。较大的缓冲区可以提高备份速度,但也增加了磁盘IO压力。clone_enable_compression
:远程克隆时是否启用压缩。压缩可以减少网络带宽占用,但会增加CPU的使用。clone_max_data_bandwidth
和clone_max_network_bandwidth
:分别限制克隆操作的数据传输和网络带宽,默认不限制。
克隆过程的监控和停止
-
查看克隆状态:
sql<button class="flex gap-1 items-center py-1">复制代码</button>SELECT * FROM performance_schema.clone_status\G;
该视图显示克隆操作的详细状态。
-
停止克隆操作: 通过
kill processlist_id
命令终止当前正在执行的克隆操作。
克隆操作的进度查看
克隆操作可以通过以下视图监控:
sql
<button class="flex gap-1 items-center py-1">复制代码</button>
SELECT * FROM performance_schema.clone_progress;
克隆的各个阶段进度会详细展示,包括数据的拷贝量、网络传输速度等。克隆通常包含以下几个阶段:
- DROP DATA:清空目标实例的现有数据。
- FILE COPY:文件拷贝。
- PAGE COPY:页面拷贝。
- REDO COPY:传输Redo日志。
- FILE SYNC:文件同步。
- RESTART和RECOVERY:目标实例重启并恢复数据。
克隆操作的主要步骤
- 初始化阶段(INIT):创建克隆任务并获取备份锁,阻止并发DDL操作。
- 文件拷贝阶段(FILE COPY):按照文件进行拷贝,并记录在此期间发生的页面修改。
- 页面拷贝阶段(PAGE COPY):将所有修改的页面数据拷贝至目标实例,同时开启Redo日志归档功能,确保所有增量日志都被保存。
- Redo日志拷贝阶段(REDO COPY):传输自页面拷贝以来的Redo日志,确保所有增量数据被同步。
- 完成阶段(FILE SYNC、RESTART、RECOVERY):目标实例重启,通过应用Redo日志完成数据恢复,确保数据一致性。