MySQL Clone Plugin(克隆插件,8.0.17+)
一. 克隆插件是什么?
- 允许从本地或远程MySQL服务器实例拷贝数据
- 可对InnoDB的schemas,tables,tablespaces,数据字典元数据进行物理快照
- 支持replication,如用于MGR
二. 使用克隆插件
2.1 安装克隆插件
# 方式一:配置文件加载插件
[mysqld]
plugin-load-add=mysql_clone.so
# 方式二:使用install plugin语句,会在mysql.plugins表中注册
install plugin clone SONAME 'mysql_clone.so';
如果安装报错ERROR 1123 (HY000): Can't initialize function 'clone'; Plugin initialization function failed.,检查explicit_defaults_for_timestamp是否开启(1):参考Bug #96281
2.2 克隆本地数据
将本地MySQL数据目录克隆到另一个目录,用户需要BACKUP_ADMIN权限
# 创建用户和授权
create user 'clone_backup'@'localhost' identified by 'xxx';
grant backup_admin on *.* to 'clone_backup'@'localhost';
# 将数据目录克隆到/backup/clone-local-1823,目录需为绝对路径,且目录需不存在,且路径需要MySQL服务可写
# 不支持克隆数据目录之外的表空间和表
# 可以使用克隆的目录启动MySQL服务
mkdir /backup
chown mysql.mysql /backup
clone local data directory '/backup/clone-local-1823';
# 使用克隆目录启动服务
./bin/mysqld_safe \
--datadir=/backup/clone-local-1823/ \
--port=3309 \
--user=mysql \
--log-error=error.log \
--socket=/tmp/mysql3309.sock \
--lower_case_table_names=1 \
--mysqlx_port=33069 \
--mysqlx_socket=/tmp/mysqlx3309.sock \
--pid-file=mysqld.pid
克隆期间锁占用,会阻塞DDL操作(Waiting for backup lock),DML在clone完成最后阶段会遭遇waiting for handler commit,克隆数据是执行clone这个时间点的数据快照。
2.3 克隆远程实例数据
可以克隆到远程机器的当前运行实例的数据目录,会删除当前数据,然后会自动重启服务,也可以通过DATA DIRECTORY指定一个不存在的绝对路径,将数据克隆到该目录;支持克隆数据目录外的表空间;
克隆准备步骤:
- 两个MySQL实例都需要安装并激活clone插件
- 创建相关用户账户
- 源端:需要BACKUP_ADMIN权限,克隆期间阻塞DDL操作
- 目的端:需要CLONE_ADMIN(隐含包括BACKUP_ADMIN和SHUTDOWN权限)权限,克隆期间阻塞DDL操作,并会自动重启服务
- 源端和目的端MySQL版本、OS版本需要一致,确保目的端有足够的磁盘空间存储所需克隆的InnoDB数据
- 源端和目的端MySQL服务的字符集和校对集需一致
- 源端和目的端MySQL服务的
innodb_page_size和innodb_data_file_path配置需一致 - 如克隆加密或页面压缩数据,源端和目的端的文件系统块大小需一致,对页压缩数据,目的端系统还需支持sparse files和hole punching;加密数据还需要使用安全连接;
- 仅支持同时进行一个clone,确保源端的IP地址在目的端的
clone_valid_donor_list参数配置中; max_allowed_packet最小值需为2MB- 源端的UNDO表空间文件需唯一,通过
SELECT TABLESPACE_NAME, FILE_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE LIKE 'UNDO LOG';可检查 - 目的端因MySQL实例需自动重启(克隆到另外的目录不需要重启),需有守护进程监控
源端(10.82.30.102:3308):
# 创建用户
create user 'clone_server'@'10.82.30.101' identified by 'xxx';
grant backup_admin on *.* to 'clone_server'@'10.82.30.101';
# 安装插件
install plugin clone SONAME 'mysql_clone.so';
目的端(10.82.30.101:3308):
# 创建用户
create user 'clone_client'@'localhost' identified by 'xxx';
grant clone_admin on *.* to 'clone_client'@'localhost';
# 安装插件
install plugin clone SONAME 'mysql_clone.so';
# 添加源端IP到白名单
set global clone_valid_donor_list='10.82.30.102:3308';
# 使用clone用户登录
./bin/mysql -S /tmp/mysql3308.sock -uclone_client -p
# 一. 执行clone命令,将数据复制到实例数据目录
clone instance from 'clone_server'@'10.82.30.102':3308 identified by 'xxx';
# 查看克隆状态
select id,pid,state,source,destination,error_no,error_message,binlog_file,binlog_position from performance_schema.clone_status;
# 二. 执行clone命令,将数据复制到指定目录(目录需不存在,同时MySQL服务有写权限)
mkdir /backup
chown mysql.mysql /backup
# 操作用户还需要BACKUP_ADMIN权限,文档没提及
grant backup_admin on *.* to 'clone_client'@'localhost';
clone instance from 'clone_server'@'10.82.30.102':3308 identified by 'xxx' data directory='/backup/clone-102';
来源:oschina
链接:https://my.oschina.net/anthonyyau/blog/4308458