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

俊达1年前技术文章493

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插件

可以在配置文件中配置:

[mysqld]
plugin-load-add=mysql_clone.so


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

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



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

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS
    -> WHERE PLUGIN_NAME = 'clone';

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


本地clone

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

local_clone.png


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

GRANT BACKUP_ADMIN ON *.* TO 'clone_user';



使用clone local命令:

CLONE LOCAL DATA DIRECTORY  '/data/clone/mysql02_backup';


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

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


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

ERROR 1007 (HY000): Can't create database '/data/clone/mysql02_backup'; database exists


查看clone状态

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

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实例:

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


远程clone

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

remote_clone.png


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

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命令查看版本。

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等)来拉起接受者实例。如果缺少控制进程,则接受者实例关闭后,无法自动启动。

ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process).



远程clone操作步骤

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

mysql> CREATE USER 'donor'@'%' IDENTIFIED BY 'password';
mysql> GRANT BACKUP_ADMIN on *.* to 'donor'@'%';


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

CREATE USER 'recipient'@'' IDENTIFIED BY 'password';
GRANT CLONE_ADMIN on *.* to 'recipient'@'%';


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

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操作不支持复制使用绝对路径的通用表空间。


相关文章

MySQL运维实战(2.1) 登录失败次数太多导致主机被block的问题处理

参数max_connect_errorsMySQL有参数max_connect_errors,当一个主机尝试登录MySQL,失败的次数超过了max_connect_errors,则这个主机将无法登录到...

MySQL运维实战之备份和恢复(8.6)将数据库恢复到指定时间点

恢复到指定时间点使用全量备份和增量备份文件,都只能将数据库恢复到备份结束的时间。通过binlog,可以将数据库恢复到任意时间点(前提是备份和该时间点之间的binlog都存在)。找到时间点对应的binl...

MySQL运维实战(4.7) SQL_MODE之ANSI_QUOTES

默认情况下,mysql使用反引号(`)作为标识符的引号。使用mysql关键字作为表名、字段名会报语法错误,这时可以加上反引号( `),避免报错。设置ANSI_QUOTES后,使用双引号(")...

MySQL运维实战(5.5) 数据导入导出时的字符集问题

mysql可以使用load data/select into outfile或mysqldump工具进行数据导入导出。下面分别分析数据导入导出时的字符集相关问题。准备测试数据创建测试表,2个字段分别使...

 MySQL运维实战(1.3)安装部署:源码编译安装

MySQL运维实战(1.3)安装部署:源码编译安装

源码编译安装通常不需要自己编译mysql源码,编译的mysql和二进制包的内容基本一致。当然有些时候可能会需要采用源码编译的方式安装,安装一些非标准版本的mysql安装一些社区的patch、bugfi...

MySQL运维实战(5.3) MySQL数据乱码的一些情况

MySQL运维实战(5.3) MySQL数据乱码的一些情况

表数据乱码当数据的真实编码和相关参数(常见的包括character_set_client, character_set_result, 字段的编码,终端的编码)不一致时,会产生乱码。测试1 - 表中的...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。