基于docker实现mysql的主从复制 详细步骤 (5.7和8.0版本)

docker安装mysql的详细教程已经放在上篇博文:点这里

这篇来用docker实现mysql的主从复制

首先创建主节点容器

同样使用本机3306端口(上篇博文创建的那个容器已经删掉了,所以没有占用宿主机的3306端口),挂载数据、日志和配置文件三个目录,并设置root用户密码为123456

版本可以是5.7或者8.0

docker run -d -p 3306:3306 --privileged=true -v /usr/local/mysql/master/log:/var/log/mysql -v /usr/local/mysql/master/data:/var/lib/mysql -v /usr/local/mysql/master/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7

 mysql8需要修改一下默认密码校验方式,执行下面命令

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

挂载的配置文件目录下创建配置文件my.cnf并写入配置如下,注释也写得很清楚

[mysqld]
# 主服务器唯一Id[必填],同一局域网内需要唯一
server-id=1
# 启用二进制日志[必填]
log-bin=mall-mysql-bin
# 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
# 设置使用的二进制日志格式
binlog_format=mixed
# 二进制日志过期清理时间,默认值为0(不自动清理)
expire_logs_days=7
# 主机,读写都可以
read-only=0
# 设置不要复制的数据库[可选]
binlog-ignore-db=mysql
# 设置需要复制的数据库[可选](输数据库名字) 
#binlog-do-db=test
# 跳过主从复制过程中遇到的所有错误 或 指定类型错误,避免从端复制中断 比如1062是主键重复错误
slave_skip_errors=1062

然后docker restart mysql 重启主节点容器使配置生效

主节点创建用户,授予主从复制权限

进入容器

docker exec -it mysql /bin/bash

使用root用户连接mysql ,并输入密码

mysql -u root -p 

 创建一个用户slave 密码为123456    5.7版本

扫描二维码关注公众号,回复: 15059037 查看本文章
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

 创建一个用户slave 密码为123456   8.0版本

CREATE USER 'slave'@'%';
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

授予权限

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

 刷新权限

FLUSH PRIVILEGES;

创建从节点容器

命令跟创建主节点差不多,就改了容器名称,映射的本地端口号和数据卷的挂载目录

版本可以是5.7或者8.0,需要跟前面主节点容器版本相同

docker run -d -p 3307:3306 --privileged=true -v /usr/local/mysql/slave/log:/var/log/mysql -v /usr/local/mysql/slave/data:/var/lib/mysql -v /usr/local/mysql/slave/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql-slave mysql:5.7

 mysql8需要修改一下默认密码校验方式,执行下面命令

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

在挂载的配置文件目录创建配置文件并写入配置如下

[mysqld]
# 主服务器唯一Id[必填],同一局域网内需要唯一
server-id=2
# 启用二进制日志[必填]
log-bin=mall-mysql-bin
# 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
# 设置使用的二进制日志格式
binlog_format=mixed
# 二进制日志过期清理时间,默认值为0(不自动清理)
expire_logs_days=7
# 主机,读写都可以
read-only=0
# 设置不要复制的数据库[可选]
binlog-ignore-db=mysql
# 设置需要复制的数据库[可选](输数据库名字) 
#binlog-do-db=test
# 跳过主从复制过程中遇到的所有错误 或 指定类型错误,避免从端复制中断 比如1062是主键重复错误
slave_skip_errors=1062
# 配置中继日志
relay_log=mall-mysql-relay-bin
# slave将复制事件写入自己的二进制日志
log_slave_updates=1
# 设置只读
read_only=1

写完之后docker restart mysql-slave 重启从容器

查看主容器中主从同步的状态

show master status;

可以看到日志文件以及忽略同步的库等信息 

在从数据库中配置主从复制

命令说明:

master_host: 主数据库的IP地址

master_port: 主数据库的运行端口

master_user: 主数据库中创建的用于同步数据的用户名称

master_password: 主数据库中创建的用于同步数据的用户密码

master_log_file: 指定从数据库要复制数据的日志文件(通过查看主数据库状态,获取file参数,也就是上一步的查看状态里面的File)

master_log_pos: 指定从数据库从哪个位置开始复制数据(通过查看主数据库状态,获取position参数,也就是上一步的查看状态里面的Position)

master_connect_retry: 连接失败重试的时间间隔,单位为秒

下面命令把参数修改为实际值再执行

change master to master_host='111.111.111.111', master_user='slave', master_password='123456', master_port=3306, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;

查看从数据库中同步状态

show slave status \G;

后面加个\G表示以键值对方式显示,不然数据太多,表格显示在命令行里面看非常乱

可以看到现在还是一个未开始的状态 

在从数据库中开启主从复制

start slave;

 

此时再次查看主从复制状态,可以看到现在已经是yes了

主从复制测试

在主数据库创建库创建表

从数据库查看库表和数据,同样存在

说明主从同步已成功 

猜你喜欢

转载自blog.csdn.net/qq_41890624/article/details/127875035