在docker环境下实现MySQL的主从复制(以MySQL5.7为例,前提条件:要已经懂了什么是MySQL主从复制):(写在最前面:先看最后一处)
1.新建主服务器容器实例端口为:3307执行指令:
docker run -p 3307:3306 --name mysql-master \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d \
mysql:5.7
指令解析:
“docker run -p 3307:3306 --name mysql-master \”
使用docker run指令 -p映射端口,外部的端口改为3307作为主库的入口,并且主库命名为mysql-master;
“-v /mydata/mysql-master/log:/var/log/mysql \”,
“-v /mydata/mysql-master/data:/var/lib/mysql \”,
“-v /mydata/mysql-master/conf:/etc/mysql \”
指令使用数据卷进行转储到宿主机;
“ -e MYSQL_ROOT_PASSWORD=root \
-d \
mysql:5.7
”指令设置环境变量并在后台运行mysql:5.7;
2.记得查看docker ps进程是否已经起来了;
3.进入:/mydata/mysql-master/conf目录下新建一个文件名为my.cnf,在里面添加配置如下:
=====不要手打容易出错,我已经敲好了直接复制即可=====
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志文件使用的内存大小
binlog_cache_size=1M
## 设置使用的二进制日志格式
binlog_format=mixed
## 二进制日志文件过期清理时间
expire_logs_days=7
## 跳过主从复制中遇到的错误避免复制中断,例如1062错误等
slave_skip_errors=1062
添加完配置后记得重启主库容器方便同步到docker内的mysql-master的配置文件:指令:docker restart mysql-master
4.进入mysql-master容器:
docker exec -it mysql-master /bin/bash
进入容器之后登录到数据库:
mysql -uroot -p
5.创建授权用户:
CREATE USER 'slave'@'%' IDENTIFIED BY 'your_password'; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
6.创建从服务器端口为3308:
指令:
docker run -p 3308:3306 --name mysql-slave \
-v /mydata/mysql-slave/log:/var/log/mysql \
-v /mydata/mysql-slave/data:/var/lib/mysql \
-v /mydata/mysql-slave/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d \
mysql:5.7
记得查看docker ps确定启动了容器
7.进入/mydata/mysql-slave/conf创建my.cnf:
配置如下内容:
======不要手打,直接复制=======
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-slave1-bin
## 设置二进制日志文件使用的内存大小
binlog_cache_size=1M
## 设置使用的二进制日志格式
binlog_format=mixed
## 二进制日志文件过期清理时间
expire_logs_days=7
## 跳过主从复制中遇到的错误避免复制中断,例如1062错误等
slave_skip_errors=1062
## relay_log配置中断日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写入自己的二进制日志
log_slave_updates=1
## slave设置为只读
read_only=1
修改完配置之后记得重启mysql-slave容器
docker restart mysql-slave
别忘了确定一下是否确定重启了!!!
8.进入到主数据库查看主从同步状态(show master status;):
-----插入图片
9.进入到mysql-slave容器:
设置一系列参数指令:
change master to master_host='192.168.40.144',master_user='slave',master_password='root',master_port=3307,master_log_file='mall-mysql-bin.000001',master_log_pos=863,master_connect_retry=30;
-----插入图片
参数解析:
master_host:主数据库的IP地址
master_port:主数据库的运行端口
master_user:在主数据库创建的用于同步数据的用户密码
Master_password:在主数据库创建的用于同步数据库的用户密码
Master_log_file:指定数据库要复制数据的日志文件,通过查看主数据库的状态获取file参数
Master_log_pos:指定从数据库从那开始复制数据,通过查看主数据库状态获取position
------插入图片
Master_connect_retry:连接失败重试的时间间隔单位为秒
10.在从数据库中查看主从复制状态(在从数据库中):
这里图片只显示了一部分:但已经足够了,我们看到:
Slave_io_running和slave_sql_running都是NO
-----插入图片
11.在从数据库中开启主从同步(在从数据库中):
start slave;
12.查看从数据库状态发现已经同步:
继续执行指令(在从数据库中):
Show slave status \G;
-----插入图片
发现:Slave_io_running和slave_sql_running都是YES
说明主从复制创建成功!
假如你的出现了:Slave_io_running是connecting,slave_sql_running是YES
----插入图片
那你可以在主数据库中执行:
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
-----插入图片
在重新启动slave容器:
----插入图片
再查看进都变成了,yes
假如你的出现了No:
----插入图片
先停止你的IO:
STOP SLAVE IO_THREAD;
查看主库的状态是否发生变化:注意更改
-----插入图片
change master to master_host='192.168.40.144',master_user='slave',master_password='root',master_port=3307,master_log_file='mall-mysql-bin.000002',master_log_pos=154,master_connect_retry=30;
再进行指令(从库中执行stop slave;reset slave;start slave;):
------插入图片
注意:写在最后:注意打开防火墙的特定端口并重启docker(可以提前做):
-----插入图片
如果在操作的过程中遇到任何问题欢迎在评论区留言,看到必回!如果有其他问题也可以打在评论区!