MySQL8.0Clone插件

简介

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表空间文件名是否唯一

具体操作如下:

  1. donor上创建具有BACKUP_ADMIN权限用户

    mysql> CREATE USER 'donor_clone_user'@'%'IDENTIFIED BY 'password';
    mysql> GRANT BACKUP_ADMIN on *.* to 'donor_clone_user'@'%';
    
  2. donor上安装克隆插件

    mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
    
  3. recipient上创建CLONE_ADMIN权限用户

    mysql> CREATE USER 'recipient_clone_user'@'%'IDENTIFIED BY 'password';
    mysql> GRANT CLONE_ADMIN on *.* to'recipient_clone_user'@'%';
    
  4. recipient上安装clone插件

    mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
    
  5. recipient上添加donor主机地址到clone_valid_donor_list变量中

    mysql> SET GLOBAL clone_valid_donor_list = 'donor:3306';
    
  6. 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_COMPLETEDWORK_ESTIMATED值。

clone包含了以下stage events:

  • stage/innodb/clone (file copy): file copy阶段的进度。WORK_ESTIMATEDWORK_COMPLETED单元是chunk。在file copy阶段开始时就知道要传输的文件数量,并根据文件数量估计chunk的数量。WORK_ESTIMATED被设置为估计的文件块的数量。WORK_COMPLETED在每个clunk发送后更新。
  • stage/innodb/clone (page copy): page copy阶段的进度。WORK_ESTIMATEDWORK_COMPLETED单元是page。一旦完成了file copy阶段,就知道要传输的pages数量,并将WORK_ESTIMATED设置为这个值。WORK_COMPLETED在发送每个页面后更新。
  • stage/innodb/clone (redo copy): redo copy阶段的进度。WORK_ESTIMATEDWORK_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_currentevents_stages_historyevents_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%';

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章