1 . Clone Plugin介绍
本地克隆:
启动克隆操作的MySQL服务器实例中的数据,克隆到同服务器或同节点上的一个目录里
远程克隆:
默认情况下,远程克隆操作会删除接受者(recipient)数据目录中的数据,并将其替换为捐赠者
(donor)的克隆数据。您也可以将数据克隆到接受者的其他目录,以避免删除现有数据。(可选)
2. 原理
PAGE COPY
这里有两个动作
开启redo archiving功能,从当前点开始存储新增的redo log,这样从当前点开始所有的增量修改
都不会丢失。同时上一步在page track的page被发送到目标端。确保当前点之前所做的变更一定发送
到目标端。
关于redo archiving,实际上这是官方早就存在的功能,主要用于官方的企业级备份工具,但这里
clone利用了该特性来维持增量修改产生的redo。
在开始前会做一次checkpoint, 开启一个后台线程log_archiver_thread()来做日志归档。当有
新的写入时(notify_about_advanced_write_lsn)也会通知他去archive。当arch_log_sys处
于活跃状态时,他会控制日志写入以避免未归档的日志被覆盖(log_writer_wait_on_archiver),
注意如果log_writer等待时间过长的话, archive任务会被中断掉.
Redo Copy
停止Redo Archiving", 所有归档的日志被发送到目标端,这些日志包含了从page copy阶段开始到
现在的所有日志,另外可能还需要记下当前的复制点,例如最后一个事务提交时的binlog位点或者
gtid信息,在系统页中可以找到
Done
目标端重启实例,通过crash recovery将redo log应用上去。
3. 限制
官方文档列出的一些限制:
4. 应用
4.1 本地
4.1.1 加载插件
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
或
[mysqld]
plugin-load-add=mysql_clone.so
clone=FORCE_PLUS_PERMANENT
SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE 'clone';
4.1.2 创建克隆专用用户
CREATE USER clone_user@'%' IDENTIFIED by 'password';
GRANT BACKUP_ADMIN ON *.* TO 'clone_user';
BACKUP_ADMIN是MySQL8.0 才有的备份锁的权限
4.1.3 本地克隆
[root@db01 3306]# mkdir -p /data/test/
[root@db01 3306]# chown -R mysql.mysql /data/
mysql -uclone_user -ppassword
CLONE LOCAL DATA DIRECTORY = '/data/test/clonedir';
root下观测状态
db01 [(none)]> SELECT STAGE, STATE, END_TIME FROM
performance_schema.clone_progress;
+-----------+-------------+----------------------------+
| STAGE | STATE | END_TIME |
+-----------+-------------+----------------------------+
| DROP DATA | Completed | 2020-04-20 21:13:19.264003 |
| FILE COPY | Completed | 2020-04-20 21:13:20.025444 |
| PAGE COPY | Completed | 2020-04-20 21:13:20.028552 |
| REDO COPY | Completed | 2020-04-20 21:13:20.030042 |
| FILE SYNC | Completed | 2020-04-20 21:13:20.439444 |
| RESTART | Not Started | NULL |
| RECOVERY | Not Started | NULL |
+-----------+-------------+----------------------------+
7 rows in set (0.00 sec)
日志观测:
set global log_error_verbosity=3;
tail -f db01.err
CLONE LOCAL DATA DIRECTORY = '/data/test/clonedir1';
4.1.4 启动新实例
[root@db01 clonedir]# mysqld_safe --datadir=/data/test/clonedir --
port=3333 --socket=/tmp/mysql3333.sock --user=mysql --mysqlx=OFF &
远程克隆
实验中,未完待续…