Docker 快速部署 MySQL 主从复制(一主一从)

一、环境准备

  1. 安装 Docker(已装跳过)
  2. 规划 IP/端口:
    • 主库(Master):端口 3307
    • 从库(Slave):端口 3308
  3. 创建数据目录(持久化)
bash 复制代码
# 创建主从数据&配置目录
mkdir -p /data/mysql/master/conf
mkdir -p /data/mysql/master/data
mkdir -p /data/mysql/slave/conf
mkdir -p /data/mysql/slave/data

二、配置主库 Master

1. 创建主库配置文件

bash 复制代码
vi /data/mysql/master/conf/my.cnf

写入以下内容:

ini 复制代码
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=ROW
binlog-do-db=testdb       # 需要同步的库(可改)
binlog-ignore-db=mysql   # 不同步的库
binlog-ignore-db=sys
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
character-set-server=utf8mb4
default-authentication-plugin=mysql_native_password

2. 启动主库容器

bash 复制代码
docker run -d \
--name mysql-master \
--restart=always \
-p 3307:3306 \
-v /data/mysql/master/conf/my.cnf:/etc/my.cnf \
-v /data/mysql/master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0

三、配置从库 Slave

1. 创建从库配置文件

bash 复制代码
vi /data/mysql/slave/conf/my.cnf

写入:

ini 复制代码
[mysqld]
server-id=2
relay-log=mysql-relay-bin
read_only=1
character-set-server=utf8mb4
default-authentication-plugin=mysql_native_password

2. 启动从库容器

bash 复制代码
docker run -d \
--name mysql-slave \
--restart=always \
-p 3308:3306 \
-v /data/mysql/slave/conf/my.cnf:/etc/my.cnf \
-v /data/mysql/slave/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0

四、主库创建同步账号

进入主库

bash 复制代码
docker exec -it mysql-master mysql -uroot -p123456

执行SQL(创建同步用户)

sql 复制代码
CREATE USER 'repl'@'%' IDENTIFIED BY 'Repl@123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

-- 查看主库状态(记录 File 和 Position,后面要用!)
SHOW MASTER STATUS;

示例结果

复制代码
File: mysql-bin.000003
Position: 669

这两个值必须记下来!


五、从库配置连接主库

进入从库

bash 复制代码
docker exec -it mysql-slave mysql -uroot -p123456

执行SQL(修改为你自己的信息)

sql 复制代码
CHANGE MASTER TO
MASTER_HOST='xxxx',   # 宿主机IP / 主库容器IP
MASTER_PORT=3306,            # 容器内部端口,不是宿主机3307
MASTER_USER='repl',
MASTER_PASSWORD='Repl@123456',
MASTER_LOG_FILE='mysql-bin.000003',  # 刚才记录的值
MASTER_LOG_POS=669;                  # 刚才记录的值

-- 启动同步
START SLAVE;

-- 查看同步状态
SHOW SLAVE STATUS\G

六、验证是否成功

看状态:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
两个都是 Yes 就成功了!

测试同步:

  1. 主库创建库/表/插入数据
  2. 从库自动同步

1. 先在主库创建要同步的库

你主库现在 Binlog_Do_DB=testdb,但库里还没有 testdb,所以先建库:

进入主库 MySQL:

bash 复制代码
docker exec -it mysql-master mysql -uroot -p123456

执行:

sql 复制代码
CREATE DATABASE testdb;

USE testdb;

CREATE TABLE user (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(20)
);

INSERT INTO user (name) VALUES ('zhangsan');
INSERT INTO user (name) VALUES ('lisi');

2. 去从库查看是否同步

进入从库 MySQL:

bash 复制代码
docker exec -it mysql-slave mysql -uroot -p123456

执行:

sql 复制代码
SHOW DATABASES;

能看到 testdb 就说明库同步了。

再查表数据:

sql 复制代码
USE testdb;
SELECT * FROM user;

3. 看一眼主从状态(确保正常)

sql 复制代码
SHOW SLAVE STATUS\G

只要:

  • Slave_IO_Running: Yes
  • Slave_SQL_Running: Yes

就说明主从正常,数据会自动同步。


如果你想同步多个库(比如 testdb、orderdb)

主库 my.cnf 改成这样:

ini 复制代码
binlog-do-db=testdb
binlog-do-db=orderdb
binlog-ignore-db=mysql
binlog-ignore-db=sys
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema

然后重启主库:

bash 复制代码
docker restart mysql-master

再去主库建 orderdb 测试同步即可。

七、常用命令

bash 复制代码
# 重启主从
docker restart mysql-master mysql-slave

# 从库停止同步
STOP SLAVE;
RESET SLAVE;

# 查看主库状态
SHOW MASTER STATUS;

# 查看从库状态
SHOW SLAVE STATUS\G;
相关推荐
天衍四九-7 小时前
MySQL中如何定位慢查询?如果SQL语句执行很慢,如何分析和优化?
数据库·sql·mysql
尚久龙7 小时前
mysql-5.7.26-winx64的安装步骤
数据库·mysql
游戏开发爱好者87 小时前
网络连接排查指南,谁在电脑后台偷跑流量,哪些程序在联网
网络协议·计算机网络·网络安全·ios·adb·https·udp
实心儿儿7 小时前
MySQL 的安装
数据库·mysql·adb
IT利刃出鞘9 小时前
Docker Compose--安装WordPress--方法/示例
运维·docker·容器
程序员阿鹏9 小时前
为什么MySQL InnoDB选择B+树?
数据结构·数据库·b树·sql·mysql·算法·缓存
这个DBA有点耶12 小时前
非关系型数据库到底有几种?键值、文档、列族、图,一篇讲透
mysql·架构·nosql
2601_9623004712 小时前
基于Python与Tkinter的ADB Monkey自动化测试脚本开发
python·adb·tkinter·android测试·gui自动化
jyOverQ13 小时前
MySQL 事务到底是什么?ACID 四大特性与隔离级别怎么理解?
数据库·mysql
IT大白鼠15 小时前
MySQL 分布式集群系列 · 第八篇(收官)——NDB 集群面试高频题 +架构总结与未来演进
分布式·mysql·面试