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;
相关推荐
Alex艾力的IT数字空间5 小时前
在 Kylin(麒麟)操作系统上搭建 Docker 环境
大数据·运维·缓存·docker·容器·负载均衡·kylin
檬柠wan8 小时前
MySQL-数据库增删改查学习
数据库·学习·mysql
Trouvaille ~10 小时前
【MySQL】视图:虚拟表的妙用
数据库·mysql·adb·面试·数据处理·后端开发·视图
伴我与影11 小时前
【记录】复现论文 Dftpav
c++·docker
亚空间仓鼠12 小时前
关系型数据库MySQL(二):高级特性
数据库·sql·mysql
亚空间仓鼠12 小时前
关系型数据库MySQL(五):Galara高可用
数据库·mysql
SPC的存折12 小时前
2、Docker命令与镜像、容器管理
linux·运维·服务器·docker·容器·eureka
做时间的朋友。13 小时前
MySQL 8.0 窗口函数
android·数据库·mysql
试试勇气13 小时前
MySQL--库的操作
数据库·mysql