docker安装mysql的详细教程已经放在上篇博文:点这里
这篇来用docker实现mysql的主从复制
首先创建主节点容器
同样使用本机3306端口(上篇博文创建的那个容器已经删掉了,所以没有占用宿主机的3306端口),挂载数据、日志和配置文件三个目录,并设置root用户密码为123456
版本可以是5.7或者8.0
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版本
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了
主从复制测试
在主数据库创建库创建表
从数据库查看库表和数据,同样存在
说明主从同步已成功