简介:
本文使用docker安装mysql,并创建master节点,slave节点用于实现主从。废话不多说,直接开始。
1.docker下载镜像,这里我以5.7版本为例。
docker pull mysql:5.7
2.在宿主机上新建如下目录,进行文件挂载。目录名称,路径可随意更改,我这里这是提供进行参考。
mysql-master master节点目录
conf mysql配置文件
data mysql数据
log mysql日志
mysql-slave
conf mysql配置文件
data mysql数据
log mysql日志
文件夹示例图如下
准备在conf目录下新建配置文件my.cnf
配置文件内容如下:
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=1
## 指定不需要同步的数据库名称
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权限的用户除外) 0:可读写,1:只读
read_only=0
3.运行镜像,生成mysql的master节点
docker run --name mysql-master -p 3307:3306 -v D:/docker_share/mysql-master/log:/var/log/mysql -v D:/docker_share/mysql-master/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
4.单独挂载配置文件
上面一步没有挂载配置文件,因为在实际操作中我发现mysql的配置文件默认存在/etc目录下,而etc目录下存在很多文件,我并不想挂载这个目录,所以这一步单独拿出来,只挂载指定文件
docker cp D:/docker_share/mysql-master/conf/my.cnf 容器id:/etc/my.cnf
5.重启mysql-master
docker restart mysql-master
6.登录mysql-master
## 进入容器
docker exec -it mysql-master /bin/bash
## 登录mysql
mysql -uroot -p123456
为容器实例内创建数据同步用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
进行授权
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
查看状态
show master status;
如果没有出现上图,出现的是Empty,则是因为配置文件中没有开启binlog。
7.到此,master节点部署完成
8.运行镜像,生成mysql的slave节点
docker run --name mysql-slave -p 3308:3306 -v D:/docker_share/mysql-slave/log:/var/log/mysql -v D:/docker_share/mysql-slave/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
挂载配置文件
docker cp D:/docker_share/mysql-slave/conf/my.cnf 容器id:/etc/my.cnf
配置文件: 需要注意,server_id需要唯一,read_only=1
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=2
## 指定不需要同步的数据库名称
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权限的用户除外) 0:可读写,1:只读
read_only=1
9.重启mysql-slave
docker restart mysql-slave
10.登录mysql-slave
## 进入容器
docker exec -it mysql-slave /bin/bash
## 登录mysql
mysql -uroot -p123456
执行【主从复制命令】
change master to master_host='ip地址', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-slave1-bin.000001', master_log_pos=617, master_connect_retry=30;
主从复制命令参数说明
master host:主数据库的lP地址;
master port:主数据库的运行端口;
master user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码:
master_Iog_ile:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。
11.启动同步并查看数据库主从同步状态
## 启动同步命令
start slave;
## 查看数据库主从同步状态
show slave status \G;
两个参数都为yes,才表示正常。如果Slave_IO_Running一直显示Connecting,说明无法连接到master节点,可以参考这篇文章:Slave_IO_Running:Connecting ;_slaveiorunning为connecting-CSDN博客
如果Slave_SQL_Running:No,可以查看一下类似下图中的Error提示,具体情况具体分析。
12.进行验证
可以使用navcate等工具在master节点新建数据库,数据表,增加数据。mysql-slave节点会自动同步。这里需要注意,mysql-slave节点不建议手动新建任何数据表,首先slave节点本来就是从库,而且如果新建的表在主库中存在,同步就会报错。