mysql克隆schema_MySQL clone plugin的使用详解【转】

1、安装MySQL8.0.20二进制安装及插件安装

下载wget -P /data/soft https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz

解压并创建软链接tar Jxf mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz -C /home/mysql/cd/usr/local/

ln -sv /home/mysql/mysql-8.0.20-linux-glibc2.12-x86_64 mysql8

创建MySQL数据目录

mkdir /home/mysql/mysql3307/mkdir /home/mysql/mysql3307/undologmkdir /home/mysql/mysql3307/binlogmkdir /home/mysql/mysql3307/data

创建MySQL配置文件

cd/home/mysql/mysql3307/配置文件是使用叶金荣老师的在线生成配置文件

#catmy3307.cnf

#

## my.cnffor MySQL 5.7/8.0## autoor: yejr(yejinrong@zhishutang.com, http://imysql.com, QQ: 4700963)

##

## 叶金荣(yejr)

## 靠谱优质的在线培训品牌知数堂培训(http://zhishuedu.com)联合创始人

## 新浪微博: @叶金荣, 微信公众:老叶茶馆(imysql_wx)

## QQ群:650149401## 注意:个别建议可能需要根据实际情况作调整,请自行判断或联系我,本人不对这些建议结果负相应责任

## 本配置文件主要适用于MySQL5.7/8.0版本

#

[client]

port= 3307socket= /home/mysql/mysql3307/mysql.sock

[mysql]

prompt="\u@mysqldb \R:\m:\s [\d]>"no-auto-rehash

[mysqld]

user=mysql

port= 3307basedir= /usr/local/mysql8

datadir= /home/mysql/mysql3307/data

socket= /home/mysql/mysql3307/mysql.sock

pid-file =mysqldb.pid

character-set-server =utf8mb4

skip_name_resolve= 1#要加入这个参数否则会报错MySQL8 ERROR2059 (HY000): Authentication plugin 'caching_sha2_password'default_authentication_plugin=mysql_native_password

#若你的MySQL数据库主要运行在境外,请务必根据实际情况调整本参数

default_time_zone= "+8:00"open_files_limit= 65535back_log= 1024max_connections= 512max_connect_errors= 1000000table_open_cache= 1024table_definition_cache= 1024table_open_cache_instances= 64thread_stack=512K

external-locking =FALSE

max_allowed_packet=32M

sort_buffer_size=4M

join_buffer_size=4M

thread_cache_size= 768interactive_timeout= 600wait_timeout= 600tmp_table_size=32M

max_heap_table_size=32M

slow_query_log= 1log_timestamps=SYSTEM

slow_query_log_file= /home/mysql/mysql3307/slow.log

log-error = /home/mysql/mysql3307/error.log

long_query_time= 0.1log_queries_not_using_indexes=1log_throttle_queries_not_using_indexes= 60min_examined_row_limit= 100log_slow_admin_statements= 1log_slow_slave_statements= 1server-id = 3307log-bin = /home/mysql/mysql3307/binlog/mysql-bin

sync_binlog= 1binlog_cache_size=4M

max_binlog_cache_size=2G

max_binlog_size=1G

#注意:MySQL8.0开始,binlog_expire_logs_seconds选项也存在的话,会忽略expire_logs_days选项

expire_logs_days= 7master_info_repository=TABLE

relay_log_info_repository=TABLE

gtid_mode=on

enforce_gtid_consistency= 1log_slave_updates

slave-rows-search-algorithms = 'INDEX_SCAN,HASH_SCAN'binlog_format=row

binlog_checksum= 1relay_log_recovery= 1relay-log-purge = 1key_buffer_size=32M

read_buffer_size=8M

read_rnd_buffer_size=4M

bulk_insert_buffer_size=64M

myisam_sort_buffer_size=128M

myisam_max_sort_file_size=10G

myisam_repair_threads= 1lock_wait_timeout= 3600explicit_defaults_for_timestamp= 1innodb_thread_concurrency= 0#innodb_sync_spin_loops= 100#innodb_spin_wait_delay= 30transaction_isolation= REPEATABLE-READ

#innodb_additional_mem_pool_size=16M

innodb_buffer_pool_size=2048M

innodb_buffer_pool_instances= 4innodb_buffer_pool_load_at_startup= 1innodb_buffer_pool_dump_at_shutdown= 1innodb_data_file_path=ibdata1:1G:autoextend

innodb_flush_log_at_trx_commit= 1innodb_log_buffer_size=32M

innodb_log_file_size=2G

innodb_log_files_in_group= 3innodb_max_undo_log_size=4G

innodb_undo_directory= /home/mysql/mysql3307/undolog

innodb_undo_tablespaces= 95# 根据您的服务器IOPS能力适当调整

# 一般配普通SSD盘的话,可以调整到10000 - 20000# 配置高端PCIe SSD卡的话,则可以调整的更高,比如50000 - 80000innodb_io_capacity= 4000innodb_io_capacity_max= 8000innodb_flush_sync= 0innodb_flush_neighbors= 0innodb_write_io_threads= 8innodb_read_io_threads= 8innodb_purge_threads= 4innodb_page_cleaners= 4innodb_open_files= 65535innodb_max_dirty_pages_pct= 50innodb_flush_method=O_DIRECT

innodb_lru_scan_depth= 4000innodb_checksum_algorithm=crc32

innodb_lock_wait_timeout= 10innodb_rollback_on_timeout= 1innodb_print_all_deadlocks= 1innodb_file_per_table= 1innodb_online_alter_log_max_size=4G

innodb_stats_on_metadata= 0innodb_undo_log_truncate= 1#注意:MySQL8.0.16开始删除该选项

#internal_tmp_disk_storage_engine=InnoDB

# some varfor MySQL 8log_error_verbosity= 3innodb_print_ddl_logs= 1binlog_expire_logs_seconds= 604800#innodb_dedicated_server= 0innodb_status_file= 1#注意: 开启 innodb_status_output& innodb_status_output_locks 后, 可能会导致log-error文件增长较快

innodb_status_output= 0innodb_status_output_locks= 1innodb_sort_buffer_size= 67108864innodb_autoinc_lock_mode= 1#performance_schema

performance_schema= 1#performance_schema_instrument= '%memory%=on'performance_schema_instrument= '%lock%=on'#innodb monitor

innodb_monitor_enable="module_innodb"innodb_monitor_enable="module_server"innodb_monitor_enable="module_dml"innodb_monitor_enable="module_ddl"innodb_monitor_enable="module_trx"innodb_monitor_enable="module_os"innodb_monitor_enable="module_purge"innodb_monitor_enable="module_log"innodb_monitor_enable="module_lock"innodb_monitor_enable="module_buffer"innodb_monitor_enable="module_index"innodb_monitor_enable="module_ibuf_system"innodb_monitor_enable="module_buffer_page"innodb_monitor_enable="module_adaptive_hash"# 初始化时以下俩个参数要注释否则无法初始化

#plugin-load-add=mysql_clone.so

#clone=FORCE_PLUS_PERMANENT

[mysqldump]

quick

max_allowed_packet=32M

# 创建MySQL用户

groupadd mysql

useradd -g mysql -s /sbin/nologin -d /usr/local/mysql -MN mysql

# 修改MySQL目录所有者

chown mysql. /home/mysql/ -R

# MySQL初始化/usr/local/mysql8/bin/mysqld --defaults-file=/home/mysql/mysql3307/my3307.cnf --initialize

# 查看初始化登录密码grep -w 'root@localhost' error.log |awk '{print $NF}'# 取消配置文件mysql3307.cnf的注释

plugin-load-add=mysql_clone.so

clone=FORCE_PLUS_PERMANENT

说明:如果克隆插件对你们很重要,可以设置clone=FORCE_PLUS_PERMANENT或clone=FORCE。作用是:如果插件未成功初始化,就会强制mysqld启动失败。

启动MySQL/usr/local/mysql8/bin/mysqld --defaults-file=/home/mysql/mysql3307/my3307.cnf ss-tunpl|grep 3307tcp0 128 :::3307 :::* users:(("mysqld",72861,37))

登录修改MySQL密码

mysql-uroot -p -S /home/mysql/mysql3307/mysql.sock

输入VNXqVbFu=1sk

alter user user() identified by'密码';

mysql> selectversion();+-----------+

| version() |

+-----------+

| 8.0.20 |

+-----------+

1 row in set (0.00sec)

#因为配置文件已经写了插件所以启动时自动加载,就无需安装了

mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';

ERROR1125 (HY000): Function 'clone'already exists

# 查看clone插件是否启动

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)

2、克隆本地数据

克隆需要的权限

需要有备份锁的权限。备份锁是 MySQL8.0的新特性之一,比5.7版本的flush table with read lock要轻量。

mysql> create user clone_user@'127.0.0.1' identified by 'mysql123';

Query OK,0 rows affected (0.00sec)

mysql> GRANT BACKUP_ADMIN ON *.* TO clone_user@'127.0.0.1';

Query OK,0 rows affected (0.00sec)

mysql>flush privileges;

Query OK,0 rows affected (0.00sec)

BACKUP_ADMIN是MySQL8.0才有的备份锁的权限

#执行本地克隆

mysql-uclone_user -pmysql123 -P3307 -h'127.0.0.1'mysql> CLONE LOCAL DATA DIRECTORY = '/home/mysql/mydata_clone';

注意:例子中需要 MySQL 的运行用户拥有/home/mysql/mydata_clone目录的rwx权限,要求 clone_dir 目录不存在

否则会报错

mysql> CLONE LOCAL DATA DIRECTORY = '/home/mysql/mydata_clone';

ERROR1006 (HY000): Can't create database'/home/mysql/mydata_clone/'(errno: 13 - Permission denied)

mysql> CLONE LOCAL DATA DIRECTORY = '/home/mysql/mydata_clone';

ERROR1007 (HY000): Can't create database'/home/mysql/mydata_clone'; database exists

mysql> CLONE LOCAL DATA DIRECTORY = '/home/mysql/mydata_clone';

本地克隆的步骤如下

DROP DATA

FILE COPY

PAGE COPY

REDO COPY

FILE SYNC

观察方法如下

mysql>SELECT STAGE, STATE, END_TIME FROM performance_schema.clone_progress;+-----------+-------------+----------------------------+

| STAGE | STATE | END_TIME |

+-----------+-------------+----------------------------+

| DROP DATA | Completed | 2020-10-10 09:34:22.696656 |

| FILE COPY | Completed | 2020-10-10 09:34:31.265343 |

| PAGE COPY | Completed | 2020-10-10 09:34:31.586777 |

| REDO COPY | Completed | 2020-10-10 09:34:31.788930 |

| FILE SYNC | Completed | 2020-10-10 09:34:42.458395 |

| RESTART | Not Started | NULL |

| RECOVERY | Not Started | NULL |

+-----------+-------------+----------------------------+

7 rows in set (0.01 sec)

查看克隆文件

mysql> system ls -lh /home/mysql/mydata_clone;

总用量5.1G

drwxr-x--- 2 mysql mysql 4.0K 10月 10 09:34#clone-rw-r----- 1 mysql mysql 5.5K 10月 10 09:34ib_buffer_pool-rw-r----- 1 mysql mysql 1.0G 10月 10 09:34ibdata1-rw-r----- 1 mysql mysql 2.0G 10月 10 09:34ib_logfile0-rw-r----- 1 mysql mysql 2.0G 10月 10 09:34ib_logfile1

drwxr-x--- 2 mysql mysql 4.0K 10月 10 09:34mysql-rw-r----- 1 mysql mysql 24M 10月 10 09:34mysql.ibd

drwxr-x--- 2 mysql mysql 4.0K 10月 10 09:34sys-rw-r----- 1 mysql mysql 10M 10月 10 09:34undo_001-rw-r----- 1 mysql mysql 10M 10月 10 09:34 undo_002

在上述操作语句中,"/path/to/clone_dir"是将数据克隆到本地目录的绝对路径。

该路径中,"clone_dir"目录不能事先存在(事先存在会报错),但路径前缀"/path/to/"必须事先存在。

另外,MySQL Server必须具有在文件系统中创建目录所需的写权限。

注意:本地克隆操作不支持克隆位于数据目录外部的用户创建的表或表空间。

尝试克隆此类表或表空间会导致报错:

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

克隆操作时如果指定了一个与数据源表空间相同路径时会导致冲突,因此被禁止

重要提示:

当执行克隆操作时,所有用户创建的InnoDB表和表空间,InnoDB系统表空间,redo log和undo log表空间都将被克隆到指定目录下

注意:克隆操作只会克隆数据文件,除了系统变量datadir之外,

如果系统变量innodb_data_home_dir、innodb_data_file_path、innodb_log_group_home_dir、innodb_undo_directory单独指定了不同于datadir指定的路径,则也会被执行克隆,

系统变量socket、pid-file、tmpdir、log-error、slow_query_log_file、log-bin、relay-log指定路径下的文件不会被克隆

如果需要,可以在克隆操作完成后使用克隆的数据目录启动一个新的MySQL Server,例如:

#其中clone_dir是克隆操作完成之后的数据副本目录

shell> mysqld_safe --datadir=clone_dir

#示例

先将第二个MySQL Server的配置文件设置好,不能与同一个主机中其他MySQL Server的配置文件存在路径冲突,也不能存在端口冲突,然后,使用mysqld_safe启动第二MySQL Server,使用--datadir指定克隆的数据副本目录。

由于原先的实例开启了innodb_undo_directory

存放undolog的日志,然而指定目录/data/mysql/mydata_clone

克隆完成后,undolog日志存放了/data/mysql/mydata_clone

这个下面,所以clonemy8.cnf配置文件要重新指定innodb_undo_directory=/data/mysql/mydata_clone,才能基于clone副本数据正常启动新的实例

# pwd

/home/mysql/mydata_clone

查看配置文件

#egrep '3308|mydata_clone'my3308.cnf

port= 3308socket= /home/mysql/mydata_clone/mysql.sock

port= 3308datadir= /home/mysql/mydata_clone

socket= /home/mysql/mydata_clone/mysql.sock

slow_query_log_file= /home/mysql/mydata_clone/slow.log

log-error = /home/mysql/mydata_clone/error.log

server-id = 3308log-bin = /home/mysql/mydata_clone/binlog/mysql-bin

innodb_undo_directory= /home/mysql/mydata_clone

创建目录并修改权限mkdirbinlogchown mysql. /home/mysql/mydata_clone/ -R

启动mysql/usr/local/mysql8/bin/mysqld --defaults-file=/home/mysql/mydata_clone/my3308.cnf &mysql> select *from performance_schema.clone_status;+------+------+-----------+-------------------------+-------------------------+----------------+---------------------------+----------+---------------+-------------+-----------------+---------------+

| ID | PID | STATE | BEGIN_TIME | END_TIME | SOURCE | DESTINATION | ERROR_NO | ERROR_MESSAGE | BINLOG_FILE | BINLOG_POSITION | GTID_EXECUTED |

+------+------+-----------+-------------------------+-------------------------+----------------+---------------------------+----------+---------------+-------------+-----------------+---------------+

| 1 | 12 | Completed | 2020-10-10 09:34:22.694 | 2020-10-10 09:34:42.459 | LOCAL INSTANCE | /home/mysql/mydata_clone/ | 0 | | | 0 | |

+------+------+-----------+-------------------------+-------------------------+----------------+---------------------------+----------+---------------+-------------+-----------------+---------------+

1 row in set (0.00sec)

mysql> select *from performance_schema.clone_progress;+------+-----------+-------------+----------------------------+----------------------------+---------+------------+------------+---------+------------+---------------+

| ID | STAGE | STATE | BEGIN_TIME | END_TIME | THREADS | ESTIMATE | DATA | NETWORK | DATA_SPEED | NETWORK_SPEED |

+------+-----------+-------------+----------------------------+----------------------------+---------+------------+------------+---------+------------+---------------+

| 1 | DROP DATA | Completed | 2020-10-10 09:34:22.694327 | 2020-10-10 09:34:22.696656 | 1 | 0 | 0 | 0 | 0 | 0 |

| 1 | FILE COPY | Completed | 2020-10-10 09:34:22.696814 | 2020-10-10 09:34:31.265343 | 2 | 1119999445 | 1119999445 | 0 | 0 | 0 |

| 1 | PAGE COPY | Completed | 2020-10-10 09:34:31.265535 | 2020-10-10 09:34:31.586777 | 2 | 0 | 0 | 0 | 0 | 0 |

| 1 | REDO COPY | Completed | 2020-10-10 09:34:31.586968 | 2020-10-10 09:34:31.788930 | 2 | 7680 | 7680 | 0 | 0 | 0 |

| 1 | FILE SYNC | Completed | 2020-10-10 09:34:31.789090 | 2020-10-10 09:34:42.458395 | 2 | 0 | 0 | 0 | 0 | 0 |

| 1 | RESTART | Not Started | NULL | NULL | 0 | 0 | 0 | 0 | 0 | 0 |

| 1 | RECOVERY | Not Started | NULL | NULL | 0 | 0 | 0 | 0 | 0 | 0 |

+------+-----------+-------------+----------------------------+----------------------------+---------+------------+------------+---------+------------+---------------+

7 rows in set (0.00 sec)

总结:个人感觉不太喜欢本地克隆的数据,因为只克隆了data目录下的相关数据,不会克隆原实例的全部目录结构,不好管理和维护。

3、克隆远程数据

环境:

10.72.23.45 master实例

10.72.23.44 新的实例

安装过程可以参考“三、安装克隆插件”,此处不再赘述。

确保俩台机器都启动了clone插件

mysql> selectversion();+-----------+

| version() |

+-----------+

| 8.0.20 |

+-----------+

1 row in set (0.00sec)

mysql> selectuser();+----------------+

| user() |

+----------------+

| root@localhost |

+----------------+

1 row in set (0.00sec)

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.01 sec)

账号授权

开始操作演示:

10.72.23.45 donor机器发送端操作:

用管理用户登录到发送方 donor MySQL Server中,创建一个克隆用户并赋予BACKUP_ADMIN权限:

root@localhost [(none)]> create user donor_clone_user@'10.72.23.%' identified by 'mysql123';

Query OK,0 rows affected (0.02sec)

root@localhost [(none)]> grant backup_admin on *.* to donor_clone_user@'10.72.23.%';

Query OK,0 rows affected (0.02sec)

在donor MySQL Server中安装克隆插件:

root@localhost [(none)]>INSTALL PLUGIN clone SONAME 'mysql_clone.so';

ERROR1125 (HY000): Function 'clone' already exists

10.72.23.44接受方机器操作:

使用管理用户登录到接收方MySQL Server,创建一个克隆用户并赋予CLONE_ADMIN权限:

root@localhost [(none)]>create user recipient_clone_user@'10.72.23.%' identified by 'mysql123';

root@localhost [(none)]>grant clone_admin on *.* to recipient_clone_user@'10.72.23.%';

在接收方MySQL Server中安装克隆插件:

root@localhost [(none)]>INSTALL PLUGIN clone SONAME 'mysql_clone.so';

ERROR1125 (HY000): Function 'clone'already exists

将donor MySQL Server的主机地址添加到接收方MySQL Server的clone_valid_donor_list变量中:

root@localhost [(none)]> SET GLOBAL clone_valid_donor_list = '10.72.23.45:3307';

以在donor MySQL Server中创建的克隆用户,登录到接收方MySQL Server中,执行如下克隆语句:(指定克隆目录操作)

root@localhost [(none)]>CLONE INSTANCE FROM 'donor_clone_user'@'10.72.23.45':3307 IDENTIFIED BY 'mysql123' DATA DIRECTORY = '/home/mysql/3307/clone_data';

Query OK,0 rows affected (24.72sec)

查看克隆状态:

use performance_schema;

mysql> select *from clone_status\G;*************************** 1. row ***************************ID:1PID:9STATE: Completed

BEGIN_TIME:2020-10-10 11:00:01.116END_TIME:2020-10-10 11:01:04.177SOURCE:10.72.23.45:3307DESTINATION:/home/mysql/3307/clone_data/ERROR_NO:0ERROR_MESSAGE:

BINLOG_FILE:

BINLOG_POSITION:0GTID_EXECUTED:1 row in set (0.00sec)

ERROR:

No query specified

mysql> select *from clone_progress;+------+-----------+-------------+----------------------------+----------------------------+---------+------------+------------+------------+------------+---------------+

| ID | STAGE | STATE | BEGIN_TIME | END_TIME | THREADS | ESTIMATE | DATA | NETWORK | DATA_SPEED | NETWORK_SPEED |

+------+-----------+-------------+----------------------------+----------------------------+---------+------------+------------+------------+------------+---------------+

| 1 | DROP DATA | Completed | 2020-10-10 11:00:01.236066 | 2020-10-10 11:00:01.337572 | 1 | 0 | 0 | 0 | 0 | 0 |

| 1 | FILE COPY | Completed | 2020-10-10 11:00:01.337831 | 2020-10-10 11:00:15.023297 | 4 | 1119999445 | 1119999445 | 1120067369 | 0 | 0 |

| 1 | PAGE COPY | Completed | 2020-10-10 11:00:15.023590 | 2020-10-10 11:00:15.434913 | 4 | 0 | 0 | 393 | 0 | 0 |

| 1 | REDO COPY | Completed | 2020-10-10 11:00:15.435333 | 2020-10-10 11:00:15.735725 | 4 | 6144 | 6144 | 6835 | 0 | 0 |

| 1 | FILE SYNC | Completed | 2020-10-10 11:00:15.735979 | 2020-10-10 11:01:04.176982 | 4 | 0 | 0 | 0 | 0 | 0 |

| 1 | RESTART | Not Started | NULL | NULL | 0 | 0 | 0 | 0 | 0 | 0 |

| 1 | RECOVERY | Not Started | NULL | NULL | 0 | 0 | 0 | 0 | 0 | 0 |

+------+-----------+-------------+----------------------------+----------------------------+---------+------------+------------+------------+------------+---------------+

7 rows in set (0.00 sec)

克隆到指定目录说明:

默认情况下,远程克隆操作会删除接收方数据目录中的数据,并用克隆的数据替换它。

通过克隆到指定目录,可以避免接收方数据目录中的现有数据被删除,也不会执行重启MySQL Server的操作。

将数据克隆到指定目录的过程与不指定目录的克隆远程数据过程相同,但有一点区别,前者的克隆语句必须包含DATA DIRECTORY [=] 'clone_dir'子句。

例如:CLONE

INSTANCE FROM 'donor_clone_user'@'192.168.1.105':3306 IDENTIFIED BY

'clone_test66' DATA DIRECTORY = '/data/mysql/3307/clone_data';

其中,DATA DIRECTORY子句需要指定一个绝对路径,且该目录不能事先存在,MySQL Server必须具有创建目录所需的写访问权限

克隆到指定目录时,在克隆数据完成之后,不会自动重新启动接收方MySQL Server。

如果你想使用指定目录启动MySQL Server,你必须手动修改一些文件的目录调整之后再执行启动,或者直接使用新的my.cnf配置文件,

在启动时将--datadir选项指定到克隆数据所在的目录,例如:mysqld_safe --datadir=/data/mysql/3307/clone_data

由于配置文件制定了undo文件存放目录,所以也要修改下:

[root@mysql-redis182 ~]# grep -w 'clone_data' /data/mysql/3307/my8.cnf

datadir= /home/mysql/3307/clone_data

innodb_undo_directory= /home/mysql/3307/clone_data

记得修改server-id与master不一样

# cat my3307.cnf |grep server-id

server-id = 443307sed -i 's#/home/mysql/mysql3307#/home/mysql/3307/clone_data#g' my3307.cnf

mkdir binlog

chown mysql. binlog/ -R

然后启动mysql服务:

/usr/local/mysql8/bin/mysqld --defaults-file=/home/mysql/3307/clone_data/my3307.cnf &查看45的数据已经克隆过来

#/usr/local/mysql8/bin/mysql -uroot -p'mysql123' -S /home/mysql/3307/clone_data/mysql.sockmysql>show databases;+--------------------+

| Database |

+--------------------+

| information_schema |

| mysql |

| performance_schema |

| sys |

| test |

+--------------------+

5 rows in set (0.01 sec)

启动克隆版的MySQL,查看接受放的二进制日志位置和gtid信息:

克隆操作结束之后,可在执行克隆操作的MySQL Server上执行如下查询语句,以检查发送给接收方的二进制日志位置:

mysql>SELECT BINLOG_FILE, BINLOG_POSITION FROM performance_schema.clone_status;+------------------+-----------------+

| BINLOG_FILE | BINLOG_POSITION |

+------------------+-----------------+

| mysql-bin.000002 | 2234 |

+------------------+-----------------+

1 row in set (0.00 sec)

在克隆操作结束之后,可在执行克隆操作的MySQL Server上执行如下查询,以检查传输给接收方的GTID SET:

mysql>SELECT @@GLOBAL.GTID_EXECUTED;+------------------------------------------+

| @@GLOBAL.GTID_EXECUTED |

+------------------------------------------+

| 8fb02055-0a08-11eb-a98b-ac162dbda4a4:1-9 |

+------------------------------------------+

1 row in set (0.00 sec)

提示:当在192.168.1.182机器接受端未指定克隆目录操作,会清空当前192.168.1.182mysql实例数据目录下的数据,然后把克隆的数据复制过来,并且会自动重启mysql服务,由于undolog日志路径变化导致重启失败

登录到接收方192.168.1.182MySQL Server中,执行如下克隆语句:(未指定克隆目录操作)

root@localhost [(none)]> CLONE INSTANCE FROM 'donor_clone_user'@'192.168.1.105':3306 IDENTIFIED BY 'clone_test66' ;

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

4、利用远程克隆的数据进行复制拓扑扩展应用介绍:

当在发送方上设置master_info_repository=TABLE和relay_log_info_repository=TABLE时(这是MySQL 8.0的默认设置),如果发送方是一个从库角色,那么从库的状态日志会被保存在表中,这些表在克隆操作期间会从发送方当做数据复制到接收方。

从库的状态日志中保存了与复制相关的配置设置,这些设置可用于在克隆操作成功之后正确地自动恢复复制

(如果配置文件中没有设置skip_slave_start参数,则在克隆操作完成之后会自动启动复制线程,另外,如果发送方不是从库而是主库,那么从库的状态日志表中并不存在复制配置信息,因此不适用,恢复复制过程中需要手动执行CHANGE

MASTER语句进行配置)。

在MySQL 8.0.17和8.0.18中,只有mysql.slave_master_info表才会被复制到接收方(主库信息日志)

从MySQL 8.0.19开始,mysql.slave_relay_log_info(中继日志信息日志)和mysql.slave_worker_info(从库worker线程日志)也会被复制到接收方

PS:有关上述三张表中每个表包含的内容列表及其含义,请参阅:https://dev.mysql.com/doc/refman/8.0/en/slave-logs-status.html。

注意,如果在发送方上设置了master_info_repository=FILE和relay_log_info_repository=FILE(这不是MySQL

8.0的默认设置,并且是不推荐的),则不会克隆从库的状态日志,只有在发送方设置master_info_repository=TABLE和relay_log_info_repository=TABLE时才会克隆从库的状态日志信息。

要在复制拓扑中使用克隆,请按照以下步骤执行:

对于用于组复制的新组成员,请先按照链接:https://dev.mysql.com/doc/refman/8.0/en/group-replication-adding-instances.html 中的说明为组复制配置好MySQL Server环境,且按照链接:https://dev.mysql.com/doc/refman/8.0/en/group-replication-cloning.html的说明设置好克隆功能所需的前提条件。

然后,在joiner成员上执行START GROUP_REPLICATION语句时,克隆操作由组复制自动管理,因此不需要手动执行joiner成员加入组的操作,也不需要在joiner成员上执行任何进一步的设置步骤。

对于主从复制拓扑中的从库,首先在从库(接收方)中手动执行远程克隆操作语句,将数据从donor MySQL Server克隆到接收方。

在复制拓扑中,发送方必须是主库或从库。如果发送方是主库的,则后续需要手动执行CHANGE MASTER语句来配置复制,如果发送方是从库的,则不需要手动执行复制配置操作,复制能够通过克隆数据进行自动恢复复制

(配置文件中指定了skip_slave_start参数的情况除外)。有关克隆语句的详细信息,请参见"3、克隆远程数据"

克隆操作成功完成后,如果要在接收方MySQL Server上使用与发送方相同的复制通道,请验证其中哪些设置或配置可以在主从复制拓扑中自动恢复,哪些需要手动设置才能恢复。

对于基于GTID的复制,如果在接收方配置了gtid_mode=ON,并且在发送方设置了gtid_mode=ON、ON_PERMISSIVE或

OFF_PERMISSIVE值,则接收方的gtid_executed系统变量中的GTID SET会作为接收方的GTID SET。

如果接收方的数据是从拓扑中已经存在的一个从库中克隆出来的,则在启用了GTID自动定位(由CHANGE

MASTER TO语句上的MASTER_AUTO_POSITION选项指定)的接收方上的复制通道可以在自动重启MySQL

Server之后自动恢复,不需要执行任何手动设置(如果需要修改复制通道,则自行调整,这里不做赘述)

对于基于二进制日志文件位置的复制,如果接收方使用的是MySQL 8.0.17或8.0.18,则来自发送方的二进制日志位置不应用于接收方,仅记录在performance_schema.clone_status表中。

因此,在自动重启实例之后,必须在接收方中手动为复制通道设置使用基于二进制日志文件位置的复制,以便恢复复制。

在这种情况下,需要确保在重启实例时启用skip_slave_start来避免复制自动启动,因为此时并未设置二进制日志位置,自动启动复制将尝试从头开始复制。

对于基于二进制日志文件位置的复制,如果接收方使用的是MySQL 8.0.19或以上版本,则来自发送方的二进制日志位置将应用于接收方。

接收方上使用基于二进制日志文件位置的复制,将会在自动重启复制通道之前,使用中继日志信息自动尝试执行中继日志的恢复过程。

注意:对于单线程的从库(slave_parallel_workers设置为0),在没有任何其他意外发生的情况下,复制通道无需进一步设置即可成功恢复复制。

对于多线程的从库(slave_parallel_workers大于0),中继日志恢复可能会失败,因为它通常不能自动完成。在这种情况下,会发出一条错误消息,您必须手动设置通道

环境:10.72.23.45master10.72.23.44slave

#在master 44创建复制账号

create user rep@'10.72.23.44' identified by 'mysql123';

grant replication slave on*.* to rep@'10.72.23.44';

# 在slave 45上执行复制语句

CHANGE MASTER TO MASTER_HOST='10.72.23.45',MASTER_PORT=3307,MASTER_USER='rep',MASTER_PASSWORD='mysql123',MASTER_AUTO_POSITION = 1;

mysql>start slave;

Query OK,0 rows affected (0.02sec)

mysql>show slave status\G;*************************** 1. row ***************************Slave_IO_State: Waitingformaster to send event

Master_Host:10.72.23.45Master_User: rep

Master_Port:3307Connect_Retry:60Master_Log_File: mysql-bin.000002Read_Master_Log_Pos:3487Relay_Log_File: localhost-relay-bin.000002Relay_Log_Pos:1671Relay_Master_Log_File: mysql-bin.000002Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno:0Last_Error:

Skip_Counter:0Exec_Master_Log_Pos:3487Relay_Log_Space:1884Until_Condition: None

Until_Log_File:

Until_Log_Pos:0Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master:0Master_SSL_Verify_Server_Cert: No

Last_IO_Errno:0Last_IO_Error:

Last_SQL_Errno:0Last_SQL_Error:

Replicate_Ignore_Server_Ids:

Master_Server_Id:3307Master_UUID: 8fb02055-0a08-11eb-a98b-ac162dbda4a4

Master_Info_File: mysql.slave_master_info

SQL_Delay:0SQL_Remaining_Delay: NULL

Slave_SQL_Running_State: Slave has read all relay log; waitingfor moreupdates

Master_Retry_Count:86400Master_Bind:

Last_IO_Error_Timestamp:

Last_SQL_Error_Timestamp:

Master_SSL_Crl:

Master_SSL_Crlpath:

Retrieved_Gtid_Set: 8fb02055-0a08-11eb-a98b-ac162dbda4a4:10-12Executed_Gtid_Set: 8fb02055-0a08-11eb-a98b-ac162dbda4a4:1-12Auto_Position:1Replicate_Rewrite_DB:

Channel_Name:

Master_TLS_Version:

Master_public_key_path:

Get_master_public_key:0Network_Namespace:1 row in set (0.00sec)

ERROR:

No query specified

在45上创建数据库test1

mysql>create database test1;

Query OK,1 row affected (0.00sec)

在44上查看

mysql>show databases;+--------------------+

| Database |

+--------------------+

| information_schema |

| mysql |

| performance_schema |

| sys |

| test |

| test1 |

+--------------------+

6 rows in set (0.01 sec)

5、远程克隆数据注意事项:

执行CLONE INSTANCE在非donor实例上执行。

不指定DATA DIRECTORY,将先清空本地数据,再做克隆拷贝,并自动重启MySQL实例(建议mysqld_safe启动)。

若指定DATA DIRECTORY,本地磁盘空间需要更多的空间(克隆数据+本地历史数据),不会自动重启MySQL实例

donor 和 recipient的MySQL版本要一致,并且至少8.0.17或者更高的版本。

donor 和 recipient的操作系统不能跨平台。

donor 和 recipient需要具有相同的字符集和排序规则。

donor和 recipient需要设置相同的 innodb_page_size and innodb_data_file_path

如果克隆了加密或者页压缩的数据,donor 和 recipient需要保持一样的文件系统块大小。

克隆命令将以1MB的包大小传输,所以donor 和 recipient的 max_allowed_packet至少要设置2MB。

6、其他注意事项

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

一次只能克隆一个MySQL实例。不支持在单个克隆操作中克隆多个MySQL实例。

远程克隆操作(在CLONE INSTANCE语句中指定Donor的MySQL服务器实例的端口号时)不支持mysqlx_port指定的X协议端口。

clone插件不支持MySQL配置参数的克隆。

clone插件不支持二进制日志的克隆。

克隆插件仅克隆存储在InnoDB中的数据。其他存储引擎数据未克隆。存储在任何数据库(包括sys模式)中的MyISAM和CSV表都被克隆为空表

鸣谢:本博文是在学些了马蜂窝高级DBA张充和爱可生高级DBA罗小波分享在知书堂微信公众号的关于MySQL8.0的clone

plugin插件的文章。结合自己的理解总结于此。特别感谢二位的分享。同时我也分享出来,希望能帮助到更多的爱好MySQL伙伴,一起交流,一起成长。

转自

最详细的clone plugin 介绍-10931853-51CTO博客 https://blog.51cto.com/wujianwei/2493941?source=dra

参考

(2条消息) 技术分享 | 实战 MySQL 8.0.17 Clone Plugin_ActionTech的博客-CSDN博客 https://blog.csdn.net/actiontech/article/details/98054877

MySQL clone plugin(克隆插件) - 简书 https://www.jianshu.com/p/ed7e0796a3d8


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部