MySQL 8 Clone Plugin应用
2020-10-13 本文已影响0人
醉红尘丶
8.0.17开始支持clone插件功能
本地克隆
启动克隆操作的MySQL服务器实例中的数据,克隆到同服务器或同节点上的一个目录里
[图片上传失败...(image-ca83c5-1602639875106)]
远程克隆
默认情况下,远程克隆操作会删除接受者(recipient)数据目录中的数据,并将其替换为捐赠者(donor)的克隆数据。
您可以将数据克隆到收件人的其他目录中,以避免删除现有数据。(可选)
与通过远程克隆操作相比,通过本地克隆操作克隆的数据没有区别,两种操作都克隆相同的数据。
[图片上传失败...(image-694a64-1602639875106)]
原理
PAGE COPY
-
1. 开启redo archiving功能
从当前点开始存储新增的redo log,这样从当前点开始所有的增量修改都不会丢失。同时上一步在page track的page被发送到目标端。确保当前点之前所做的变更一定发送到目标端。
关于redo archiving,实际上这是官方早就存在的功能,主要用于官方的企业级备份工具,但这里clone利用了该特性来维持增量修改产生的redo。 -
2. 在开始前会做一次checkpoint
开启一个后台线程log_archiver_thread()来做日志归档。当有新的写入时(notify_about_advanced_write_lsn)也会通知他去archive。当arch_log_sys处于活跃状态时,他会控制日志写入以避免未归档的日志被覆盖(log_writer_wait_on_archiver).
注意如果log_writer等待时间过长的话, archive任务会被中断掉.
Redo Copy -
3. 停止Redo Archiving"
所有归档的日志被发送到目标端,这些日志包含了从page copy阶段开始到现在的所有日志,另外可能还需要记下当前的复制点,例如最后一个事务提交时的binlog位点或者gtid信息,在系统页中可以找到
Final -
4. 目标端重启实例
通过crash recovery将redo log应用上去。
限制
克隆插件受以下限制:
- 克隆操作期间不允许使用 DDL(包括 TRUNCATE TABLE)。选择数据源时应考虑此限制,可以考虑使用从库来做数据源。
- 捐赠者和接受者必须具有完全相同的MySQL服务器版本和发行版。例如,您不能在MySQL 5.7和MySQL 8.0之间或MySQL 8.0.19和MySQL 8.0.20之间克隆。仅MySQL 8.0.17及更高版本支持clone插件。
- 一次只能克隆一个MySQL实例。不支持在单个克隆操作中克隆多个MySQL实例。
- mysqlx_port远程克隆操作(在CLONE INSTANCE语句中指定施主MySQL服务器实例的端口号时)不支持指定的X协议端口 。
- 不支持克隆my.cnf文件。接收者会保留相同的参数变量,包括持久的系统变量设置。
- clone插件不支持二进制日志的克隆。
- clone插件仅克隆存储在中的数据 InnoDB。其他存储引擎数据未克隆。MyISAM和 CSV存储在任何架构,包括表sys架构中克隆为空表。
- 不支持通过MySQL Router连接到捐赠者MySQL服务器实例。
- 本地克隆操作不支持克隆使用绝对路径创建的常规表空间。与源表空间文件具有相同路径的克隆表空间文件将导致冲突。
实际应用
测试环境
- 捐赠者 192.168.20.200
- 接受者 192.168.20.100
- 均为 MySQL 8.0.18
- 系统为 CentOS 7.5
启动时自动加载
在my.cnf中配置
[mysqld]
plugin-load-add=mysql_clone.so
安装插件
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
## 验证插件是否正常安装执行如下语句或show plugins查看
root [(none)]> 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)
创建克隆用户
create user 'clone_user'@'%' identified by '123456';
# 备份只需要 BACKUP_ADMIN 即可,这边授权CLONE_ADMIN是为了后面远程复制使用
GRANT BACKUP_ADMIN,CLONE_ADMIN ON *.* TO 'clone_user'@'%';
本地克隆
# 创建目录
[root@initnode ~]# mkdir /data/newmysql
[root@initnode ~]# chown mysql.mysql /data/newmysql
# 登陆执行克隆操作
[root@initnode ~]# mysql -h127.0.0.1 -uclone_user -p123456
clone_user [(none)]> CLONE LOCAL DATA DIRECTORY = '/data/newmysql/newmysql';
Query OK, 0 rows affected (4.37 sec)
# 查看克隆进度
root [(none)]> SELECT STAGE, STATE, END_TIME FROM performance_schema.clone_progress;
+-----------+-------------+----------------------------+
| STAGE | STATE | END_TIME |
+-----------+-------------+----------------------------+
| DROP DATA | Completed | 2020-10-13 16:01:09.433805 |
| FILE COPY | Completed | 2020-10-13 16:01:28.156082 |
| PAGE COPY | Completed | 2020-10-13 16:01:28.362579 |
| REDO COPY | Completed | 2020-10-13 16:01:28.563969 |
| FILE SYNC | Completed | 2020-10-13 16:01:31.436841 |
| RESTART | Not Started | NULL |
| RECOVERY | Not Started | NULL |
+-----------+-------------+----------------------------+
7 rows in set (0.00 sec)
启动克隆出的实例
# 编辑一份my.cnf文件
cp /etc/my.cnf /etc/my1111.cnf #对应修改路径等
# 启动
mysqld_safe --defaults-file=/etc/my1111.cnf --datadir=/data/newmysql/newmysql --user=mysql --mysqlx=OFF &
远程clone
捐赠者和接受者分别创建克隆用户
create user 'clone_user'@'%' identified by '123456';
# 备份只需要 BACKUP_ADMIN 即可,这边授权CLONE_ADMIN是为了后面远程复制使用
GRANT BACKUP_ADMIN,CLONE_ADMIN ON *.* TO 'clone_user'@'%';
实际捐赠者需要 BACKUP_ADMIN,接受者需要 CLONE_ADMIN 的权限即可
远程clone
以下操作均在接受者上执行
注意:接受者会清空掉原有的数据文件并重启,若这个库上有需要的数据请提前备份出来。
# 开始克隆
root [(none)]> SET GLOBAL clone_valid_donor_list = '192.168.20.200:3306';
Query OK, 0 rows affected (0.00 sec)
[root@initnode ~]# mysql -uclone_user -p123456 -h127.0.0.1
clone_user [(none)]> CLONE INSTANCE FROM clone_user@'192.168.20.200':3306 IDENTIFIED BY '123456';
Query OK, 0 rows affected (17.15 sec)
# 查看状态:
root [aaa]> SELECT STAGE, STATE, END_TIME FROM performance_schema.clone_progress;
+-----------+-----------+----------------------------+
| STAGE | STATE | END_TIME |
+-----------+-----------+----------------------------+
| DROP DATA | Completed | 2020-10-14 09:15:59.610589 |
| FILE COPY | Completed | 2020-10-14 09:16:15.617052 |
| PAGE COPY | Completed | 2020-10-14 09:16:15.920651 |
| REDO COPY | Completed | 2020-10-14 09:16:16.223565 |
| FILE SYNC | Completed | 2020-10-14 09:16:16.477574 |
| RESTART | Completed | 2020-10-14 09:16:20.160321 |
| RECOVERY | Completed | 2020-10-14 09:16:20.866489 |
+-----------+-----------+----------------------------+
root [aaa]> SELECT STATE FROM performance_schema.clone_status;
+-----------+
| STATE |
+-----------+
| Completed |
+-----------+
1 row in set (0.01 sec)
接下去就能用这个来创建主从了
这还是个无锁备份【均为 innodb 表】,只是在clone期间,捐赠者无法执行DDL,感觉未来xtrabackup 要凉