1. MySQL 8.0.37的克隆(Clone)简介
MySQL 8.0.17推出的克隆插件允许在本地或从远程 MySQL 实例在线克隆数据,从此搭建从库不再需要使用备份工具(如PXB或mysqldump)。克隆的数据是InnoDB中的物理快照,包括库、表、表空间和数据字典元数据。克隆的数据包含一个功能齐全的数据目录,允许使用克隆插件进行 MySQL 服务器配置。
克隆插件支持两种克隆方式:
本地克隆:将启动克隆操作的 MySQL 服务器实例中的数据克隆到同服务器或同节点上的一个目录里。
远程克隆:默认情况下,远程克隆操作会删除接受者(recipientdsss)数据目录中的数据,并将其替换为捐赠者(donor)的克隆数据。
可以选择将数据克隆到接受者的其他目录,以避免删除现有数据。
远程克隆和本地克隆操作克隆的数据没有区别。克隆插件支持复制。除克隆数据外,克隆操作还从捐赠者中提取并传输复制位置信息,并将其应用于接受者,从而可以使用克隆插件来配置组复制或主从复制。
使用克隆插件进行配置比复制大量事务更快且效率更高。
下面的实验是在一台mac笔记本上进行
官网地址:MySQL Clone Plugin
2. 初始化主从复制环境
Master: 172.72.0.80 (port: 3306) 捐赠者
Slave: 172.72.0.81 (port: 3306) 接受者
# 下载镜像
docker pull mysql:8.0.37
# 删除已存在的容器
docker rm -f mysql8037M1 mysql8037S1
# 创建MySQL参数文件路径以及数据持久化路径
mkdir -p /Users/$USER/mysql8037M1/{conf,data}
mkdir -p /Users/$USER/mysql8037S1/{conf,data}
# 创建docker-composer文件路径
mkdir -p /Users/$USER/mysql_clustr_type
# 创建一个名为 docker-compose.yml 的文件,并将以下内容添加到该文件中:
cat > /Users/$USER/mysql_clustr_type/docker-compose.yml <<"EOF"
services:
mysql_master:
image: mysql:8.0.37
container_name: mysql8037M1
hostname: mysql8037M1
environment:
MYSQL_ROOT_PASSWORD: 123456
TZ: Asia/Shanghai
volumes:
- /Users/$USER/mysql8037M1/conf:/etc/mysql/conf.d # 配置文件路径
- /Users/$USER/mysql8037M1/data:/var/lib/mysql # 数据持久化路径
ports:
- "13380:3306"
networks:
mysql_network:
ipv4_address: 172.72.0.80
mysql_slave:
image: mysql:8.0.37
container_name: mysql8037S1
hostname: mysql8037S1
environment:
MYSQL_ROOT_PASSWORD: 123456
TZ: Asia/Shanghai
volumes:
- /Users/$USER/mysql8037S1/conf:/etc/mysql/conf.d # 配置文件路径
- /Users/$USER/mysql8037S1/data:/var/lib/mysql # 数据持久化路径
ports:
- "13381:3306"
networks:
mysql_network:
ipv4_address: 172.72.0.81
networks:
mysql_network:
driver: bridge
ipam:
config:
- subnet: 172.72.0.0/24
EOF
# 配置主库 my.cnf
cat > /Users/$USER/mysql8037M1/conf/my.cnf <<EOF
[mysqld]
user=mysql
port=3306
character_set_server=utf8mb4
secure_file_priv=
server-id=803713380
default-time-zone='+8:00'
log_timestamps=SYSTEM
log-bin=mysql-bin
binlog_format=row
binlog_checksum=NONE
skip-name-resolve
log_slave_updates=1
gtid-mode=ON
enforce-gtid-consistency=ON
default_authentication_plugin=mysql_native_password
max_allowed_packet=500M
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log=master-relay-bin
transaction_write_set_extraction=XXHASH64
binlog_transaction_dependency_tracking=writeset
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=8
slave-preserve-commit-order=ON
bind-address=0.0.0.0
EOF
# 配置从库 my.cnf
cat > /Users/$USER/mysql8037S1/conf/my.cnf <<EOF
[mysqld]
user=mysql
port=3306
character_set_server=utf8mb4
secure_file_priv=
server-id=803713381
read-only=on
default-time-zone='+8:00'
log_timestamps=SYSTEM
log-bin=mysql-bin
binlog_format=row
binlog_checksum=NONE
skip-name-resolve
log_slave_updates=1
gtid-mode=ON
enforce-gtid-consistency=ON
default_authentication_plugin=mysql_native_password
max_allowed_packet=500M
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log=slave1-relay-bin
transaction_write_set_extraction=XXHASH64
binlog_transaction_dependency_tracking=writeset
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=8
slave-preserve-commit-order=ON
bind-address=0.0.0.0
EOF
# 启动容器
cd /Users/$USER/mysql_clustr_type
docker-compose up -d
# 重启主从环境
docker restart mysql8037M1 mysql8037S1
- 使用Clone技术搭建主从复制
3.1. 主库和从库都创建复制用户和克隆用户
# 主库
mysql -uroot -p123456 -h172.72.0.80 -P3306
# 从库
mysql -uroot -p123456 -h172.72.0.81 -P3306
-- 创建复制用户(主从都要创建)
CREATE USER repl@'%' IDENTIFIED BY 'aabb1122';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
FLUSH PRIVILEGES;
-- 创建克隆用户(主从都要创建)
CREATE USER 'clone_user'@'%' IDENTIFIED BY 'aabb1122';
GRANT BACKUP_ADMIN, CLONE_ADMIN ON *.* TO 'clone_user'@'%';
FLUSH PRIVILEGES;
3.2. 创建测试数据库和表
-- 连接到主库
mysql -uroot -p123456 -h172.72.0.80 -P3306
-- 创建测试数据库和表
CREATE DATABASE ceshi1 CHARSET utf8mb4;
USE ceshi1;
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', 'Jerry', 'Male', '1997-09-01', '95033'),
('102', 'Tom', 'Male', '1995-10-02', '95031'),
('103', 'Mary', 'Female', '1996-01-23', '95033'),
('104', 'Eric', 'Male', '1996-02-20', '95033'),
('105', 'Susu', 'Female', '1995-02-10', '95031'),
('106', 'Tony', 'Male', '1994-06-03', '95031'),
('107', 'Ronaldo', 'Male', '1996-02-20', '95033'),
('108', 'Kimi', 'Male', '1995-02-10', '95031'),
('109', 'Sano', 'Male', '1994-06-03', '95031');
-- 验证数据插入成功
SELECT * FROM student;
3.3. 主库和从库安装克隆插件
-- 分别连接到主库和从库
mysql -uroot -p123456 -h172.72.0.80 -P3306
mysql -uroot -p123456 -h172.72.0.81 -P3306
-- 检查克隆插件是否已经安装(主从都要检查)
SELECT plugin_name, plugin_status FROM information_schema.plugins WHERE plugin_name = 'clone';
-- 如果未安装,执行以下命令安装克隆插件(主从都要安装)
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
3.4. 从库开始克隆
-- 连接到从库
mysql -uroot -p123456 -h172.72.0.81 -P3306
-- 设置克隆有效捐赠者
SET GLOBAL clone_valid_donor_list='172.72.0.80:3306';
-- 使用克隆用户进行克隆操作
CLONE INSTANCE FROM clone_user@'172.72.0.80':3306 IDENTIFIED BY 'aabb1122';
# 如果遇到错误 ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process),需要手动重启从库的容器
docker restart mysql8037S1
-- 完成克隆后,新节点mysqld进程会自动重启(原有数据会被自动 删除)
-- 状态查看
select * from performance_schema.clone_status;
select * from performance_schema.clone_progress;
4. 配置并启动主从复制
-- 连接到从库
mysql -uroot -p123456 -h172.72.0.81 -P3306
-- 配置主从复制
CHANGE REPLICATION SOURCE TO
source_host='172.72.0.80',
source_port=3306,
source_user='repl',
source_password='aabb1122',
source_auto_position=1;
-- 启动复制
START REPLICA;
-- 查看复制状态
SHOW REPLICA STATUS \G
5. 测试主从同步
-- 连接到主库
mysql -uroot -p123456 -h172.72.0.80 -P3306
-- 创建新的测试数据库和表
CREATE DATABASE ceshi2 CHARSET utf8mb4;
USE ceshi2 ;
CREATE TABLE teacher (
no VARCHAR(20) PRIMARY KEY,
name VARCHAR(20) NOT NULL,
sex VARCHAR(10) NOT NULL,
birthday DATE,
profession VARCHAR(20) NOT NULL,
department VARCHAR(500) NOT NULL
);
-- 主库插入测试数据
INSERT INTO teacher VALUES
('804', 'Li Cheng', 'Male', '1958-12-02', 'Associate Professor', 'Computer Science Department'),
('856', 'Zhang Xu', 'Male', '1969-03-12', 'Lecturer', 'Electronic Engineering Department'),
('825', 'Wang Ping', 'Female', '1972-05-05', 'Assistant Lecturer', 'Computer Science Department'),
('831', 'Liu Bing', 'Female', '1977-08-14', 'Assistant Lecturer', 'Electronic Engineering Department');
-- 验证数据插入成功
SELECT * FROM teacher;
-- 连接到从库
mysql -uroot -p123456 -h172.72.0.81 -P3306
-- 验证数据同步成功
SELECT * FROM ceshi2.teacher;