MySQL篇—通过Clone插件进行本地克隆数据(第二篇,总共三篇)

在上一篇文章中,我们深入探讨了Clone技术的多种用途,以及使用它所需满足的前提条件。我们也详细分析了Clone存在的限制,并深入了解了其背后的备份原理。今天,我们将继续探索MySQL Clone Plugin的强大功能,Clone其实最重要的就是克隆数据了,包括本地克隆数据和远程克隆数据两种方式,本地克隆数据作为Clone介绍的第二篇,今天我们将重点介绍如何通过clone进行本地克隆数据。我将详细介绍本地克隆的步骤、注意事项以及可能出现的问题和解决方案。通过实际操作,我们将更深入地理解Clone在数据库管理中的重要性,并体验其带来的便利性。

官方文档对本地克隆数据的详细介绍:

MySQL :: MySQL 8.0 Reference Manual :: 5.6.7.2 Cloning Data Locally


本地克隆数据的用途:

1、备份实例到本地

2、对数据目录进行迁移(本地克隆进行迁移一般情况下是为了当前目录没有规划好大小并且不是逻辑卷而进行的同机迁移,今天主要介绍这种)

本地克隆数据语法:

本地克隆操作从MySQL服务器实例中克隆数据,其中克隆操作启动到MySQL服务器实例运行的同一服务器或节点上的目录。

语法:

CLONE LOCAL DATA DIRECTORY [=] 'clone_dir'; ---用户需要有BACKUP_ADMIN权限

如何停止本地克隆:

SQL> select * from performance_schema.clone_status\G; ---克隆操作的状态

PID Processlist ID。对应show processlist中的Id,如果要终止当前的克隆操作,执行kill processlist_id命令即可。

SQL> Kill+id号;

本地克隆相关视图:

SQL> select * from performance_schema.clone_status\G; ---克隆操作的状态

PID Processlist ID。对应show processlist中的Id,如果要终止当前的克隆操作,执行kill processlist_id命令即可。

STATE 克隆操作的状态,Not Started(克隆尚未开始),In Progress(克隆中),Completed(克隆成功),Failed(克隆失败)。如果是Failed状态,ERROR_NO,ERROR_MESSAGE会给出具体的错误编码和错误信息。

BEGIN_TIME 克隆操作开始

END_TIME: 克隆结束时间。

SOURCE: Donor(源库)实例的地址。

DESTINATION 克隆目录。"LOCAL INSTANCE"代表当前实例的数据目录。

BINLOG_FILE 克隆完成后的file号

BINLOG_POSITION file的pos点

GTID_EXECUTED 克隆的gtid点,可利用这些信息来搭建从库。

SQL> select

stage,

state,

cast(begin_time as DATETIME) as "START TIME",

cast(end_time as DATETIME) as "FINISH TIME",

lpad(sys.format_time(power(10,12) * (unix_timestamp(end_time) - unix_timestamp(begin_time))), 10, ' ') 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(round(data*100/estimate, 0), "%"), 7, ' ')

when end_time is NULL then lpad('0%', 7, ' ')

else lpad('100%', 7, ' ')

end as "Done(%)"

from performance_schema.clone_progress;

STAGE: 一个克隆操作可依次细分为DROP DATA,FILE COPY,PAGE COPY,REDO COPY,FILE SYNC,RESTART,RECOVERY等7个阶段。当前阶段结束了才会开始下一个阶段。本地克隆只涉及到前五个阶段完成DROP DATA,FILE COPY,PAGE COPY,REDO COPY,FILE SYNC,远程克隆涉及到七个阶段

STATE: 当前阶段的状态。有三种状态:Not Started,In Progress,Completed。

BEGIN_TIME: 当前阶段的开始时间和结束时间。

END_TIME: 当前阶段的开始时间和结束时间。

THREADS: 当前阶段使用的并发线程数。并发线程数一般由 clone_autotune_concurrency 参数 自动调节 默认为ON 此时 该参数 最大线程数受clone_max_concurrency参数控制。若设置为OFF 则并发线程数的数量将是固定的 clone_max_concurrency参数 保持 一致。clone_max_concurrency参数的默认值为16。

ESTIMATE: 预估的数据量。

DATA: 已经拷贝的数据量。

NETWORK: 通过网络传输的数据量。如果是本地克隆,该列的值为0。

DATA_SPEED: 当前数据拷贝的速率。注意,是当前值。

NETWORK_SPEED: 当前网络传输的速率。注意,是当前值。

案例开始(通过本地克隆对数据目录进行迁移):

(1)首先先安装Clone(数据克隆)插件(插件安装):

mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so'; ---这种是手动在线安装插件,不需要重启,并且重启后也不会失效。

(2)查看插件状态是否active:

mysql> show plugins;

(3)在实例上创建克隆用户:

mysql> create user 'donor_clone_user'@'%' identified by '123456';

mysql> grant backup_admin on *.* to 'donor_clone_user'@'%';

(4) 创建clone目录(也就是迁移的目录)

root@mysql8 \~\]# mkdir /clone_dir \[root@mysql8 \~\]# chown -R mysql:mysql /clone_dir

(5)了解本地克隆数据对DDL的影响

DML:不影响

mysql> insert into itpux values (23);

Query OK, 1 row affected (0.81 sec)

DDL:长期不返回,需要等到克隆完成 (不过可以通过设置 clone_ddl_timeout参数在克隆期间允许DDL不过会导致克隆失败,在8.0.27版本新增 clone_block_ddl参数在克隆期间允许DDL同时不会导致克隆失败)

mysql> create table itdwd (id int);

无响应

(6)设置克隆期间允许DDL(为了在克隆期间允许DDL,设置 clone_ddl_timeout参数为0,虽然会导致克隆失败但要保证DDL不受影响。8.0.27版本新增clone_block_ddl参数在克隆期间允许DDL同时不会导致克隆失败。这个设置可选

mysql> set global clone_ddl_timeout=0; --- 设置为0意味着克隆操作不会等待备份锁。在这种情况下 执行并发DDL操作可能导致克隆操作失败 ,设置为其他数值发现还是需要等到克隆完成,只有设置为0。

(7)Clone(数据克隆)发起克隆命令

root@slave \~\]# mysql -udonor_clone_user -p123456 -S /var/lib/mysql/mysql.sock mysql\> clone local data directory='/clone_dir/3306'; ****其中/clone_dir/**** ****3306**** ****是克隆目录,其需满足以下几点要求:**** ****1、克隆目录必须是绝对路径。**** ****2、/**** ****clone_dir**** ****必须存在**** ****,**** ****且MySQL对其有可写权限。**** ****3、330**** ****6**** ****不能存在。**** ****注:**** ****本地克隆只涉及到五个阶段完成DROP DATA,FILE COPY,PAGE COPY,REDO COPY,FILE SYNC,远程克隆涉及到七个阶段,也是就说本地克隆完成不会重启数据库(RESTART)和数据一致性效验(RECOVERY)****

(8)查看克隆操作

mysql> select * from performance_schema.clone_status\G; ---克隆操作的状态

mysql> select

stage,

state,

cast(begin_time as DATETIME) as "START TIME",

cast(end_time as DATETIME) as "FINISH TIME",

lpad(sys.format_time(power(10,12) * (unix_timestamp(end_time) - unix_timestamp(begin_time))), 10, ' ') 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(round(data*100/estimate, 0), "%"), 7, ' ')

when end_time is NULL then lpad('0%', 7, ' ')

else lpad('100%', 7, ' ')

end as "Done(%)"

from performance_schema.clone_progress; ---克隆的进度信息。本地克隆只涉及到五个阶段完成DROP DATA,FILE COPY,PAGE COPY,REDO COPY,FILE SYNC,远程克隆涉及到七个阶段,也是就说本地克隆完成不会重启数据库(RESTART)和数据一致性效验(RECOVERY)

(9)查看当前数据库的数据文件路径并关闭实例

mysql> show variables like '%datadir%';

root@mgr1 3306\]# service mysqld stop

(10)修改数据文件路径参数指向新的逻辑卷目录

root@mgr1 3306\]# vi /mysql/data/3306/my.cnf ![](https://file.jishuzhan.net/article/1745756796082982913/892edbae81200ebe5a846d49aeea4f00.webp)

(11)如果是通过linux服务启动(service)还需要修改服务启动脚本

root@mgr1 3306\]# vi /etc/init.d/mysqld ****修改一:****目录和数据存储目录 ![](https://file.jishuzhan.net/article/1745756796082982913/da59e416871c865fcd9acc4dc6833c04.webp) ****修改二:****相关目录和数据存储目录 ![](https://file.jishuzhan.net/article/1745756796082982913/da605be27d0296d4311663ec717e6329.webp) ****修改三:****不用修改,调用的变量 ![](https://file.jishuzhan.net/article/1745756796082982913/44fc3beb480d66e2f3403e8bc358829c.webp)

(12)启动实例,验证相关目录

root@mgr1 3306\]# service mysqld start mysql\> show variables like '%datadir%'; ![](https://file.jishuzhan.net/article/1745756796082982913/46b2473f774852e8e5ce9f0eb7777ad5.webp) ****验证:**** mysql\> show databases; mysql\> select table_name from information_schema.tables; mysql\> select \* from ded.itpuxbak11; mysql\> select \* from itpuxdb.emp; mysql\> select \* from itpuxdb.yg; ---能查询到数据,表示数据恢复的没问题。****可能存在表不能查询的情况,那么就是数据字典没有记录表的问题,需要多验证几张****

相关推荐
此心光明事上练3 分钟前
大厂级企业后端:配置变更与缓存失效的自动化处理方案
运维·缓存·自动化
lang201509287 分钟前
MySQL 8.0原子性DDL全面解析
数据库·mysql
java_logo15 分钟前
Docker 部署 MinIO 全指南
运维·windows·mongodb·docker·容器
拾光Ծ25 分钟前
【Linux】“ 权限 “ 与相关指令
linux·运维·服务器
To_再飞行29 分钟前
Linux Bash(一)
linux·运维·服务器·bash
我狸才不是赔钱货32 分钟前
DevOps:打破开发与运维之间的高墙
运维·vscode·docker·devops
viperrrrrrrrrr71 小时前
milvus向量数据库
数据库·大模型·llm·milvus
白衣鸽子1 小时前
MySql数据库同步技术:构建高可用架构的基石
数据库·后端
GeekAGI1 小时前
ansible-playbook -e 传递变量
运维
chenzfp1 小时前
【运维】鲲鹏麒麟V10 操作系统aarch64自制OpenSSH 9.8p1 rpm包 ssh漏洞修复
运维·ssh