镜像

#搜索镜像:
https://hub.docker.com/
#拉去镜像:
docker pull mysql:8.0.30

主节点

创建数据目录

[root@localhost ~]# mkdir -p /usr/mysql/master/data

创建配置文件目录

[root@localhost ~]# mkdir -p /usr/mysql/master/conf

创建配置文件

[root@localhost ~]# vi /usr/mysql/master/conf/my.cnf

my.cnf文件内容如下:

[client]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
# 设置mysql服务端默认字符集
character-set-server=utf8
# 同一局域网内的server-id必须具有唯一性
server-id=1
# 指定复制哪些数据库
binlog-do-db=venus
# 指定不复制哪些数据库
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
# 开启二进制日志功能,并设置日志文件名,文件名可以随便取名(关键)
log-bin=mysql-bin
# 设置binlog日志格式,其值可为row(默认)、statement和mixed
binlog_format=statement
# 设置每隔多少次事务提交操作才会将这些操作写入二进制日志文件
sync_binlog=1
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password

创建并运行容器

[root@localhost ~]# docker run -d --name master -p 3339:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /usr/mysql/master/conf/my.cnf:/etc/mysql/my.cnf -v
/usr/mysql/master/data:/var/lib/mysql mysql:8.0.30

连接主节点:使用mysql客户端,连接主数据库

创建从节点同步主节点数据账号 并授予予replication slave权限和replication client权限。

create user 'master'@'%' identified by '123456';
# replication [ˌreplɪ'keɪʃ(ə)n] n. (绘画等的)复制;
grant replication slave, replication client on *.* to 'master'@'%';

查看主节点状态

show master status;

从节点

创建数据目录

[root@localhost ~]# mkdir -p /usr/mysql/slave_01/data

创建配置文件目录

[root@localhost ~]# mkdir -p /usr/mysql/slave_01/conf

创建配置文件

[root@localhost ~]# vi /usr/mysql/slave_01/conf/my.cnf

my.cnf文件内容如下

[client]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
# 设置mysql服务端默认字符集
character-set-server=utf8
# 同一局域网内的server-id必须具有唯一性
server-id=2
# 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
#log-bin=mysql-slave-bin
# 指定中继日志
relay-log=slave1-relay-bin
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password

创建并运行容器

[root@localhost ~]# docker run -d --name slave_01 -p 3340:3306 -e
MYSQL_ROOT_PASSWORD=123456 -v /usr/mysql/slave_01/conf/my.cnf:/etc/mysql/my.cnf -
v /usr/mysql/slave_01/data:/var/lib/mysql mysql:8.0.30

连接从节点:使用MySQL客户端(SQLyog、Navicat Premium等)连接从数据库

设置同步信息

-- 关闭同步
stop slave;
-- 设置同步信息
change master to master_host='192.168.1.100', master_port=3339,
master_user='master', master_password='123456', master_log_file='mysql.bin.000004', master_log_pos= 157, master_connect_retry=30;
-- 或
change master to master_host='172.17.0.2', master_port=3306,
master_user='master', master_password='123456', master_log_file='mysql.bin.000004', master_log_pos= 157, master_connect_retry=30;
-- 开启同步
start slave;

参数说明:

master_host:Master地址,如果为虚拟机IP,则master_port应该为3339,如果为所在容器的IP,则
master_port应该为容器内部MySQL的端口号,容器IP可以通过“docker inspect --
format='{{.NetworkSettings.IPAddress}}' 容器名称|容器id”查询;
master_port:Master端口号,指的是容器的端口号
master_user:用于数据同步的账户
master_password:用于同步的账户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔(单位:秒),默认是60秒

检查同步状态

show slave status;

说明:若Slave_IO_Running 和 Slave_SQL_Running 均为Yes,则表明主从复制已经开启。此时可以测试数据同步是否成功。

容器启动状态

[root@localhost ~]# docker ps

开放lnuix端口

# 添加端口
[root@localhost ~]# firewall-cmd --zone=public --add-port=3339/tcp --permanent -
-add-port=3340/tcp --permanent
# 重新加载
[root@localhost ~]# firewall-cmd --reload

重置同步信息

主服务器


#在主服务器上停止二进制日志的写入:
RESET MASTER;
#在主服务器上清除复制信息:
RESET SLAVE;
#这将清除主服务器上的复制信息。如果需要,可以删除主服务器上的数据,以确保主服务器的数据与从服务器同步。在从服务器上重新配置复制信息,按照之前的步骤设置主服务器的信息。
#启动从服务器的复制进程:
START SLAVE;
SHOW SLAVE STATUS\G;
#命令,确保复制进程已经启动,并观察复制状态。通过以上步骤,你可以重置MySQL主服务器的同步信息。请注意,在执行重置操作之前,确保备份了主服务器上的重要数据,以免造成数据丢失

从服务器

STOP SLAVE;
RESET SLAVE;
#从新配置主从关系
START SLAVE;
#查看状态
SHOW SLAVE STATUS\G;

问题

Fatal error:The slave I/O thread stops because
master and slave have equal MySQL server
UUIDs;
说明:此错误为主从数据库设置了相同的serverid,或者因为配置文件权限过大,导致不
生效

方案

#1、进入容器内部
docker exec -it 容器ID /bin/bash
#2、登录MySQL
mysql -uroot -p
#3、修改配置
alter user 'root'@'%' identified with
mysql_native_password by '123456';