##
精通MySQL Clone这一篇就够了
1、概述
MySQL 8.0.17 中引入的克隆插件允许在本地或从远程 MySQL 服务器实例克隆数据。克隆数据是存储的数据的物理快照,其中InnoDB包括架构、表、表空间和数据字典元数据。克隆的数据包含一个功能齐全的数据目录。主要场景为主从复制,组复制,开发测试等等。
2、分类
克隆分为本来克隆和远程克隆。利用图片我们可以很直观的理解。
本地克隆
远程克隆
名字分类:
捐赠者:源库,需要被克隆的库.
接收者:目标库,克隆之后的库。
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、约束
- 捐赠者和接收者必须是相同的 MySQL 服务器版本和版本(小版本也需要一致)。
- 捐赠者和接收者MySQL服务器实例必须运行在相同的操作系统和平台上。
- 一次仅允许一个克隆操作。
- 捐赠者和接收者必须具有相同的 MySQL 服务器字符集和排序规则。
- 克隆插件仅克隆存储在 InnoDB. 其他存储引擎数据不会被克隆。任何模式schema(mysql/infotrmation_schema/performation_schema/sys)中的MyISAM和 CSV存储引擎的在表都将克隆为空表。
- 不支持通过 MySQL Router 连接到捐赠者 MySQL 服务器实例。
- 无法从不同的 MySQL 服务器版本或版本克隆实例。捐赠者和接收者必须拥有完全相同的 MySQL 服务器版本和版本。例如,您无法在 MySQL 5.7 和 MySQL 8.0 之间或 MySQL 8.0.19 和 MySQL 8.0.20 之间进行克隆。仅 MySQL 8.0.17 及更高版本支持克隆插件。
- 在 MySQL 8.0.27 之前,在克隆操作期间不允许对捐赠者和接收者执行 DDL,包括(TRUNCATE TABLE) 。选择数据源时应考虑这一限制。解决方法是使用专用的捐赠者实例,它可以容纳在克隆数据时被阻止的 DDL 操作。允许并发 DML。从 MySQL 8.0.27 开始,默认情况下允许捐赠者并发 DDL。捐赠者上并发 DDL 的支持由变量控制 clone_block_ddl。