mysql5.7主从复制配置
写在最前面:一入编程深似海,从此对象变路人(码农没时间谈恋爱)。很长一段时间连写个文章的时间都没有了,学完后端、学前端,前端刚入门又要搞容器化,这真是“一重山外一重关,关关难过若山海”。
好了,废话不多数下面进入正题。
主从复制原理这里就不多说了,既然都已经开始看配置了就肯定了解过它的原理和用途了。
注:本文基于ubuntu20.04系统、docker、mysql5.7进行,请自行准备
1. 新建主服务容器实例
docker run -p 3307:3306 --name mysql-master -v /home/mydata/mysql-master/log:/var/log/mysql -v /home/mydata/mysql-master/data:/var/lib/mysql -v /home/mydata/mysql-master/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
因为我的宿主机已经占用了3306端口,所以用3307映射主服务端口
2.主服务配置文件
找到我们命令中设置的数据卷映射地址 /home/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
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
配置完成重启mysql-master服务
docker restart mysql-master
重启完成容器仍然获取,那么我们的配置应该没什么问题。
3.创建数据同步用户
执行命令:docker exec -it mysql-master /bin/bash 进入master容器登录数据库如下图:
执行下面命令创建数据同步用户slave,并授权
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
4.新建从服务容器实例
docker run -p 3308:3306 --name mysql-slave -v /home/mydata/mysql-slave/log:/var/log/mysql -v /home/mydata/mysql-slave/data:/var/lib/mysql -v /home/mydata/mysql-slave/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
同主服务容器一样只是端口采用3308映射
5.从服务配置文件
找到我们命令中设置的数据卷映射地址 /home/mydata/mysql-slave/conf新建my.cnf文件
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
然后重启从服务容器
docker restart mysql-slave
6.在从服务中配置主从复制
执行命令:docker exec -it mysql-slave /bin/bash 进入从服务容器,登录数据库如下图
执行下述命令修改主从复制配置,注意master_host,master_log_pos记得改成你的
change master to master_host='192.168.0.33', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;
参数说明:
master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。
master_jog_pos在主服务执行show master status;查看,如下:
7.查看主从复制状态
在从服务中执行命令:show slave status \G;
上面看到被标注的两行是NO,接下来我们开启主从同步
start slave;
接下来再查看状态,两个都编程Yes就成功了
8.主从复制测试
我们进入到主服务容器登录mysql,新建库、表并插入一条数据
这里我们看到在master数据库中新建了test库、user表并插入了一条数据,接下来我们直接去slave服务数据库查看是否有他们。
从数据库中也有了这些数据,恭喜各位,大功告成!!!
本文借鉴B站《尚硅谷Docker实战教程(docker教程天花板)》P41
声明我不是推广视频的啊,就是觉得他讲的挺好的,好东西大家就要分享嘛!
写在最后:无论是在上学还是已经工作,学一个东西一定要去实践,这样我们才能真正学会并且掌握它。学习工作之余也要多做活动,毕竟身体是革命的本钱。与君共勉!!!