暂无图片
暂无图片
9
暂无图片
暂无图片
暂无图片

精通MySQL Clone这一篇就够了

原创 DBA周技 2023-08-13
1631

##

精通MySQL Clone这一篇就够了

1、概述

MySQL 8.0.17 中引入的克隆插件允许在本地或从远程 MySQL 服务器实例克隆数据。克隆数据是存储的数据的物理快照,其中InnoDB包括架构、表、表空间和数据字典元数据。克隆的数据包含一个功能齐全的数据目录。主要场景为主从复制,组复制,开发测试等等。

2、分类

克隆分为本来克隆和远程克隆。利用图片我们可以很直观的理解。
本地克隆
clonelocal.png
远程克隆
cloneremote.png

名字分类:

捐赠者:源库,需要被克隆的库.

接收者:目标库,克隆之后的库。

3、克隆插件的安装与卸载
3.1、参数文件方法

1.编辑my.cnf文件

[mysqld] plugin-load-add=mysql_clone.so clone=FORCE_PLUS_PERMANENT
复制

2.重启数据库并检查插件状态

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'clone'; +------------------------+---------------+ | PLUGIN_NAME | PLUGIN_STATUS | +------------------------+---------------+ | clone | ACTIVE | +------------------------+---------------+
复制

这里注意在linux和windows下,插件的后缀不一样。

3.2、install方法

1.install安装

mysql> install plugin clone soname 'mysql_clone.so';
复制

2.状态检查

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'clone'; +------------------------+---------------+ | PLUGIN_NAME | PLUGIN_STATUS | +------------------------+---------------+ | clone | ACTIVE | +------------------------+---------------+
复制

这种方法无需重启(推荐).

4、本地克隆实战
4.1、安装clone插件,方法如上所述
4.2、.创建用于执行克隆操作的用户,并授权。(也可以使用root).授权如下
GRANT BACKUP_ADMIN ON *.* TO 'clone_user';
复制
3.使用创建的用户执行clone操作
mysql> clone local data directory ='/mysql/backup/clonetest'; Query OK, 0 rows affected (12.86 sec)
复制

这里/mysql/backup/这个目录是存在的,但是clonetest这个目录是不存在的(本来克隆的要求,mysql用户要有这个目录的读写权限)

4、如何启动和停止克隆数据库

需要拷贝一份参数文件,然后修改参数文件中的目录和端口号等。然后指定参数文件和数据目录启动

[root@mydb01 3306]# cp my.cnf myclone.cnf [root@mydb01 3306]# vi myclone.cnf [root@mydb01 3306]# mysqld_safe --defaults-file=/mysql/data/3306/myclone.cnf --datadir=/mysql/backup/clonetest &
复制

登录测试

[root@mydb01 ~]# mysql -uroot -proot -P3307 -h127.0.0.1
复制

停止数据库

[root@mydb01 3306]# mysqladmin -uroot -proot -P3307 -h127.0.0.1 shutdown
复制
5、远程克隆实战

这里192.168.5.130是捐赠者,192.168.5.140是接收者

1.使用管理用户帐户登录到捐赠者 MySQL 服务器实例。

创建具有该权限的克隆用户 BACKUP_ADMIN。

mysql> create user 'donor_clone_user'@'192.168.5.140' identified by 'Clone@123'; Query OK, 0 rows affected (0.01 sec) mysql> grant backup_admin on *.* to 'donor_clone_user'@'192.168.5.140'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)
复制

安装克隆插件:

mysql> install plugin clone soname 'mysql_clone.so';
复制

2.使用管理用户帐户登录到接收方 MySQL 服务器实例。

创建具有该权限的克隆用户 CLONE_ADMIN。

mysql> create user 'recipient_clone_user'@'192.168.5.140' identified by 'Clone@123'; Query OK, 0 rows affected (0.03 sec) mysql> grant clone_admin on *.* to 'recipient_clone_user'@'192.168.5.140'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.01 sec)
复制

安装克隆插件:

mysql> install plugin clone soname 'mysql_clone.so'; Query OK, 0 rows affected (0.06 sec)
复制

将捐赠者 MySQL 服务器实例的主机地址添加到 clone_valid_donor_list 变量设置中。

mysql> set global clone_valid_donor_list = '192.168.5.130:3306'; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'clone_valid_donor_list'; +------------------------+--------------------+ | Variable_name | Value | +------------------------+--------------------+ | clone_valid_donor_list | 192.168.5.130:3306 | +------------------------+--------------------+ 1 row in set (0.01 sec) root@localhost [(none)] (10:02:17) > \q
复制

以您之前创建的克隆用户登录到接收方 MySQL 服务器实例并执行该 CLONE INSTANCE语句。

[root@db02 app]# mysql -urecipient_clone_user -pClone@123 -h192.168.5.140 recipient_clone_user@192.168.5.140 [(none)] (10:06:12) > clone instance from 'donor_clone_user'@'192.168.5.130':3306 identified by 'Clone@123'; ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process).
复制

数据克隆完成后,(接收方的MySQL服务器实例会自动重启。)不会自动启动,需要手工启动

recipient_clone_user@192.168.5.140 [(none)] (10:06:22) > \q Bye [root@db02 app]# systemctl restart mysqld
复制

这里克隆之后是启动失败的,这是正常的需要手工启动

6、克隆状态检查

常用的两张表用于监控复制的状态,分别是Performance Schema的表clone_status和clone_progress。

检查状态

mysql> select state from performance_schema.clone_status; +-----------+ | STATE | +-----------+ | Completed | +-----------+
复制

检查复制的阶段(引至官网)

mysql> SELECT STAGE, STATE, END_TIME FROM performance_schema.clone_progress; +-----------+-----------+----------------------------+ | stage | state | end_time | +-----------+-----------+----------------------------+ | DROP DATA | Completed | 2019-01-27 22:45:43.141261 | | FILE COPY | Completed | 2019-01-27 22:45:44.457572 | | PAGE COPY | Completed | 2019-01-27 22:45:44.577330 | | REDO COPY | Completed | 2019-01-27 22:45:44.679570 | | FILE SYNC | Completed | 2019-01-27 22:45:44.918547 | | RESTART | Completed | 2019-01-27 22:45:48.583565 | | RECOVERY | Completed | 2019-01-27 22:45:49.626595 | +-----------+-----------+----------------------------+
复制
7、复制中的一些操作记录

目前用于主从复制(binlog、gtid),组复制都是没问题的。克隆插件支持复制。除了克隆数据之外,克隆操作还从捐赠者处提取并传输复制坐标,并将其应用到接收者上,这样就可以使用克隆插件来配置组复制成员和副本。使用克隆插件进行配置比复制大量事务要快得多且更高效。还可以将组复制成员配置为使用克隆插件作为替代恢复方法,以便成员自动选择最有效的方式从种子成员检索组数据。克隆插件支持克隆加密和页面压缩数据。

7.1、binlog重要语句

复制中关于binlog最重要的就是找到文件名和pos位置,接收者执行

root@localhost [(none)] (11:09:03) > SELECT BINLOG_FILE, BINLOG_POSITION FROM performance_schema.clone_status; +--------------------+-----------------+ | BINLOG_FILE | BINLOG_POSITION | +--------------------+-----------------+ | mydb-binlog.000037 | 337785247 | +--------------------+-----------------+ 1 row in set (0.00 sec)
复制
7.2、表的存储引擎检查

适用于gtid和binlog场景

mysql> SELECT a.TABLE_SCHEMA as '数据库', a.`ENGINE` as '存储引擎', COUNT(*) as '表数量',sys.format_bytes(SUM(DATA_LENGTH)) AS '数据容量',sys.format_bytes(SUM(INDEX_LENGTH)) AS '索引容量', sys.format_bytes(SUM(DATA_LENGTH+INDEX_LENGTH)) AS '总容量' FROM information_schema.`TABLES` a where TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA not in ('mysql','sys','performance_schema','information_schema') GROUP BY a.TABLE_SCHEMA , a.`ENGINE` ORDER BY a.`ENGINE`; +-----------+--------------+-----------+--------------+--------------+-----------+ | 数据库 | 存储引擎 | 表数量 | 数据容量 | 索引容量 | 总容量 | +-----------+--------------+-----------+--------------+--------------+-----------+ | db01 | InnoDB | 2 | 32.00 KiB | 0 bytes | 32.00 KiB | | test_db | InnoDB | 21 | 50.33 MiB | 3.19 MiB | 53.52 MiB | +-----------+--------------+-----------+--------------+--------------+-----------+ 2 rows in set (0.00 sec)
复制
8、注意事项
8.1、克隆和并发DDL

在 MySQL 8.0.27 之前,克隆操作期间不允许对捐赠者和接收者 MySQL Server 实例进行 DDL 操作(包括TRUNCATE TABLE )。选择数据源时应考虑这一限制。

解决方法是使用专用的捐赠者实例,它可以容纳在克隆数据时被阻止的 DDL 操作。

为了防止克隆操作期间并发 DDL,需要在捐赠者和接收者上获取独占备份锁。该clone_ddl_timeout变量定义克隆操作等待备份锁定的捐赠者和接收者的时间(以秒为单位)。

默认设置为 300 秒。如果在指定的时间限制内未获得备份锁,则克隆操作将失败并出现错误。

从 MySQL 8.0.27 开始,默认情况下允许捐赠者并发 DDL。对捐赠者的并发 DDL 支持由变量控制clone_block_ddl。可以使用语句动态启用和禁用并发 DDL 支持SET。

SET GLOBAL clone_block_ddl={OFF|ON}
复制

默认设置为 clone_block_ddl=OFF,允许在捐赠者上并发 DDL。

并发DDL操作是否克隆的效果取决于DDL操作是否在克隆操作拍摄动态快照之前完成。

无论设置如何,克隆操作期间都不允许的 DDL 操作 clone_block_ddl包括:

  • - ALTER TABLE tbl_name DISCARD TABLESPACE; - ALTER TABLE tbl_name IMPORT TABLESPACE; - ALTER INSTANCE DISABLE INNODB REDO_LOG;
    复制
8.2、加密与压缩

mysql克隆支持加密与压缩,但是一句话总结,如无必要不要使用

8.3、约束
  1. 捐赠者和接收者必须是相同的 MySQL 服务器版本和版本(小版本也需要一致)。
  2. 捐赠者和接收者MySQL服务器实例必须运行在相同的操作系统和平台上。
  3. 一次仅允许一个克隆操作。
  4. 捐赠者和接收者必须具有相同的 MySQL 服务器字符集和排序规则。
  5. 克隆插件仅克隆存储在 InnoDB. 其他存储引擎数据不会被克隆。任何模式schema(mysql/infotrmation_schema/performation_schema/sys)中的MyISAM和 CSV存储引擎的在表都将克隆为空表。
  6. 不支持通过 MySQL Router 连接到捐赠者 MySQL 服务器实例。
  7. 无法从不同的 MySQL 服务器版本或版本克隆实例。捐赠者和接收者必须拥有完全相同的 MySQL 服务器版本和版本。例如,您无法在 MySQL 5.7 和 MySQL 8.0 之间或 MySQL 8.0.19 和 MySQL 8.0.20 之间进行克隆。仅 MySQL 8.0.17 及更高版本支持克隆插件。
  8. 在 MySQL 8.0.27 之前,在克隆操作期间不允许对捐赠者和接收者执行 DDL,包括(TRUNCATE TABLE) 。选择数据源时应考虑这一限制。解决方法是使用专用的捐赠者实例,它可以容纳在克隆数据时被阻止的 DDL 操作。允许并发 DML。从 MySQL 8.0.27 开始,默认情况下允许捐赠者并发 DDL。捐赠者上并发 DDL 的支持由变量控制 clone_block_ddl。

扫码_搜索联合传播样式标准色版.png

最后修改时间:2023-08-14 10:04:34
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

目录
  • 1、概述
  • 2、分类
  • 3、克隆插件的安装与卸载
    • 3.1、参数文件方法
    • 3.2、install方法
  • 4、本地克隆实战
    • 4.1、安装clone插件,方法如上所述
    • 4.2、.创建用于执行克隆操作的用户,并授权。(也可以使用root).授权如下
    • 3.使用创建的用户执行clone操作
    • 4、如何启动和停止克隆数据库
  • 5、远程克隆实战
  • 6、克隆状态检查
  • 7、复制中的一些操作记录
    • 7.1、binlog重要语句
    • 7.2、表的存储引擎检查
  • 8、注意事项
    • 8.1、克隆和并发DDL
    • 8.2、加密与压缩
    • 8.3、约束