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;
相关推荐
武子康20 小时前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
云技纵横2 天前
唯一索引 INSERT 死锁实战:5 秒复现交叉插入的 S 锁循环等待
sql·mysql
沉默王二2 天前
面试官:RAG 不用向量数据库,用 MySQL 硬扛?我:100 万向量不是很轻松?
mysql·面试·ai编程
小猿姐3 天前
MySQL Top 10 热点问题 AI 运维实战:从内核诊断到云原生运维
mysql·云原生·aiops
云技纵横3 天前
Gap Lock 死锁实战:5 秒在本地复现 MySQL 间隙锁死锁
后端·mysql
无响应de神3 天前
三、用户与权限管理
数据库·mysql
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
Alsn864 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
ApacheSeaTunnel4 天前
实战演示 | 基于 Apache SeaTunnel 与 Apache DolphinScheduler 实现 MySQL 到 Doris 离线定时增量同步
大数据·mysql·开源·doris·数据集成·seatunnel·数据同步