mysql clone

【1】Clone 克隆

(1.1)基本介绍

MySQL 8.0.17 中引入的克隆插件允许在本地或从远程 MySQL 服务器实例克隆数据。

克隆数据是存储在其中的数据的物理快照InnoDB,包括模式、表、表空间和数据字典元数据。克隆的数据包含一个功能齐全的数据目录,允许使用克隆插件进行 MySQL 服务器配置。

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

    

 

远程克隆操作涉及启动克隆操作的本地 MySQL 服务器实例(接收者)和远程 MySQL 服务器实例( 捐赠者) 源数据所在的位置。

当在接受者上启动远程克隆操作时,克隆的数据通过网络从捐赠者传输到接受者。默认情况下,远程克隆操作会在从捐赠者克隆数据之前从接收者数据目录中删除现有的用户创建的数据(模式、表、表空间)和二进制日志。

或者,您可以将数据克隆到收件人上的不同目录,以避免从当前收件人数据目录中删除数据。

与远程克隆操作相比,本地克隆操作克隆的数据没有区别。这两个操作都克隆了同一组数据。

【2】clone 插件安装与使用

(2.0)克隆限制

  • 版本大于等于8.0.17且不支持跨版本

  • 两台机器具有相同的操作系统OS

  • 两台MySQL实例具体相同的 innodb_page_size 和 innodb_data_file_path(ibdata文件名)

  • 同一时刻仅仅允许有一个克隆任务存在

  • recipient 需要设置变量clone_valid_donor_list

  • max_allowed_packet 大于2M

  • doner的undo表空间文件名称不能重复

  • 不会克隆my.cnf文件

  • 不会克隆binlog

  • 仅仅支持innodb引擎

  • SELECT * FROM performance_schema.clone_progress;  -- 查看克隆进度

 

(2.1)安装

配置文件配置:

[mysqld]
plugin-load-add=mysql_clone.so
clone=FORCE_PLUS_PERMANENT  # 如果克隆插件没加载好,则无法启动 mysql 服务

  如果要防止服务器在没有克隆插件的情况下运行,请使用 --clone=FORCE 或  FORCE_PLUS_PERMANENT在插件未成功初始化的情况下强制服务器启动失败。

在线启用:

INSTALL PLUGIN clone SONAME 'mysql_clone.so';
SELECT PLUGIN_NAME, PLUGIN_STATUS  FROM INFORMATION_SCHEMA.PLUGINS  WHERE PLUGIN_NAME = 'clone';

 

(2.2)本地克隆数据

《1》克隆的账户需要 backup_admin 权限

《2》本地克隆案例

CLONE LOCAL DATA DIRECTORY = '/data1/clone_dir';
SELECT * FROM performance_schema.clone_progress; -- 查看克隆进度

  注意,前面的目录必须存在,如上面的 /data1,但最后一个 clone_dir 必须不存在;

操作前看到:master status

  

 

操作后

  

我们已新目录启动:mysqld_safe --datadir=/data/clone_dir

  

 

再看 master 等信息

  

 

也没有什么变化,但好像自动切

(2.3)克隆远程数据

CLONE INSTANCE FROM 'user'@'host':port

IDENTIFIED BY 'password'

[ DATA DIRECTORY [ = ] 'clone_dir' ]

[ REQUIRE [ NO ] SSL ]

 

其中,

  • user 是donor MySQL服务器实例的用户名;

  • password是user的密码;

  • host是donor MySQL服务器实例的hostname地址,目前支持IPv4,不支持IPv6,但可使用别名;

  • port是donor MySQL服务器实例的端口号;

  • DATA DIRECTORY [ = ] 'clone_dir'是可选的子句用于指定接收克隆数据的目录,不指定该选项会覆盖已存在的数据文件,指定该选项可将克隆数据传输至该目录;

  • REQUIRE [ NO ] SSL显式指定是否使用加密连接;

执行克隆操作,克隆插件必须在donor和recipient MySQL服务器实例激活,在donor服务器实例,克隆用户需要BACKUP_ADMIN权限,在recipient服务器实例,克隆用户需要CLONE_ADMIN权限;

CLONE_ADMIN权限包括BACKUP_ADMIN和SHUTDOWN权限。

执行CLONE INSTANCE语句需满足下面的先决条件:

  • donor和recipient必须有相同的MySQL服务器版本,克隆插件在8.0.17版本后支持;

  • donor和recipient必须运行在相同的操作系统和平台;

  • 克隆数据,recipient必须有足够的磁盘空间;

  • InnoDB需要在数据目录外面创建表空间,可通过INFORMATION_SCHEMA.FILES查看;

  • 克隆插件必须在donor和recipient激活,可通过SHOW PLUGINS查看;

  • donor和recipient必须有相同的MySQL服务器字符集和排序规则;

  • donor和recipient需要有相同的innodb_page_size和innodb_data_file_path设置;

  • 若克隆加密或页压缩的数据,donor和recipient必须有相同的文件系统块大小;

  • 若克隆加密的数据,需要安全的连接;

  • recipient上的clone_valid_donor_list设置必须包括donor MySQL服务器实例的主机地址;

  • 一次只能有一个克隆操作,克隆期间不能有其他克隆操作,可通过clone_status查看;

  • 克隆插件以1MB数据包和元数据的形式传输数据,在donor和recipient MySQL服务器实例上所需的最小max_allowed_packet是2MB;

  • donor上的Undo表空间文件名必须唯一,当数据克隆到recipient,undo表空间克隆到recipient 上innodb_undo_directory指定的位置或DATA DIRECTORY [ = ] 'clone_dir' 子句指定的目录;

  • 默认,recipient MySQL服务器实例在克隆数据完成后自动重启;

  • 几个变量控制远程克隆操作的各个方面;

实际演示:

  注意:默认将数据克隆到recipient端的数据目录,并使用donor的数据进行覆盖,然后进行自动重启recipient端的MySQL服务器实例

 

-- 1)登录到 donor MySQL服务器实例,创建用户并安装插件(若安装可忽略)
create user 'donor_clone_user'@'192.168.191.%' identified by 'donor_clone_user';
grant backup_admin on *.* to donor_clone_user@'192.168.191.%';
install plugin clone soname 'mysql_clone.so';
-- 2)登录到 recipient MySQL服务器实例,创建账户并安装插件,并设置clone_valid_donor_list
create user recipient_clone_user@'192.168.191.%' identified by 'recipient_clone_user';
grant clone_admin,backup_admin on *.* to recipient_clone_user@'192.168.191.%';
install plugin clone soname 'mysql_clone.so';
set global clone_valid_donor_list='192.168.191.25:3306';

-- 3)登录到 recipient MySQL服务器实例,使用 recipient_clone_user用户或root用户执行克隆操作,操作完成后会自动重启
-- (3.1)不指定 data directory,会覆盖当前实例目录,然后自动重启
clone instance from 'donor_clone_user'@'192.168.191.25':3306 identified by 'donor_clone_user';
-- (3.2)指定 data directory 目录
clone instance from 'donor_clone_user'@'192.168.191.25':3306 identified by 'donor_clone_user' data directory='/mysql/clone/clone_data';

 

最终成功;

默认将数据克隆到recipient端的数据目录,并使用donor的数据进行覆盖,然后进行自动重启recipient端的MySQL服务器实例

  

 

 

【参考文档】

clone 主从: https://blog.csdn.net/weixin_28864167/article/details/113598578

posted @ 2022-05-23 17:21  郭大侠1  阅读(264)  评论(0编辑  收藏  举报