MySQL运维实战之Clone插件(10.1)使用Clone插件

作者:俊达

clone插件介绍

mysql 8.0.17版本引入了clone插件。使用clone插件可以对本地l或远程的mysql实例进行clone操作。clone插件会拷贝innodb存储引擎表,clone得到的是原数据库的一个一致性的快照,可以使用该快照数据来启动新的实例。clone插件还会记录数据库的binlog位点,可以将clone得到的实例作为源实例的备库。可以通过clone插件实习MySQL InnoDB存储引擎数据的物理备份。MySQL Group Replication中可以使用clone插件来初始化新节点的数据。

clone插件支持本地clone和远程clone两种模式。本地clone将clone数据存放在实例所在主机。远程clone涉及到两个实例,提供数据的实例称为捐赠者(Donor),接收数据的实例称为接收者(Recipient)。捐赠者将clone的数据,通过MySQL协议发送给接受者,接受者将数据存放到数据目录。

使用clone插件

安装clone插件

可以在配置文件中配置:

bash 复制代码
[mysqld]
plugin-load-add=mysql_clone.so

或者通过install plugin命令安装插件:

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

通过show plugins命令或查询plugins表查看插件状态:

bash 复制代码
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS
    -> WHERE PLUGIN_NAME = 'clone';

+-------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------+---------------+
| clone       | ACTIVE        |
+-------------+---------------+

本地clone

本地clone得到的数据文件和原实例(被clone的实例)存放在同一台主机。

使用clone local命令发起本地clone,需要指定clone数据的存放路径。执行clone命令的账号需要backup_admin权限。

bash 复制代码
GRANT BACKUP_ADMIN ON *.* TO 'clone_user';

使用clone local命令:

bash 复制代码
CLONE LOCAL DATA DIRECTORY  '/data/clone/mysql02_backup';

运行mysql的OS账号需要有相应路径的读写权限,不然clone命令会有以下错误:

bash 复制代码
ERROR 1006 (HY000): Can't create database '/data/clone/mysql02_backup/' (errno: 13 - Permission denied)

如果指定路径已经存在,clone命令也会报错:

bash 复制代码
ERROR 1007 (HY000): Can't create database '/data/clone/mysql02_backup'; database exists

查看clone状态

通过 performance_schema中的clone_status表,可以查询当前clone操作的状态:

bash 复制代码
mysql> select * from performance_schema.clone_status\G
*************************** 1. row ***************************
             ID: 1
            PID: 55
          STATE: Completed
     BEGIN_TIME: 2023-08-22 15:11:26.581
       END_TIME: 2023-08-22 15:11:36.646
         SOURCE: LOCAL INSTANCE
    DESTINATION: /data/clone/mysql02_backup/
       ERROR_NO: 0
  ERROR_MESSAGE:
    BINLOG_FILE:
BINLOG_POSITION: 0
  GTID_EXECUTED:
1 row in set (0.00 sec)

使用clone的数据启动实例

clone得到的文件,是原实例的一个一致性的快照,可以使用这些文件来启动mysql实例。clone只备份了innodb表,不备份mysql的配置文件。可手动创建一个配置文件,将datadir指向clone路径,就可以启动mysql实例:

bash 复制代码
##/data/clone/my.cnf
[mysqld]
port=3333
datadir=/data/clone/mysql02_backup
...
bash 复制代码
mysqld_safe --defaults-file=/data/clone/my.cnf &

远程clone

远程clone将数据从捐赠者(Donor)复制到接收者(Recipient)。接收者实例原有的数据会被清理掉。

使用clone instance命令发起远程clone:

bash 复制代码
CLONE INSTANCE FROM 'user'@'host':port
IDENTIFIED BY 'password'
[DATA DIRECTORY [=] 'clone_dir']
[REQUIRE [NO] SSL];

命令参数含义:

user:登陆捐赠者实例的用户名

host:捐赠者实例的主机名或IP

port:捐赠者实例的端口

password:捐赠者实例的密码

clone_dir:不指定clone_dir时,会清空接受者实例的datadir目录,并将数据放到datadir指定路径。如果指定了data directory,则该路径需要不存在,mysql服务需要有目录权限。

REQUIRE [NO] SSL:指定传输数据是是否使用加密协议。

远程clone前置条件

使用远程clone需要满足以下几点前置条件:

账号权限,捐赠者的账号需要有backup_admin权限。接受者的账号需要clone_admin权限。clone_admin权限包含backup_admin权限和shutdown权限。

捐赠者和接受者的版本需要保持一致。不仅大版本要一样,小版本也要一样。可使用show variables命令查看版本。

bash 复制代码
mysql> SHOW VARIABLES LIKE 'version';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| version       | 8.0.32 |
+---------------+--------+

捐赠者和接受者的运行平台和操作系统需要一致。

捐赠者和接受者都需要安装clone插件。

捐赠者和接受者字符集需要一样(character_set_server,collation_server)。

捐赠者和接受者的参数innodb_page_size,innodb_data_file_path需要一样。

接受者上,参数clone_valid_donor_list需要包含捐赠者的地址。

默认情况下,远程clone会在完成数据clone后,关闭接受者实例。需要有控制进程(如mysqld_safe脚本、systemctl等)来拉起接受者实例。如果缺少控制进程,则接受者实例关闭后,无法自动启动。

bash 复制代码
ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process).

远程clone操作步骤

1、在捐赠者实例上创建相关账号并授权

bash 复制代码
mysql> CREATE USER 'donor'@'%' IDENTIFIED BY 'password';
mysql> GRANT BACKUP_ADMIN on *.* to 'donor'@'%';

2、在接受者实例上创建账号并授权

bash 复制代码
CREATE USER 'recipient'@'' IDENTIFIED BY 'password';
GRANT CLONE_ADMIN on *.* to 'recipient'@'%';

3、登陆接受者实例,发起clone操作

bash 复制代码
CLONE INSTANCE FROM 'donor'@'host':port
IDENTIFIED BY 'password';

clone完成后,会自动重启接受者实例。

clone插件的限制

8.0.27版本之前,clone时,捐赠者和接受者都不允许进行DDL。从8.0.27版本开始,捐赠者默认可以进行DDL。可以由参数clone_block_ddl进行控制。clone_block_ddl设置为ON时,clone运行时,DDL会被阻塞。

一次只能clone一个实例。

clone插件不会复制mysql参数。clone时,不会将捐赠者实例的参数复制到接受者实例。

clone插件不会复制binlog。

clone插件只复制存储在innodb存储引擎中的数据。不会复制myisam、csv等其他存储引擎的数据。

不支持通过mysql router连接到捐赠者实例

本地clone操作不支持复制使用绝对路径的通用表空间。

更多技术信息请查看云掣官网https://yunche.pro/?t=yrgw

相关推荐
ghx_echo8 分钟前
linux系统下的磁盘扩容
linux·运维·服务器
hhzz38 分钟前
ansible自动化运维实战--script、unarchive和shell模块(6)
运维·自动化·ansible
阿狸的家2 小时前
ovs实现lb负载均衡
运维·云计算·负载均衡·ovs
乙己4077 小时前
计算机网络——网络层
运维·服务器·计算机网络
水瓶丫头站住8 小时前
安卓APP如何适配不同的手机分辨率
android·智能手机
xvch8 小时前
Kotlin 2.1.0 入门教程(五)
android·kotlin
不会飞的小龙人9 小时前
Docker Compose创建镜像服务
linux·运维·docker·容器·镜像
不会飞的小龙人10 小时前
Docker基础安装与使用
linux·运维·docker·容器
小歆88412 小时前
100%全国产化时钟服务器、全国产化校时服务器、全国产化授时服务器
运维·服务器
doubt。12 小时前
【BUUCTF】[RCTF2015]EasySQL1
网络·数据库·笔记·mysql·安全·web安全