MySQL数据库主从复制(基于Docker)的操作步骤如下:
基本环境
- 虚拟机VMWare WorkStation 15 Pro
- CentOS 7
- MySQL-5.7 Latest
- Docker
创建文件夹
mkdir -p /home/wing/mysql/master/data
mkdir -p /home/wing/mysql/master/conf
mkdir -p /home/wing/mysql/master/logs
mkdir -p /home/wing/mysql/slave/data
mkdir -p /home/wing/mysql/slave/conf
mkdir -p /home/wing/mysql/slave/logs
Master文件夹
Salve文件夹
修改Master配置文件
vi /home/wing/mysql/master/conf/my.cnf
添加如下内容:
[mysqld]
log-bin = mysql-bin
server-id = 1
修改Slave配置文件
vi /home/wing/mysql/slave/conf/my.cnf
添加如下内容:
[mysqld]
log-bin = mysql-bin
server-id = 101
启动Master
docker run --name mysql-master -v /home/wing/mysql/master/data:/var/lib/mysql -v /home/wing/mysql/master/conf:/etc/mysql/conf.d -v/home/wing/mysql/master/logs:/var/log/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 5306:3306 -d mysql:5.7
备注:如果本地没有MySQL-5.7新版的docker镜像,那么会从docker镜像仓库拉取MySQL-5.7最新版本的镜像,视网络情况需要花费一点时间。
启动Slave
docker run --name mysql-slave -v /home/wing/mysql/slave/data:/var/lib/mysql -v /home/wing/mysql/slave/conf:/etc/mysql/conf.d -v /home/wing/mysql/slave/logs:/var/log/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 5307:3306 -d mysql:5.7
进入Master容器,并执行下述命令
docker exec -it mysql-master /bin/bash #进入master容器内部
mysql -uroot -p #连接数据库
show master status; #查看master状态
CREATE USER 'wing'@'%' IDENTIFIED BY '123456'; #创建账号
GRANT ALL ON *.* TO 'wing'@'%'; #授权
进入Slave容器,并执行下述命令
docker exec -it mysql-slave /bin/bash #进入slave容器
mysql -uroot -p #连接数据库
change master to master_host='IP地址', master_port=5306,master_user='wing',master_password='123456', master_log_file='mysql-bin.000003',master_log_pos=154; #设置master信息
start slave; #开启slave服务
show slave status \G; #查看slave状态
执行show slave status \G;之后出现了下述错误。
如上图所示:Slave_IO_Running: Connecting,同时错误信息Last_IO_Error:2003,详细错误连接master失败。连着操作了好几遍,都是这样的错误。在网上查了好多信息,引起这个错误的主要原因:
- 网络不通 #检查没有问题
- 拼写错误 #多次确认没问题
- pos不对 #多次确认没问题
- MySQL配置文件问题 #确认没问题
- 连接服务器时语法 #确认没问题
- 主服务器MySQL权限 #确认没问题
- 防火墙
好吧,最后就确认防火墙设置了。
- 查看防火墙状态
firewall-cmd --state
显示running,应该是防火墙没有关闭的原因。
- 关闭防火墙服务
systemctl stop firewalld.service
- 禁用防火墙服务
systemctl disable firewalld.service
- 同时修改selinux配置
vi /etc/selinux/config
SELINUX=enforcing改为
SELINUX=disabled
- 重启
reboot
然后重新启动master,slave容器,进行配置操作,在slave容器配置好后执行show slave status \G;后。
在master创建数据库wing
create database wing;
在slave同步查看数据库
show databases;