原 【DB宝33】使用MySQL8.0.17的clone技术在线搭建主从复制环境
一、MySQL 8.0.17的克隆clone简介
MySQL 8.0.17的克隆插件允许在本地或从远程 MySQL 实例在线克隆数据,从此搭建从库可以不再需要备份工具(PXB或mysqldump)来实现了。克隆数据是存储在 InnoDB 其中的数据的物理快照,其中包括库、表、表空间和数据字典元数据。克隆的数据包含一个功能齐全的数据目录,允许使用克隆插件进行 MySQL 服务器配置。
克隆插件支持两种克隆方式:
本地克隆:本地克隆操作将启动克隆操作的 MySQL 服务器实例中的数据克隆到同服务器或同节点上的一个目录里。
远程克隆:默认情况下,远程克隆操作会删除接受者(recipient)数据目录中的数据,并将其替换为捐赠者(donor)的克隆数据。(可选)您也可以将数据克隆到接受者的其他目录,以避免删除现有数据。
远程克隆操作和本地克隆操作克隆的数据没有区别,数据是相同的。克隆插件支持复制。除克隆数据外,克隆操作还从捐赠者中提取并传输复制位置信息,并将其应用于接受者,从而可以使用克隆插件来配置组复制或主从复制。使用克隆插件进行配置比复制大量事务要快得多,效率更高。
官网地址:https://dev.mysql.com/doc/refman/8.0/en/clone-plugin.html
二、初始化主从复制环境
Mater: 192.168.68.168 port:3306 doner 捐赠者
Slave: 192.168.68.169 port:3306 recipient 接受者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | -- 下载镜像 docker pull mysql:8.0.20 -- 创建主从网络环境 docker network create --subnet=192.168.68.0/16 mhalhr docker network inspect mhalhr -- 创建MySQL参数文件路径 mkdir -p /etc/mysql/mysql8020M1/ mkdir -p /etc/mysql/mysql8020S1/ -- 删除已存在的容器 docker rm -f mysql8020M1 docker rm -f mysql8020S1 -- 创建主库 docker run -d --name mysql8020M1 -h mysql8020M1 -p 3318:3306 \ -v /etc/mysql/mysql8020M1/conf:/etc/mysql/conf.d \ -e MYSQL_ROOT_PASSWORD=lhr -e TZ=Asia/Shanghai \ --network mhalhr --ip 192.168.68.168 \ mysql:8.0.20 -- 创建从库 docker run -d --name mysql8020S1 -h mysql8020S1 -p 3319:3306 \ -v /etc/mysql/mysql8020S1/conf:/etc/mysql/conf.d \ -e MYSQL_ROOT_PASSWORD=lhr -e TZ=Asia/Shanghai \ --network mhalhr --ip 192.168.68.169 \ mysql:8.0.20 -- 修改主从环境的参数文件 cat > /etc/mysql/mysql8020M1/conf/my.cnf <<"EOF" [mysqld] default-time-zone = '+8:00' log_timestamps = SYSTEM skip-name-resolve log-bin server_id=80203318 character_set_server=utf8mb4 gtid_mode=on enforce_gtid_consistency=on binlog-ignore-db = mysql binlog-ignore-db = information_schema binlog-ignore-db = performance_schema binlog-ignore-db = sys replicate_ignore_db=information_schema replicate_ignore_db=performance_schema replicate_ignore_db=mysql replicate_ignore_db=sys default_authentication_plugin=mysql_native_password report_host = 192.168.68.168 report_port = 3306 EOF cat > /etc/mysql/mysql8020S1/conf/my.cnf <<"EOF" [mysqld] default-time-zone = '+8:00' log_timestamps = SYSTEM skip-name-resolve log-bin server_id=80203319 character_set_server=utf8mb4 gtid_mode=on enforce_gtid_consistency=on binlog-ignore-db = mysql binlog-ignore-db = information_schema binlog-ignore-db = performance_schema binlog-ignore-db = sys replicate_ignore_db=information_schema replicate_ignore_db=performance_schema replicate_ignore_db=mysql replicate_ignore_db=sys default_authentication_plugin=mysql_native_password report_host = 192.168.68.169 report_port = 3306 EOF -- 添加网卡 docker network connect bridge mysql8020M1 docker network connect bridge mysql8020S1 -- 重启主从环境 docker restart mysql8020M1 mysql8020S1 |
最后结果:
1 2 3 4 | [root@docker35 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ebe3b62a2358 mysql:8.0.20 "docker-entrypoint.s…" About a minute ago Up 1 second 33060/tcp, 0.0.0.0:3319->3306/tcp mysql8020S1 76140b04e2fd mysql:8.0.20 "docker-entrypoint.s…" 2 minutes ago Up 4 seconds 33060/tcp, 0.0.0.0:3318->3306/tcp mysql8020M1 |
三、使用clone技术搭建主从复制
3.1 主库创建复制用户
创建复制用户:
1 2 3 | mysql -uroot -plhr -h192.168.68.168 -P3306 create user repl@'%' identified with mysql_native_password by 'lhr'; grant all on *.* to repl@'%'; |
创建测试数据库:
1 2 3 4 5 6 7 8 9 10 11 12 | create database lhrdb1 charset utf8mb4; use lhrdb1; CREATE TABLE student ( no VARCHAR(20) PRIMARY KEY, name VARCHAR(20) NOT NULL, sex VARCHAR(10) NOT NULL, birthday DATE, -- 生日 class VARCHAR(20) -- 所在班级 ); INSERT INTO student VALUES('101', '曾华', '男', '1977-09-01', '95033'),('102', '匡明', '男', '1975-10-02', '95031'),('103', '王丽', '女', '1976-01-23', '95033'),('104', '李军', '男', '1976-02-20', '95033'),('105', '王芳', '女', '1975-02-10', '95031'),('106', '陆军', '男', '1974-06-03', '95031'),('107', '王飘飘', '男', '1976-02-20', '95033'),('108', '张全蛋', '男', '1975-02-10', '95031'),('109', '赵铁柱', '男', '1974-06-03', '95031'); select * from student; |
查询结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | mysql> select * from student; +-----+-----------+-----+------------+-------+ | no | name | sex | birthday | class | +-----+-----------+-----+------------+-------+ | 101 | 曾华 | 男 | 1977-09-01 | 95033 | | 102 | 匡明 | 男 | 1975-10-02 | 95031 | | 103 | 王丽 | 女 | 1976-01-23 | 95033 | | 104 | 李军 | 男 | 1976-02-20 | 95033 | | 105 | 王芳 | 女 | 1975-02-10 | 95031 | | 106 | 陆军 | 男 | 1974-06-03 | 95031 | | 107 | 王飘飘 | 男 | 1976-02-20 | 95033 | | 108 | 张全蛋 | 男 | 1975-02-10 | 95031 | | 109 | 赵铁柱 | 男 | 1974-06-03 | 95031 | +-----+-----------+-----+------------+-------+ 9 rows in set (0.00 sec) |
3.2 主库和从库都安装克隆插件
1 2 3 4 | mysql -uroot -plhr -h192.168.68.168 -P3306 mysql -uroot -plhr -h192.168.68.169 -P3306 select plugin_name, plugin_status from information_schema.plugins where plugin_name = 'clone'; install plugin clone soname 'mysql_clone.so'; |
安装结果:
1 2 3 4 5 6 7 | 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) |
3.3 从库开始克隆
1 2 3 4 5 6 | -- 从库配置参数 mysql -uroot -plhr -h192.168.68.169 -P3306 set global clone_valid_donor_list='192.168.68.168:3306'; -- 从库开始克隆 clone instance from root@'192.168.68.168':3306 identified by 'lhr'; |
执行过程:
1 2 3 4 5 6 | mysql> set global clone_valid_donor_list='192.168.68.168:3306'; Query OK, 0 rows affected (0.00 sec) mysql> clone instance from root@'192.168.68.168':3306 identified by 'lhr'; ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process). mysql> |
注意:默认情况下,克隆数据后会自动重新启动接受者 MySQL 实例。要自动重新启动,必须在接收方上提供监视进程以检测服务器是否已关闭。否则,在克隆数据后,克隆操作将停止并出现以下错误,并且关闭接受者 MySQL 服务器实例。此错误不表示克隆失败。这意味着必须在克隆数据后手动重新启动接受者的 MySQL 实例。
1 | ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process). |
由于我们这里的环境是docker容器,所以只需要重新启动容器即可: