Docker 实现MySQL 主从复制

一、拉取镜像

复制代码
docker pull mysql:5.7

相关命令:

  • 查看镜像:docker images

二、启动镜像

启动mysql01、02容器:

复制代码
docker run -d -p 3310:3306 -v /root/mysql/node-1/config:/etc/mysql/ -v /root/mysql/node-1/data:/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=123456  --name mysql01 mysql:5.7
docker run -d -p 3311:3306 -v /root/mysql/node-2/config:/etc/mysql/ -v /root/mysql/node-2/data:/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=123456  --name mysql02 mysql:5.7

命令解释:

  • -d: 后台运行容器,并返回容器ID
  • -p 宿主机端口:容器端口 :将容器的端口映射到宿主机端口
  • -e MYSQL_ROOT_PASSWORD=123456 :配置数据库连接密码
  • -v 宿主机路径:容器内路径 :将配置文件夹挂载到宿主机
  • --name 容器名字:将容器命名为 mysql01(02)

docker ps -a #查看全部容器(运行中加未运行的)

都已正常启动。

三、连接测试

搭建过程中,为了减少错误的产生,就多了这一步的测试。

我们可以直接拿Navicat来进行连接测试。

注意事项: 记得打开安全组,虚拟机的话记得处理好防火墙。(另外我这里是3310,可根据自己需要更改端口)

测试启动成功后,我们再来进行下一步。

四、编写主从复制配置文件

之前我们启动的时候写了这句-v /root/mysql/node-1/config:/etc/mysql/,将mysql 的配置文件夹和宿主机的文件夹挂载起来的。

那么我们就可以直接在宿主机下的/root/mysql/node-1/config/编写配置文件了。

4.1、编写主机配置文件

复制代码
vim my.cnf

[mysqld]#修改配置文件:vim /etc/my.cnf
#主服务器唯一ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库 需要复制的主数据库名字
binlog-do-db=testdb
#设置logbin格式
binlog_format=STATEMENT

退出方式:

先按Esc键-->再按Shift+:键-->输入wq--保存退出。

4.2、编写从机配置文件

从机上的my.cnf也是同样的方式

复制代码
[mysqld]
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay

重新启动mysql容器

复制代码
docker restart mysql01  mysql02	
复制代码
docker ps -a #查看容器

接下来就是搭建主从复制了。

五、搭建主从复制

5.1、主机设置

bash 复制代码
docker exec -it mysql01 /bin/bash #进入容器
mysql -uroot -p123456 #连接mysql

5.2、主机上建立帐户并授权 slave

给从机授权,为了让从机能够和主机连接起来。

复制代码
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';

5.3、查询master状态

复制代码
show master status; #查询master的状态

把这里的File和Position记下来哈,等下在从机上要用到。

复制代码
File: mysql-bin.000001
Position: 438

Binlog_Do_DB:需要复制的数据库。
Binlog_Ignore_DB:不需要复制的数据库。

注意:此步骤后不要再操作主服务器MySQL,防止主服务器状态值变化

5.4、从机设置

进入mysql02容器

复制代码
docker exec -it mysql02 /bin/bash 
mysql -uroot -p123456

复制主机的命令

cobol 复制代码
CHANGE MASTER TO MASTER_HOST='主机的ip地址',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=438;#解释:# 	CHANGE MASTER TO MASTER_HOST='172.16.0.3',#	MASTER_USER='slave'(刚刚配置的用户名),#	MASTER_PASSWORD='123456'(刚刚授权的密码),#	master_port=主机开放的端口 我这里是3310端口,#	MASTER_LOG_FILE='mysql-bin.具体数字',MASTER_LOG_POS=具体值(之前的Position);

注意事项:如果在这里出现错误,先重置。执行完下面两条命令。

复制代码
stop slave;
reset master;

启动从服务器复制功能

sql 复制代码
start slave;

查看从服务器状态

sql 复制代码
show slave status\G;

#下面两个参数都是Yes,则说明主从配置成功!

vbnet 复制代码
Slave_IO_Running: Yes 
Slave_SQL_Running: Yes

六、测试主从复制

6.1、主机新建库 -从机复制

在主机新建testdb后,从机也随之就有了。(这里的命名是确定的,因为在配置文件中说明了复制testdb数据库)。

6.1、新建表-从机复制

6.3、insert 记录-从机复制

当然这些还是有看不出到底有没有复制的话,咱们直接测试函数,就能知道啦。

less 复制代码
insert into my_table01(id,name) VALUE(1,@@hostname);

这就可以看出主从复制确实是成功的,但是在使用函数上有数据不一致的问题。

七、重置配置主从

如何停止从服务复制功能

复制代码
stop slave; 

如何重新配置主从 (即清除之前的主从配置)

cobol 复制代码
stop slave;
reset master;
相关推荐
隔窗听雨眠4 小时前
MySQL三表JOIN执行内核与优化器决策机制
数据库·mysql·sql优化
Decay__4 小时前
SQLServer 索引与 SQL 优化 —— 聚集索引、非聚集索引、覆盖索引、碎片维护与执行计划
运维·数据库·sql·mysql·架构
java_logo5 小时前
Docker 部署 DeepSeek Harness(moelin):轻松搭建带登录的本地 AI Agent 平台
运维·docker·容器·ai agent·deepseek·harness·轩辕镜像
xbzb6 小时前
容器 IP 每次重建都变?docker network 五种模式与自定义网桥固定地址
网络·docker·容器·ip·network·固定
星恒随风9 小时前
MySQL 从零入门(六):复合查询详解——多表查询、自连接、子查询与 UNION
linux·服务器·数据库·mysql
打工仔折腾 AI10 小时前
Changedetection.io 网页变动监控:Docker 部署、通知配置与公网暴露实践
运维·人工智能·后端·python·docker·容器·性能优化
隔窗听雨眠12 小时前
MySQL进程卡死的定位思路与恢复实践
mysql·故障排查·数据库运维
为思念酝酿的痛13 小时前
C语言操作MySQL
数据库·mysql
xbzb14 小时前
自建镜像仓库:registry 一条命令 + harbor 部署、授权、跨库同步与卸载
docker·harbor·镜像·仓库·同步·registry
星恒随风1 天前
MySQL 从零入门(五):MySQL 内置函数详解——日期、字符串、数学函数与实战案例
linux·数据库·笔记·sql·mysql