Clone 插件

Clone 插件

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

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

概要

分类

  • 克隆本地数据

  • 克隆远程数据

    • 默认情况下,远程克隆操作会删除受体数据目录中的数据,并将其替换为克隆的数据。
    • 可以将数据克隆到收件人的其他目录中,以避免删除现有数据

功能

  • 支持复制
    • 除了克隆数据之外,克隆操作还从供体提取并传输复制坐标,并将其应用于受体,从而可以使用克隆插件来配置组复制成员和副本
    • 与复制大量事务相比,使用克隆插件进行配置要快得多且效率更高
    • 还可以将组复制成员配置为使用克隆插件作为替代的恢复方法,以便成员自动选择从种子成员中检索组数据的最有效方法
  • 支持克隆加密和页面压缩

安装克隆插件

选项

  • plugin_dir

    • 插件目录
  • plugin-load-add
    • 指定要加载的插件 (.so)
  • –clone
    • 选项值

      如果插件未成功初始化,则以下两个选项值可以强制服务器启动失败。

      • FORCE
      • FORCE_PLUS_PERMANENT

安装方法

  • 在服务器启动时加载
    [mysqld]
    plugin-load-add=mysql_clone.so
    
    • 每次服务器启动,都必须指定此选项重新加载插件
  • 在运行时加载
    INSTALL PLUGIN clone SONAME 'mysql_clone.so';
    
    • 会自动写入注册表 mysql.plugins,每次服务器重启,会自动加载

验证

  • SHOW PLUGINS
    mysql> show plugins;
    +---------------------------------+----------+--------------------+----------------------+---------+
    | Name                            | Status   | Type               | Library              | License |
    +---------------------------------+----------+--------------------+----------------------+---------+
    | binlog                          | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
    | mysql_native_password           | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |
    | sha256_password                 | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |
    | caching_sha2_password           | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |
    | sha2_cache_cleaner              | ACTIVE   | AUDIT              | NULL                 | GPL     |
    | CSV                             | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
    ...
    | mysqlx                          | ACTIVE   | DAEMON             | NULL                 | GPL     |
    | group_replication               | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL     |
    | clone                           | ACTIVE   | CLONE              | mysql_clone.so       | GPL     |
    +---------------------------------+----------+--------------------+----------------------+---------+
    
  • INFORMATION_SCHEMA.PLUGINS
    mysql> select * from information_schema.plugins limit 45,1\G
    *************************** 1. row ***************************
               PLUGIN_NAME: clone
            PLUGIN_VERSION: 1.0
             PLUGIN_STATUS: ACTIVE
               PLUGIN_TYPE: CLONE
       PLUGIN_TYPE_VERSION: 1.0
            PLUGIN_LIBRARY: mysql_clone.so
    PLUGIN_LIBRARY_VERSION: 1.10
             PLUGIN_AUTHOR: Oracle Corporation
        PLUGIN_DESCRIPTION: CLONE PLUGIN
            PLUGIN_LICENSE: GPL
               LOAD_OPTION: ON
    

控制激活状态

如果插件先前已在 INSTALL PLUGIN 中注册,或已使用 –plugin-load-add 加载,则可以在服务器启动时使用 –clone 选项来控制插件的激活状态,防止在运行时删除插件。

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

克隆本地数据

语法

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';
    
  • 克隆后的目录
    [root@yingzai_23 clone_dir]$ ll
    total 174104
    drwxr-x--- 2 mysql mysql     4096 Apr 24 10:29 '#clone'
    -rw-r----- 1 mysql mysql     4379 Apr 24 10:29  ib_buffer_pool
    -rw-r----- 1 mysql mysql 12582912 Apr 24 10:29  ibdata1
    -rw-r----- 1 mysql mysql 50331648 Apr 24 10:29  ib_logfile0
    -rw-r----- 1 mysql mysql 50331648 Apr 24 10:29  ib_logfile1
    drwxr-x--- 2 mysql mysql     4096 Apr 24 10:29  mysql
    -rw-r----- 1 mysql mysql 31457280 Apr 24 10:29  mysql.ibd
    drwxr-x--- 2 mysql mysql     4096 Apr 24 10:29  sys
    drwxr-x--- 2 mysql mysql     4096 Apr 24 10:29  test
    -rw-r----- 1 mysql mysql 16777216 Apr 24 10:29  undo_001
    -rw-r----- 1 mysql mysql 16777216 Apr 24 10:29  undo_002
    
  • 克隆之后可以以目标目录启动服务器
    shell> mysqld_safe --datadir=clone_dir
    

    Note: 启动过程中会对新的数据目录进行初始化。

注意事项

  • 本地克隆操作不支持克隆位于数据目录外部的用户创建的表或表空间,否则会报错

    ERROR 1086 (HY000): File '/path/to/tablespace_name.ibd' already exists
    

克隆远程数据

语法

CLONE INSTANCE FROM 'user'@'host':port
IDENTIFIED BY 'password'
[DATA DIRECTORY [=] 'clone_dir']
[REQUIRE [NO] SSL];
  • user
    • 供体上的克隆用户
  • password
    • 密码
  • host
    • 供体的主机名
    • 支持 IPv4 地址,不支持 IPv6 地址,但是可以使用 IPv6 地址的别名
  • port
    • 供体服务器的实例端口
    • 限制
      • 不支持由系统变量 mysqlx_port 指定的 X 协议端口
      • 不支持通过 MySQL Router 连接到实例
  • DATA DIRECTORY [=] ‘clone_dir’
    • 可选子句,指定本地接收路径
    • 如果不指定,会默认将受体数据目录的数据清空并替换成克隆数据,然后重启服务器
    • 默认情况下,InnoDB 的系统表空间、redo 日志和 undo 表空间会被克隆到受体上,具体路径由供体的系统变量控制
      • innodb_data_home_dir
      • innodb_data_file_path
      • innodb_log_group_home_dir
      • innodb_undo_directory
  • [REQUIRE [NO] SSL]
    • 控制是否使用 SSL 连接
    • 如果未指定,则默认尝试建立加密连接,如果尝试失败,则退回到非加密连接

前提条件

  • 基本前提
    • 插件
      • 供体和受体安装克隆插件并激活
    • 权限
      • 供体
        • BACKUP_ADMIN
      • 受体
        • CLONE_ADMIN (包含 BACKUP_ADMIN 和 SHUTDOWN )
  • 具体的检查项
    • 供体和受体必须具有相同的 MySQL 服务器版本。要求最低版本是 8.0.17。
      mysql> SHOW VARIABLES LIKE 'version';
       +---------------+--------+
      | Variable_name | Value  |
      +---------------+--------+
      | version       | 8.0.17 |
      +---------------+--------+
      
  • 供体和受体的服务器实例必须在相同的操作系统和平台上运行
    • InnoDB 允许在数据目录之外创建一些表空间类型。

    • 如果供体服务器实例的表空间位于数据目录之外,则克隆操作必须能够访问这些表空间

      • 查看 INFORMATION_SCHEMA.FILES
        mysql> SELECT FILE_NAME FROM INFORMATION_SCHEMA.FILES;
        +----------------------+
        | FILE_NAME            |
        +----------------------+
        | ./ibdata1            |
        | ./ibtmp1             |
        | ./undo_001           |
        | ./undo_002           |
        | ./mysql.ibd          |
        | ./sys/sys_config.ibd |
        | ./test/t1.ibd        |
        +----------------------+
      
  • 供体和受体上的活动插件必须一致
    • SHOW PLUGINS
      • INFORMATION_SCHEMA.PLUGINS
  • 供体和受体必须具有相同的 MySQL 服务器字符集和排序规则
    • 供体和受体需要相同的 innodb_page_size 和 innodb_data_file_path 设置
      mysql> SHOW VARIABLES LIKE 'innodb_page_size';
      mysql> SHOW VARIABLES LIKE 'innodb_data_file_path';
    
    • innodb_page_size
      • innodb_data_file_path
  • 如果克隆加密的或页面压缩的数据,则供体和受体必须具有相同的文件系统块大小
    • 如果要克隆加密的数据,则需要安全连接
    • 受体上的 clone_valid_donor_list 必须包含供体地址
      mysql> SHOW VARIABLES LIKE 'clone_valid_donor_list';
    
    • 不得有其他克隆操作在运行
      • 查看是否有其他克隆操作
        • performance_schema.clone_status
    • 克隆插件以 1MB 数据包和元数据的形式传输数据
      • max_allowed_pa​​cket 最小值为 2MB,小于此值会报错
        mysql> SHOW VARIABLES LIKE 'max_allowed_packet';
        
    • 供体上的 undo 表空间文件名必须是唯一的
      • 查看 undo 表空间
        mysql> SELECT TABLESPACE_NAME, FILE_NAME FROM INFORMATION_SCHEMA.FILES
               WHERE FILE_TYPE LIKE 'UNDO LOG';
        
    • 默认情况下,克隆数据后,受体服务器实例将自动重新启动
      • 在克隆数据并关闭受体服务器实例后,克隆操作可能会因以下错误而暂停
        ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process).
        

        Note: 此错误并不表示克隆失败。这意味着克隆数据后,必须再次手动启动受体服务器实例。

    • 通过性能表查看克隆操作是否成功

    • performance_schema.clone_status

  • 如果使用 DATA DIRECTORY 子句克隆到指定目录,则受体服务器不会自动重启

  • 在执行克隆操作的受体服务器实例上,设置适当的克隆变量

  • 检查项中涉及的变量和表

    • 系统变量
      • clone_valid_donor_list
        • 供体地址列表
      • max_allowed_pa​​cket
        • 通信允许的最大包大小
      • iniformation_schema.files
      • performance_schema.plugins
      • performance_schema.clone_status

操作步骤

  • 供体服务器
    • 创建克隆用户
      mysql> CREATE USER 'donor_clone_user'@'example.donor.host.com' IDENTIFIED BY 'password';
      mysql> GRANT BACKUP_ADMIN on *.* to 'donor_clone_user'@'example.donor.host.com';
      
      • 权限
        • BACKUP_ADMIN
    • 安装克隆插件
      mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
      
  • 受体服务器
    • 创建克隆用户
      mysql> CREATE USER 'recipient_clone_user'@'example.recipient.host.com' IDENTIFIED BY 'password';
      mysql> GRANT CLONE_ADMIN on *.* to 'recipient_clone_user'@'example.recipient.host.com';
      
      • 权限
        • CLONE_ADMIN
    • 安装克隆插件
      mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
      
  • 设置供体列表
      mysql> SET GLOBAL clone_valid_donor_list = 'example.donor.host.com:3306';
    
    • 使用克隆用户登录并启动克隆操作
      • 克隆到默认目录
        mysql> CLONE INSTANCE FROM 'donor_clone_user'@'example.donor.host.com':3306
               IDENTIFIED BY 'password';
        
        • 报错
          ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process).
          

          Note: 这个报错不表示克隆失败,只是重启服务器失败,需要手动重启一下。

      • 克隆到指定目录

        mysql> CLONE INSTANCE FROM 'user'@'example.donor.host.com':3306
               IDENTIFIED BY 'password'
               DATA DIRECTORY = '/path/to/clone_dir';
        
        • 手动重启受体服务器
          shell> mysqld_safe --datadir=/path/to/clone_dir
          

          Note: 克隆完成后,受体服务器实例不会自动重新启动,需要手动重启。

为克隆配置加密连接

  • 供体服务器

    • 向受体服务器分发客户端证书和密钥文件

      使用安全通道将客户端证书和密钥文件分发到受体主机,或将其放置在受体主机可访问的已安装分区上。

      • ca.pem
        • 自签名证书颁发机构 (CA) 文件
      • client-cert.pem
        • 客户端公钥证书文件
      • client-key.pem
        • 客户端私钥文件
  • 受体服务器
    • 配置 SSL 选项
      clone_ssl_ca=/path/to/ca.pem
      clone_ssl_cert=/path/to/client-cert.pem
      clone_ssl_key=/path/to/client-key.pem
      
      • clone_ssl_ca
        • 指定自签名证书颁发机构 (CA) 文件的路径
      • clone_ssl_cert
        • 指定客户端公钥文件的路径
      • clone_ssl_key
        • 指定客户端私钥文件的路径
    • 在克隆命令中指定加密连接
      mysql> CLONE INSTANCE FROM 'user'@'example.donor.host.com':3306
             IDENTIFIED BY 'password'
             DATA DIRECTORY = '/path/to/clone_dir'
             REQUIRE SSL;
      
      • 如果未指定 SSL 子句
        • 默认情况下,克隆插件会尝试建立加密连接,如果加密连接尝试失败,则会回退到未加密连接
      • 如果克隆加密数据
        • 无论是否指定 REQUIRE SSL 子句,默认情况下都需要加密连接。
        • 使用 REQUIRE NO SSL 会报错

克隆操作期间创建的目录和文件

  • #clone
  • 包含克隆操作使用的内部克隆文件
    • 在受体的数据目录中创建
  • #ib_archive

  • 包含内部存档的日志文件

    • 克隆操作期间在供体上存档
  • *.#clone
    • 在受体数据目录中创建的临时数据文件,原有数据已被远程克隆数据替换
    • 克隆操作完毕后被删除

远程克隆操作的失败处理

  • 系统变量
    • clone_ddl_timeout
      • 获取 DDL 锁的超时时间。如果超时,则克隆将报错
    • clone_donor_timeout_after_network_failure
      • 网络连接失败后,供体的等待时间,如果超时,克隆将中止并报错
      • 范围支持 0-30,默认是5分钟
    • wait_timeout
      • 克隆空闲超时采用此变量的值,默认为28800秒 (8小时)
  • 检查阶段,如果失败,则克隆操作报错

  • 采取了备用锁定来阻止 DDL 操作,如果获取 DDL 锁超时,则报错

  • 在将数据克隆到受体数据目录之前,将删除受体上用户创建的数据 (库,表,表空间) 和二进制日志

    • 错误日志中会记录删除数据的时间
      [Warning] [MY-013453] [InnoDB] Clone removing all user data for provisioning:
      Started...
      
      [Warning] [MY-013453] [InnoDB] Clone removing all user data for provisioning:
      Finished
      
  • 数据是从供体中克隆的。克隆了用户创建的数据,字典元数据和其他系统数据
    • 如果在克隆数据时发生故障,则将回滚克隆操作并删除所有克隆的数据
  • 服务器自动重新启动 (适用于不克隆到指定目录的远程克隆操作)
    • 如果服务器自动重启失败,则可以手动重启

克隆加密和压缩

克隆加密数据

  • 前提
    • 克隆远程数据时需要安全连接,以确保通过网络安全传输未加密的表空间密钥。
    • 如果使用了密钥环,则供体和受体的密钥环必须相同
  • 正在进行克隆操作时,有两个系统变量无法修改
    • innodb_redo_log_encrypt
    • innodb_undo_log_encrypt

克隆压缩数据

  • 前提
    • 受体文件系统必须支持稀疏文件和打孔,才能在受体上进行打孔。

    • 供体和受体文件系统必须具有相同的块大小,否则会报错

      ERROR 3868 (HY000): Clone Configuration FS Block Size: Donor value: 114688 is different from Recipient value: 4096
      

复制结构的克隆

克隆插件支持复制。与复制大量事务相比,使用克隆插件进行配置要快得多,效率也更高。

对于组复制

  • 克隆插件可以作为分布式恢复的选项,状态转移时,会自动选择最有效的方式

对于二进制日志坐标和 GTID 的克隆

在克隆操作期间,将提取二进制日志位置和 gtid_executed GTID 集,并将其从供体服务器实例传输到受体。

  • 此数据允许在复制流中的一致位置启动复制
  • 二进制日志和中继日志不会从供体复制到受体
  • 应将克隆的实例添加到复制组中

对于复制元数据的克隆

默认情况下,复制元数据存储库保存在表中,这些表在克隆操作期间从供体复制到受体。

复制元数据存储库包含与复制相关的配置设置,可用于在克隆操作之后正确地恢复复制。

  • mysql.slave_master_info
  • mysql.slave_relay_log_info
  • mysql.slave_worker_info

查看

  • 查看克隆状态
    • performance_schema.clone_status
      mysql> SELECT BINLOG_FILE, BINLOG_POSITION FROM performance_schema.clone_status;
      
  • 检查已转移到受体的 gtid_executed GTID 集
    mysql> SELECT @@GLOBAL.GTID_EXECUTED;
    

为复制启用克隆

  • 执行克隆操作
    • 对于组复制,当新成员加入时,会自动执行克隆操作
    • 对于主从复制,需要手动克隆
  • 克隆操作完成后,如果要在受体上启动和供体相同的复制通道,需要验证以下设置
    • 如果已启用 GTID,则在启动复制通道后可以自动恢复复制
    • 如果使用基于二进制日志文件位置的复制,则来自供体的二进制日志位置会应用于受体,重新启动复制之前,会使用克隆的中继日志信息自动尝试执行中继日志恢复过程
      • 对于单线程副本 (slave_parallel_workers=0) ,没有问题
      • 对于多线程副本 (slave_parallel_workers>0) ,中继日志恢复很可能会失败,因为它通常无法自动完成。所以,就需要手动设置。
  • 添加副本
    • 基于 GTID 的复制
      mysql> CHANGE MASTER TO MASTER_HOST = 'source_host_name', MASTER_PORT = source_port_num,
             ...
             MASTER_AUTO_POSITION = 1,
             FOR CHANNEL 'setup_channel';
      mysql> START SLAVE USER = 'user_name' PASSWORD = 'password' FOR CHANNEL 'setup_channel';
      
      Or from MySQL 8.0.22 and 8.0.23:
      
      mysql> CHANGE SOURCE TO SOURCE_HOST = 'source_host_name', SOURCE_PORT = source_port_num,
             ...
             SOURCE_AUTO_POSITION = 1,
             FOR CHANNEL 'setup_channel';
      mysql> START REPLICA USER = 'user_name' PASSWORD = 'password' FOR CHANNEL 'setup_channel';
      
  • 基于二进制日志文件位置的复制
      mysql> SELECT BINLOG_FILE, BINLOG_POSITION FROM performance_schema.clone_status;
      mysql> CHANGE MASTER TO MASTER_HOST = 'source_host_name', MASTER_PORT = source_port_num,
             ...
             MASTER_LOG_FILE = 'source_log_name',
             MASTER_LOG_POS = source_log_pos,
             FOR CHANNEL 'setup_channel';
      mysql> START SLAVE USER = 'user_name' PASSWORD = 'password' FOR CHANNEL 'setup_channel';
    
      Or from MySQL 8.0.22 and 8.0.23:
    
      mysql> SELECT BINLOG_FILE, BINLOG_POSITION FROM performance_schema.clone_status;
      mysql> CHANGE SOURCE TO SOURCE_HOST = 'source_host_name', SOURCE_PORT = source_port_num,
             ...
             SOURCE_LOG_FILE = 'source_log_name',
             SOURCE_LOG_POS = source_log_pos,
             FOR CHANNEL 'setup_channel';
      mysql> START REPLICA USER = 'user_name' PASSWORD = 'password' FOR CHANNEL 'setup_channel';
    

监控克隆操作

克隆表 (监控受体)

  • clone_status
    • 提供了当前或上次执行的克隆操作的状态
      mysql> SELECT STATE FROM performance_schema.clone_status;
      +-----------+
      | STATE     |
      +-----------+
      | Completed |
      +-----------+
      
      mysql> SELECT STATE, ERROR_NO, ERROR_MESSAGE FROM performance_schema.clone_status;
      +-----------+----------+---------------+
      | STATE     | ERROR_NO | ERROR_MESSAGE |
      +-----------+----------+---------------+
      | Failed    |      xxx | "xxxxxxxxxxx" |
      +-----------+----------+---------------+
      

      Note: 这张表只记录最近一次的克隆状态,不会记录历史数据。

  • 状态值

    • Not Started
      • In Progress
      • Completed
      • Failed
  • 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 |
      +-----------+-----------+----------------------------+
      

      Note: 这张表也是只记录最近一次的克隆状态,不会记录历史数据。

  • 阶段值

    • DROP DATA
      • FILE COPY
      • PAGE_COPY
      • REDO_COPY
      • FILE_SYNC
      • RESTART
      • RECOVERY

阶段事件表 (监控供体/受体)

每个阶段都包含两个值:WORK_ESTIMATED 和 WORK_COMPLETED。

  • 工具包括
    • stage/innodb/clone (file copy)
      • 指示克隆操作的文件复制阶段的进度
      • WORK_ESTIMATED 和 WORK_COMPLETED 单位是文件块
    • stage/innodb/clone (page copy)
      • 指示克隆操作的页面复制阶段的进度
      • WORK_ESTIMATED 和 WORK_COMPLETED 单位是页面
    • stage/innodb/clone (redo copy)
      • 指示克隆操作的重做 (redo) 复制阶段的进度
      • WORK_ESTIMATED 和 WORK_COMPLETED 单位是重做块
  • 使用方法
    • 启动对应的工具
      mysql> UPDATE performance_schema.setup_instruments SET ENABLED = 'YES'
             WHERE NAME LIKE 'stage/innodb/clone%';
      
  • 启用阶段事件使用者表
      mysql> UPDATE performance_schema.setup_consumers SET ENABLED = 'YES'
             WHERE NAME LIKE '%stages%';
    
    • events_stages_current
      • events_stages_history
      • events_stages_history_long
  • 运行克隆操作
      mysql> CLONE LOCAL DATA DIRECTORY = '/path/to/cloned_dir';
    
    • 通过性能表查看进度
      • events_stages_current
      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 |
        +--------------------------------+----------------+----------------+
      

性能表工具

mysql> SELECT * FROM performance_schema.setup_instruments
       WHERE NAME LIKE 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
        • 跟踪克隆快照互斥锁的等待事件,该事件在多个克隆线程之间同步对动态快照对象 (在供体和受体上) 的访问
      • wait/synch/mutex/innodb/clone_sys_mutex
        • 跟踪克隆 sys 互斥锁的等待事件
        • MySQL 服务器实例中有一个克隆系统对象。此互斥锁将同步对供体和受体上的克隆系统对象的访问。它是由克隆线程以及其他前台和后台线程获取的
      • wait/synch/mutex/innodb/clone_task_mutex
        • 跟踪克隆任务互斥锁的等待事件,该事件用于克隆任务管理。
        • clone_task_mutex 由克隆线程获取
      • wait/io/file/innodb/innodb_clone_file
        • 跟踪克隆操作的文件的所有 I/O 等待操作
  • Stage Instruments
    • 跟踪在语句执行过程中发生的步骤
    • 工具包括
      • stage/innodb/clone (file copy)
        • 指示克隆操作的文件复制阶段的进度
      • stage/innodb/clone (redo copy)
        • 指示克隆操作的重做复制阶段的进度
      • stage/innodb/clone (page copy)
        • 指示克隆操作的页面复制阶段的进度
  • Statement Instruments
    • 跟踪语句执行。当启动克隆操作时,可以并行执行克隆语句工具跟踪的不同语句类型。
    • 执行的语句数取决于变量的设置
      • clone_max_concurrency
      • clone_autotune_concurrency
    • 工具包括
      • statement/abstract/clone
        • 在将任何克隆操作归类为本地、客户端或服务器操作类型之前,跟踪所有克隆操作的语句事件
      • statement/clone/local
        • 跟踪克隆语句事件以进行本地克隆操作
        • 在执行 CLONE LOCAL 语句时生成。
      • statement/clone/client
        • 跟踪在受体服务器实例上发生的远程克隆语句事件
        • 在受体上执行 CLONE INSTANCE 语句时生成。
      • statement/clone/server
        • 跟踪在供体服务器实例上发生的远程克隆语句事件
        • 在供体上执行 CLONE INSTANCE 语句时生成
  • Memory Instruments
    • 跟踪内存使用情况
    • 工具包括
      • memory/innodb/clone
        • 跟踪 InnoDB 为动态快照分配的内存
      • memory/clone/data
        • 跟踪克隆操作期间克隆插件分配的内存

状态变量

  • Com_clone
    • 提供 CLONE 语句执行的计数

      Note: 服务器重启后这个计数会清零,也就是说这个状态变量只记录本地克隆的次数。

停止克隆操作

直接杀掉 PID

mysql> KILL QUERY processlist_id

查找 PID

  • performance_schema.clone_status

    mysql> SELECT * FROM performance_schema.clone_status\G
    *************************** 1. row ***************************
                 ID: 1
                PID: 8
              STATE: In Progress
         BEGIN_TIME: 2019-07-15 11:58:36.767
           END_TIME: NULL
             SOURCE: LOCAL INSTANCE
        DESTINATION: /path/to/clone_dir/
           ERROR_NO: 0
      ERROR_MESSAGE:
        BINLOG_FILE:
    BINLOG_POSITION: 0
      GTID_EXECUTED:
    
    • PID 列
  • information_schema.processlist
    • ID 列
  • show processlist
    • ID 列
  • performance_schema.threads
    • PROCESSLIST_ID 列

克隆系统变量

仅用于供体服务器

  • clone_donor_timeout_after_network_failure
    • 定义供体允许受体在网络故障后重新连接并重新开始克隆操作的时间 (以分钟为单位)
  • clone_max_concurrency
    • 定义远程克隆操作的最大并发线程数。默认值为16。
    • 对于远程克隆操作,建议每个线程的最小数据传输速率为 1MiB
      • clone_max_data_bandwidth

仅用于受体服务器

  • clone_autotune_concurrency
    • 动态生成用于远程克隆操作的其他线程,以优化数据传输速度。

    • 优化规则

      在克隆操作过程中,线程数将朝着当前线程数加倍的目标逐渐增加。在每个增量上都会评估对数据传输速度的影响。

      • 如果数据传输速度随着增量的增加而下降5%以上,则该过程将停止
      • 如果达到目标的25%后至少有5%的改善,则该过程继续。否则,该过程将停止。
      • 如果在达到目标的50%之后至少有10%的改善,则该过程将继续。否则,该过程将停止。
      • 如果达到目标后至少有25%的改善,则该过程将继续朝着使当前线程数增加一倍的新目标进行。否则,该过程将停止。
    • 自动调整过程不支持减少线程数

    • 资源限制

      • clone_max_concurrency
        • 定义可以产生的最大线程数
        • 如果禁用 clone_autotune_concurrency,则此变量定义为远程克隆操作产生的线程数
  • clone_enable_compression
    • 在远程克隆操作期间,在网络层启用数据压缩
  • clone_max_data_bandwidth
    • 定义远程克隆操作的最大数据传输速率,以 MiB/s 为单位。
    • 此变量有助于管理克隆操作的性能
      • 仅当供体磁盘 I/O 带宽达到饱和而影响性能时,才应设置限制
    • 值0表示无限制

    • 每个线程的最小数据传输速率为每秒 1MiB
    • 由此变量指定的请求的数据传输速率可能与 performance_schema.clone_progress 表中的 DATA_SPEED 列报告的实际数据传输速率不同

      • 可能是供体或受体的 I/O 导致的瓶颈
  • clone_max_network_bandwidth
    • 指定远程克隆操作的最大近似网络传输速率,以 MiB/s 为单位。
    • 此变量可用于管理克隆操作对网络带宽的性能影响
      • 仅当网络带宽饱和时才应设置该值,这会影响供体实例的性能
    • 值0表示无限制

  • clone_ssl_ca

    • 指定证书颁发机构 (CA) 文件的路径
  • clone_ssl_cert
    • 指定公钥证书的路径
  • clone_ssl_key
    • 指定私钥文件的路径
  • clone_valid_donor_list
    • 指定远程克隆操作的有效供体主机地址

    • 列表格式

      "HOST1:PORT1,HOST2:PORT2,HOST3:PORT3"
      
  • 支持 IPv4 地址,不支持 IPv6 地址,但是可以使用 IPv6 地址的别名

同时用于供体和受体服务器

  • clone_ddl_timeout

    • 执行克隆操作时等待备份锁定的时间 (以秒为单位)

      克隆操作不能与 DDL 操作同时运行。供体和受体服务器实例上需要备份锁。一旦获取了备份锁,DDL 操作必须等待克隆操作完成。

  • 值为0表示克隆操作将不获取任何备份锁定。

    在这种情况下,如果同时尝试 DDL 操作,则克隆操作将失败并报错。

  • clone_buffer_size

    • 定义在本地克隆操作期间传输数据时使用的中间缓冲区的大小
    • 默认值为 4MiB
    • 较大的缓冲区大小可能允许 I/O 设备驱动程序并行获取数据,从而可以提高克隆性能。

克隆插件限制

  • 克隆操作期间不允许 DDL (包括 TRUNCATE TABLE)

  • 供体和受体必须具有完全相同的 MySQL 服务器版本和发行版

  • 一次只能克隆一个 MySQL 实例

  • 远程克隆操作不支持 mysqlx_port 指定的 X 协议端口

  • 不支持对 MySQL 服务器配置的克隆,包括配置文件和持久化变量

  • 不支持二进制日志的克隆

  • 仅克隆存储 InnoDB 中的数据,不支持其他存储引擎

    • 任何模式 (包括 sys 模式) 中的 MyISAM 和 CSV 表都被克隆为空表。
  • 不支持通过 MySQL Router 连接到供体 MySQL 服务器实例

  • 本地克隆操作不支持克隆使用绝对路径创建的常规表空间。

    • 与源表空间文件具有相同路径的克隆表空间文件将导致冲突

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注