docker建立mysql8的主备,详细过程及踩坑
- 序言
- 环境
- 主从搭建
- mysql安装
- 拉取镜像
- 利用镜像运行两个mysql
- 检查是否运行正常
- 通过命令查看容器进程
- 或者通过docker桌面管理器查看
- 通过客户端连接测试
- 建立一个库待同步使用
- 主从配置
- 配置主库
- 配置从库
- 开启主从复制
- 获取file和position
- 获取master的独立ip
- 进入slave库的mysql客户端
- 启动slave
- 主从同步测试
- 踩坑
序言
最近老被问起mysql主备怎么搭建,所以手把手做一个教程,介于机器有限,所以永docker实现。
环境
- 操作系统Windows11
- docker 4.4.4
- MySQL8.0.19
主从搭建
mysql安装
拉取镜像
拉取
docker pull mysql:8.0.19
查看
docker images
如果有docker 桌面版管理器则直接查看
利用镜像运行两个mysql
master:对外端口3306,容器名称mysql-master,root密码:12345678
docker run -p 3306:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=12345678 -d mysql:8.0.19
slave:对外端口3307,容器名称mysql-slave,root密码:12345678
docker run -p 3307:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=12345678 -d mysql:8.0.19
检查是否运行正常
通过命令查看容器进程
docker ps -a
或者通过docker桌面管理器查看
通过客户端连接测试
建立一个库待同步使用
利用图形客户端建立一个测试库,待同步的时候使用
主库建立:
从库建立:
主从配置
配置主库
通过docker ps -a 查看容器id
通过docker exec进入容器内部
docker exec -it 4c /bin/bash
4c为master容器id:4ca9405ee48f的缩写
切换到/etc/mysql目录下,修改my.cnf
修改my.cnf
安装vim
apt-get update
apt-get install vim
编辑my.cnf
server-id=100 // 同一个局域网要唯一
log-bin=master-bin //开启二进制日志功能,名字可以自定义
binlog-format=ROW //二进制日志格式,row、statement,mixed
binlog-do-db=wh-test //同步的数据库名称,不配置则同步所有的
配置好重启
docker restart mysql-master
配置从库
通过docker exec 进入容器
docker exec -it a9 /bin/bash
a9为slave容器id:a93069941737的缩写,id获取方式docker ps -a
同主库一样进入后找到my.cnf文件
编辑my.cnf
server-id=101 #局域网唯一,和master不一样就可以
log-bin=mysql-slave-bin #开启二进制日志功能,
relay_log=mysql-relay-bin
read_only=1 #设置只读,不设置则读写皆可以
配置完成后重启容器
docker restart mysql-slave
开启主从复制
获取file和position
进入master库的mysql客户端,查看master状态
进入master库
docker exec -it 4c /bin/bash
mysql -uroot -p12345678
show master status
记录下来file:master-bin.000001,position:38492
获取master的独立ip
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master
获取ip地址:172.17.0.2
进入slave库的mysql客户端
docker exec -it 4c /bin/bash
mysql -uroot -p12345678
change master to master_host='172.17.0.2', master_user='root', master_password='12345678', master_port=3306, master_log_file='master-bin.000001', master_log_pos=38492, master_connect_retry=30;
master_host :Master库的地址,通过 docker inspect --format=‘{{.NetworkSettings.IPAddress}}’ 容器名称 | 容器id查询容器的IP进行查询
master_port:Master的端口号,指的是容器的端口
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position开始读,即上文中提到Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
启动slave
在slave的MySQL客户端下执行
#启动
start slave;
#查看状态
show slave status \G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
这两个参数必须是yes才算同步开启了。
如果有错误,在这个命令窗口也能看到错误原因
主从同步测试
在主库表里写入一条记录,在从库表里能够查询到。
踩坑
1.从库的只读是指非超级用户,如果是root权限的用户,是可以读写的。
2.如果主从没有同步成功,可以通过show slave status \G;命令查看下错误原因。
3.在主库中添加用户后,导致同步失败。