精通MySQL Clone这一篇就够了

##

精通MySQL Clone这一篇就够了


1、概述

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

2、分类

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

本地克隆

精通MySQL Clone这一篇就够了

远程克隆

精通MySQL Clone这一篇就够了

名字分类:

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

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

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. 1. 捐赠者和接收者必须是相同的 MySQL 服务器版本和版本(小版本也需要一致)。

  2. 2. 捐赠者和接收者MySQL服务器实例必须运行在相同的操作系统和平台上。

  3. 3. 一次仅允许一个克隆操作。

  4. 4. 捐赠者和接收者必须具有相同的 MySQL 服务器字符集和排序规则。

  5. 5. 克隆插件仅克隆存储在 InnoDB. 其他存储引擎数据不会被克隆。任何模式schema(mysql/infotrmation_schema/performation_schema/sys)中的MyISAM和 CSV存储引擎的在表都将克隆为空表。

  6. 6. 不支持通过 MySQL Router 连接到捐赠者 MySQL 服务器实例。

  7. 7. 无法从不同的 MySQL 服务器版本或版本克隆实例。捐赠者和接收者必须拥有完全相同的 MySQL 服务器版本和版本。例如,您无法在 MySQL 5.7 和 MySQL 8.0 之间或 MySQL 8.0.19 和 MySQL 8.0.20 之间进行克隆。仅 MySQL 8.0.17 及更高版本支持克隆插件。

  8. 8. 在 MySQL 8.0.27 之前,在克隆操作期间不允许对捐赠者和接收者执行 DDL,包括(TRUNCATE TABLE) 。选择数据源时应考虑这一限制。解决方法是使用专用的捐赠者实例,它可以容纳在克隆数据时被阻止的 DDL 操作。允许并发 DML。从 MySQL 8.0.27 开始,默认情况下允许捐赠者并发 DDL。捐赠者上并发 DDL 的支持由变量控制 clone_block_ddl。


原文始发于微信公众号(库海无涯):精通MySQL Clone这一篇就够了

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/241269.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!