文章目录
简介
Clone插件可以克隆数据到本机其他目录,也可以从远端MySQL实例克隆数据到本机。克隆的数据是一个物理的快照,包含在InnoDB中存储的schema
,tables
,tablespaces
以及数据目录元数据。Clone插件除了克隆数据外,克隆操作还可以从donor获取复制位点,并将其应用于recipient,这使得可以使用clone插件来提供组复制成员和主从复制。使用clone plugin要比正常做主从备份恢复数据快得多,效率也高得多 。
- 本地克隆:克隆数据到MySQL服务器实例运行的同一服务器的目录。
- 远程克隆:远程克隆中有2个角色,负责接受克隆数据的recipient(受体),负责发送数据的donor(捐助人),当recipient启动clone,donor通过网络将数据传输给recipient,这个操作会删除recipient原数据目录下的文件,并用克隆过来的数据代替它,如果需要保留原有数据,可以将数据复制到recipient的另一个目录,避免删除原有数据。
安装插件
配置文件
配置文件中加一项配置,如下:
[mysqld]
plugin-load-add=mysql_clone.so
如果clone插件很重要,clone加载失败,则MySQL也必须启动失败,可以参考如下配置
[mysqld]
plugin-load-add=mysql_clone.so
clone=FORCE_PLUS_PERMANENT
运行时安装插件
使用下面方式安装重启配置也不会丢失,因为在安装成功后配置都已经注册到 mysql.plugins
系统表中。
mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
查看是否安装成功
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME = 'clone';
+-------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------+---------------+
| clone | ACTIVE |
+-------------+---------------+
1 row in set (0.00 sec)
plugin_status为active表示启动成功。
#本地克隆
语法如下:
CLONE LOCAL DATA DIRECTORY [=] 'clone_dir';
使用本地克隆需要有BACKUP_ADMIN
权限,权限配置参考如下:
mysql> GRANT BACKUP_ADMIN ON *.* TO 'clone_user';
本地克隆示例
mysql> CLONE LOCAL DATA DIRECTORY = '/path/to/clone_dir';
其中/path/to/clone_dir
是数据被克隆到的本地目录的完整路径。指定的目录clone_dir
必须不存在。
远程克隆
语法如下:
CLONE INSTANCE FROM 'user'@'host':port
IDENTIFIED BY 'password'
[DATA DIRECTORY [=] 'clone_dir']
[REQUIRE [NO] SSL];
user
:donor实例上的clone用户password
:user的密码host
:donor实例的ip/hostname地址port
:donor实例端口DATA DIRECTORY [=] 'clone_dir'
:可选项,克隆数据到本地其他目录,而不是当前数据目录REQUIRE [NO] SSL
:是否启用ssl加密
使用远程克隆需要注意:
- 在donor上,克隆用户需要有BACKUP_ADMIN权限,以及在克隆操作期间阻塞DDL操作。
- 在recipient,克隆用户需要有CLONE_ADMIN权限,去替换原有的数据目录,CLONE_ADMIN权限隐式地包含BACKUP_ADMIN和SHUTDOWN权限。
- MySQL版本必须8.0.17或更高以上
- donor与recipient必须运行在相同的平台上,比如都是x86_64平台,而不能跨平台克隆
- recipient磁盘空间必须足够
- donor与recipient必须使用相同的字符集以及排序规则
- donor与recipient必须设置相同的
innodb_data_file_path
(必须设置相同数量,相同大小的文件)以及innodb_page_size
可以通过SHOW VARIABLES LIKE 'innodb_page_size';
以及SHOW VARIABLES LIKE 'innodb_data_file_path';
来确认。 - 需要配置
clone_valid_donor_list
变量,donor主机必须在这个列表中,否则失败,可以通过SHOW VARIABLES LIKE 'clone_valid_donor_list';
查看当前配置 - 一次只允许一个clone操作。要确定是否存在正在运行克隆操作,请查询
performance_schema.clone_status
表。 - clone插件传输的包大小为1MB,在donor与recipient中,
max_allowed_packet
最小设置为2MB,可以通过SHOW VARIABLES LIKE 'max_allowed_packet';
- 在donor上
undo
表空间文件名必须唯一,当数据被clone到recipient,undo表空间会复制到recipient的innodb_undo_directory
目录下。如果donor有多个undo在不同目录下,切名称相同,可能会发生问题。donor节点上可以通过SELECT TABLESPACE_NAME, FILE_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE LIKE 'UNDO LOG';
确定undo表空间文件名是否唯一
具体操作如下:
-
donor上创建具有
BACKUP_ADMIN
权限用户mysql> CREATE USER 'donor_clone_user'@'%'IDENTIFIED BY 'password'; mysql> GRANT BACKUP_ADMIN on *.* to 'donor_clone_user'@'%';
-
donor上安装克隆插件
mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
-
recipient上创建
CLONE_ADMIN
权限用户mysql> CREATE USER 'recipient_clone_user'@'%'IDENTIFIED BY 'password'; mysql> GRANT CLONE_ADMIN on *.* to'recipient_clone_user'@'%';
-
recipient上安装clone插件
mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
-
recipient上添加donor主机地址到
clone_valid_donor_list
变量中mysql> SET GLOBAL clone_valid_donor_list = 'donor:3306';
-
recipient上克隆远端服务器数据
mysql> CLONE INSTANCE FROM 'donor_clone_user'@'donor':3306 IDENTIFIED BY 'password';
如果是从远端复制到本地的其他目录示例:
mysql> CLONE INSTANCE FROM 'user'@'example.donor.host.com':3306
IDENTIFIED BY 'password'
DATA DIRECTORY = '/path/to/clone_dir';
克隆数据后,将创建以下目录和文件在MySQL内部使用:
#clone
:包含克隆操作使用的内部克隆文件。在要复制数据的目录中创建。#ib_archive
:包含内部存档的日志文件,这些文件在克隆操作期间存档在捐赠者上。*.#clone files
:当现有数据目录被远程克隆操作替换时,在recipient上创建的临时数据文件。
监控
主要使用performance.clone_progress
与``performance.clone_status`两个表进行监控
performance.clone_progress
有关当前或上次执行的克隆操作的状态信息。
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 |
+-----------+-----------+----------------------------+
performance.clone_status
有关当前或上次执行的克隆操作的进度信息。
mysql> select * from performance_schema.clone_status\G
*************************** 1. row ***************************
ID: 1
PID: 0
STATE: Completed
BEGIN_TIME: 2020-04-05 10:26:01.852
END_TIME: 2020-04-05 10:27:23.986
SOURCE: 192.168.240.35:3306
DESTINATION: LOCAL INSTANCE
ERROR_NO: 0
ERROR_MESSAGE:
BINLOG_FILE: binlog.000001
BINLOG_POSITION: 1516
GTID_EXECUTED: 2a6a4935-7747-11ea-b104-000c2953a6ed:1-5
1 row in set (0.00 sec)
Performance Schema Stage Events
clone操作可能需要一些时间才能完成,这取决于数据量和与数据传输相关的其他因素。有三个阶段事件用于监视clone操作的进度。每个stage event报告WORK_COMPLETED
和WORK_ESTIMATED
值。
clone包含了以下stage events:
stage/innodb/clone (file copy)
: file copy阶段的进度。WORK_ESTIMATED
和WORK_COMPLETED
单元是chunk。在file copy阶段开始时就知道要传输的文件数量,并根据文件数量估计chunk的数量。WORK_ESTIMATED
被设置为估计的文件块的数量。WORK_COMPLETED
在每个clunk发送后更新。stage/innodb/clone (page copy)
: page copy阶段的进度。WORK_ESTIMATED
和WORK_COMPLETED
单元是page。一旦完成了file copy阶段,就知道要传输的pages数量,并将WORK_ESTIMATED
设置为这个值。WORK_COMPLETED
在发送每个页面后更新。stage/innodb/clone (redo copy)
: redo copy阶段的进度。WORK_ESTIMATED
和WORK_COMPLETED
单元是redo chunks 。一旦page copy阶段完成,就知道要传输的redo chunks的数量,并且WORK_ESTIMATED
被设置为这个值,WORK_COMPLETED
在每个redo chunks发送后更新。
启用stage/innodb/clone%
instruments:
mysql> UPDATE performance_schema.setup_instruments SET ENABLED = 'YES'
WHERE NAME LIKE 'stage/innodb/clone%';
启用阶段事件使用者表,其中包括events_stages_current
、events_stages_history
和events_stages_history_long
mysql> UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';
查看进度
mysql> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM performance_schema.events_stages_current
WHERE EVENT_NAME LIKE 'stage/innodb/clone%';
+--------------------------------+----------------+----------------+
| EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED |
+--------------------------------+----------------+----------------+
| stage/innodb/clone (redo copy) | 1 | 1 |
+--------------------------------+----------------+----------------+
如果克隆操作已经完成,可以查看events_stages_history
表
mysql> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM events_stages_history
WHERE EVENT_NAME LIKE 'stage/innodb/clone%';
+--------------------------------+----------------+----------------+
| EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED |
+--------------------------------+----------------+----------------+
| stage/innodb/clone (file copy) | 301 | 301 |
| stage/innodb/clone (page copy) | 0 | 0 |
| stage/innodb/clone (redo copy) | 1 | 1 |
+--------------------------------+----------------+----------------+
Performance Schema Clone Instrumentation
可以通过performance schema来对clone操作的不同维度进行监控
mysql> SELECT NAME,ENABLED FROM performance_schema.setup_instruments WHERE NAME LIKE '%clone%';
+----------------------------------------------+---------+
| NAME | ENABLED |
+----------------------------------------------+---------+
| wait/synch/mutex/innodb/clone_snapshot_mutex | NO |
| wait/synch/mutex/innodb/clone_sys_mutex | NO |
| wait/synch/mutex/innodb/clone_task_mutex | NO |
| wait/io/file/innodb/innodb_clone_file | YES |
| stage/innodb/clone (file copy) | YES |
| stage/innodb/clone (redo copy) | YES |
| stage/innodb/clone (page copy) | YES |
| statement/abstract/clone | YES |
| statement/clone/local | YES |
| statement/clone/client | YES |
| statement/clone/server | YES |
| memory/innodb/clone | YES |
| memory/clone/data | YES |
+----------------------------------------------+---------+
Wait Instruments
wait/synch/mutex/innodb/clone_snapshot_mutex
: 跟踪clone snapshot mutex 的等待事件。wait/synch/mutex/innodb/clone_sys_mutex
: 跟踪clone sys mutex 的等待事件。wait/synch/mutex/innodb/clone_task_mutex
: 跟踪clone task mutex的等待事件wait/io/file/innodb/innodb_clone_file
: 跟踪所有文件io等待操作
Stage Instruments
stage/innodb/clone (file copy)
: file copy阶段stage/innodb/clone (redo copy)
: redo copy 阶段stage/innodb/clone (page copy)
: page copy阶段
Statement Instruments
statement/abstract/clone
: 跟踪任何clone statement event,然后将其归类为本地、客户端或服务器操作类型。statement/clone/local
: 跟踪本地克隆操作的clone statement event;在执行克隆本地语句时生成。statement/clone/client
: 跟踪发生在recipient实例上的clone statement event;在recipient上执行clone语句时生成。statement/clone/server
: 跟踪远程clone statement event,发生在donor的MySQL服务器实例;在recipient上执行clone语句时生成。
Memory Instruments
memory/innodb/clone
: 跟踪InnoDB为动态快照分配的内存。memory/clone/data
: 在clone期间跟踪clone插件分配的内存。
Com_clone
查看clone执行的次数,show status like '%clone%';