当前位置: 首页 > news >正文

第九篇:数据库服务克隆应用

数据库克隆概念介绍

在数据库MySQL 8.0(8.0.17+)版本中,引入了数据库的克隆功能,主要是借助clone-plugin实现的,是对数据页底层克隆;

克隆的数据是InnoDB存储引擎中的物理快照信息,包括schemas, tables, tablespaces, and data dictionary metadata;

在数据库中出现克隆功能,主要是为了满足目前云原生的技术应用场景,同时也是为了海量数据备份而诞生的;

数据库服务克隆操作作用:

在实现大量数据迁移时,克隆效率最高

实现云主机数据资源迁移到物理主机

本地克隆(Local Cloning)

本地克隆即将本机MySQL实例的数据,原地快速生成一份完整的物理副本到同节点的一个目录里

1669564772486

 

远程克隆(Remote Cloning)

默认的远程克隆会覆盖接受者数据目录,也可选择克隆到其他目录以避免数据丢失

主要用于实现数据远程的快速热迁移操作,在迁移过程中,除了DDL操作情况,其他操作都不会出现阻塞情况(由于克隆开始时有一个短暂的备份锁,防止DDL操作导致元数据不一致)

还可以利用远程克隆技术,实现快速构建数据库的主从架构环境,实现主从数据信息快速复制同步;

1669564937916

数据库克隆原理

Page copy:

Page Tracking(页跟踪)的核心用途是:通过只记录和备份自上次备份后修改过的数据页,来大幅提升增量备份的速度和效率。

备份工具利用page tracking功能,获取自上次备份LSN点到本次备份开始的LSN点之间所有被修改过的数据页的列表

01 Page copy:
在进行数据页复制操作时,会涉及到两个操作动作:
开启redo archiving功能,从当前点开始存储新增的redo_log,这样从当前位置点开始所有的增量修改都不会丢失;
同时上一步在page track的page被发送到目标端,确保当前位置点之前所有做的变更一定发送到目标端;
关于redo archiving实际上这是官方早就存在的功能,主要用于官方的企业级备份工具,clone利用了该特性来维持记录增量产生的redo
在开始克隆前会做一次checkpoint;
对于redo archiving功能应用,会开启一个后台线程log_archiver_thread()来做日志归档;
当有新的写入时(notify_about_advanced_write_lsn),也会通知线程去进行归档,当arch_log_sys处于活跃状态时,
线程会控制日志写入以避免未归档的日志被覆盖(log_write_wait_on_archiver),注意如果log_write等待时间过长的话,
archive任务会被中断掉;

 

 

02 Redo copy:

停止redo archiving功能,所有归档的日志被发送到目标端,这些日志包含了从page copy阶段开始到现在的所有日志;

另外可能还需要记下当前的复制点,例如:最后一个事务提交时的binlog位置点或者gtid信息,在系统页中可以找到;

03 Done:

目标端重启实例,通过crash recovery将redo log应用上去;

克隆原理过程分析参考链接:https://zhuanlan.zhihu.com/p/437760913

说明:整个克隆过程都会以事件信息记录,可以很清晰的看到克隆的流程,如果克隆过程中断,也会以追加方式进行继续克隆;

在进行克隆功能应用时,也是存在一些限制性操作的:(结合官方列出的限制)

  • 对于MySQL 8.0.27之前版本,在进行克隆操作期间,是不允许在捐赠者和接受者上进行DDL操作,包括:truncate table操作;

    对于MySQL 8.0.27之后版本,在捐赠者上默认允许并发DDL操作,对于捐赠者上并发DDL的支持由clone_block_DDL变量控制;

  • 对于不同版本的MySQL数据库实例之间,是不能进行克隆操作的。对于捐赠者和接受者必须是确切相同数据库服务版本;

    例如:你不能克隆数据在between MySQL 5.7 and MySQL 8.0, or between MySQL 8.0.19 and MySQL 8.0.20;

    这个克隆功能只支持在数据库8.0.17版本或之后的版本

参考官方链接说明:https://dev.mysql.com/doc/refman/8.0/en/clone-plugin-limitations.html

数据库克隆功能实战

-- 进行克隆插件加载配置
mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
或者
[mysqld]
plugin-load-add=mysql_clone.so
clone=FORCE_PLUS_PERMANENT-- 查看克隆插件加载情况
mysql> select plugin_name,plugin_status from information_schema.plugins where plugin_name='clone';
+-------------+---------------+
| plugin_name | plugin_status |
+-------------+---------------+
| clone       | ACTIVE        |
+-------------+---------------+

-- 创建克隆专用用户
mysql> create user clone_user@'%' identified by 'password';
mysql> grant backup_admin on *.* to 'clone_user';
-- backup_admin权限时mysql8.0才有的备份导出的权限

 

 

本地克隆操作

克隆需求:实现快速创建和源数据库服务一模一样的多实例服务程序;

步骤一:进行本地克隆操作

[root@db01 ~]# mkdir -p /mysql_clone/

[root@db01 ~]# chown -R mysql:mysql /mysql_clone/
[root@db01 ~]# mysql -uclone_user -ppassword

mysql> clone local data directory='/mysql_clone/local';

将当前所在的 MySQL 服务器实例中的所有数据,创建一份完整的物理副本(快照),并将其保存到本机上的指定目录

步骤二:观测本地克隆状态(另开窗口使用管理员用户查看)

mysql> select stage,state,end_time from performance_schema.clone_progress;
+-----------+-------------+----------------------------+
| stage     | state       | end_time                   |
+-----------+-------------+----------------------------+
| DROP DATA | Completed   | 2025-09-14 14:57:35.861065 |
| FILE COPY | Completed   | 2025-09-14 14:57:38.288616 |
| PAGE COPY | Completed   | 2025-09-14 14:57:38.290706 |
| REDO COPY | Completed   | 2025-09-14 14:57:38.291421 |
| FILE SYNC | Completed   | 2025-09-14 14:57:39.450835 |
| RESTART   | Not Started | NULL                       |
| RECOVERY  | Not Started | NULL                       |
+-----------+-------------+----------------------------+

 

Stage精简介绍
DROP DATA 清空接收者数据目录,为接收新数据做准备。
FILE COPY 拷贝所有数据文件的物理块,是克隆耗时最长的阶段。
PAGE COPY 拷贝在文件拷贝阶段之后发生变更的数据页,确保数据一致性。
REDO COPY 拷贝文件拷贝期间产生的所有重做日志,用于后续恢复。
FILE SYNC 将数据刷写到磁盘,确保所有文件已持久化存储。
RESTART 重启接收者实例,以加载新克隆过来的数据。
RECOVERY 应用重做日志,将数据恢复到克隆结束时的一致性状态。
 
步骤三:启动运行克隆实例
[root@db01 ~]mysqld_safe --datadir=/mysql_clone/local --port=3333 \
--socket=/tmp/mysql_clone.sock --mysqlx=OFF --user=mysql \
--log-error=/tmp/mysql_clone.log &# --datadir=/mysql_clone/local:核心参数,指定克隆数据目录的路径。# --port=3333:指定新实例的端口,必须与原实例(3306)不同。# --socket=/tmp/mysql_clone.sock:极其重要! 指定一个唯一的socket文件,避免与原实例的 /tmp/mysql.sock 冲突。这是客户端连接本地实例的通道。# --mysqlx=OFF:禁用MySQL X Plugin,避免端口冲突。# --user=mysql:指定运行用户,必须有datadir的读写权限。# --log-error=/tmp/mysql_clone.log:指定该实例的错误日志文件,方便排查问题。# &:让命令在后台运行。# 核实查看克隆后数据库信息
[root@db01 ~]# mysql -S /tmp/mysql_clone.sock -u root -proot

 

 

 

 

 

 

 

http://www.wxhsa.cn/company.asp?id=3656

相关文章:

  • Anti-Proxy Attendance 题解
  • 【2024-2025第二学期】助教工作总结
  • 开始每小时记录日程
  • 5【鸿蒙/OpenHarmony/NDK】使用Node-API进行异步任务开发
  • 控制器指令
  • 题解:AT_abc421_c [ABC421C] Alternated
  • MySQL数据库:SQL数据类型
  • Ubuntu 安装
  • 幼等数论
  • 搭建rocketmq的三主三从遇到的坑
  • 深入解析:轻松Linux-9.进程间通信
  • 2025.9.14——1黄1绿
  • Ubuntu 中改图片大小
  • Day01
  • 认识眼图和眼图的参数
  • 【芯片设计-信号完整性 SI 学习 1.2 -- loopback 回环测试】 - 实践
  • 【科研绘图系列】R语言绘制地图和散点图 - 指南
  • Java NIO 学习小记
  • 扩展欧几里得算法求乘法逆元
  • redis实现缓存3-封装redis工具类
  • 高阻态
  • 鸿蒙应用开发从入门到实战(四):ArkTS 语言概述
  • 命令模式的深度解析:从标准实现到TPL Dataflow高性能架构
  • JavaWeb
  • 读书笔记:为什么数据在磁盘上的存放顺序如此重要?
  • Rcc_APBPeriphClockCmd()
  • 故障处理:ORA-19809: limit exceeded for recovery files
  • ORA-01555系列:二、ORA-01555的场景分析与解决方案
  • PySimpleGUI常用控件
  • 25.09.14 与其感慨路难行,不如马上出发