MySQL主从复制部署

MySQL 8.0.30 一主两从架构实战 (Docker)

1. 环境准备

在宿主机(IP: 192.168.31.128)上创建独立的挂载目录,确保数据隔离。

1
2
3
4
5
6
7
8
# 1. 创建自定义网络
docker network create mysql-net

# 2. 创建主从目录
mkdir -p /mydata/mysql/master/{conf,log,data}
mkdir -p /mydata/mysql/slave1/{conf,log,data}
mkdir -p /mydata/mysql/slave2/{conf,log,data}


2. 编写配置文件

MySQL 8.0 需要注意 server-id 的唯一性。

1. 主库配置

主库的核心是开启 log-bin 并配置好需要推送给从库的数据库。

vim /mydata/mysql/master/conf/my.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
# --- 你原有的字符集与基础配置 ---
init_connect='SET collation_connection = utf8mb4_unicode_ci'
init_connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake
skip-name-resolve

# --- 主从核心配置 ---
server_id=1
log-bin=mysql-bin
read-only=0

# 指定需要同步的数据库 (保持你笔记中的业务库)
binlog-do-db=gulimall_ums
binlog-do-db=gulimall_pms
binlog-do-db=gulimall_oms
binlog-do-db=gulimall_sms
binlog-do-db=gulimall_wms
binlog-do-db=gulimall_admin

# 忽略系统库同步
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema

# --- MySQL 8.0 增强建议 ---
# 解决 8.0 默认认证插件导致的连接问题(重要)
default-authentication-plugin=mysql_native_password
# 设置时区
default-time-zone='+8:00'
# 开启 binlog 的过期自动清理(8.0 新参数,设置保留 7 天)
binlog_expire_logs_seconds=604800
# 限制只能由 master 写入(防止误操作,主库通常设为 0)
log_slave_updates=1


2. 从库配置

从库的关键在于 server_id 必须唯一,且开启 read-only 保证数据一致性。

从库 1 (Slave-1):

vim /mydata/mysql/slave1/conf/my.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
# --- 基础配置 ---
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-name-resolve

# --- 主从核心配置 ---
server_id=2 # 唯一 ID
read-only=1 # 从库只读
relay-log=mysql-relay-bin # 从库中继日志
log-bin=mysql-bin # 从库也开启 binlog 方便以后做级联或切换

# 复制过滤(确保只接受这几个库的同步数据)
replicate-do-db=gulimall_ums
replicate-do-db=gulimall_pms
replicate-do-db=gulimall_oms
replicate-do-db=gulimall_sms
replicate-do-db=gulimall_wms
replicate-do-db=gulimall_admin

# --- MySQL 8.0 增强建议 ---
default-authentication-plugin=mysql_native_password
default-time-zone='+8:00'
# 即使是从库,也建议配置超级用户只读
# super_read_only=1

从库 2 (Slave-2):

vim /mydata/mysql/slave2/conf/my.cnf

配置内容与 Slave-1 完全一致,只需将 server_id=2 修改为 server_id=3


3. 启动容器

使用 8.0.30 版本,并映射不同端口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 启动 Master (3307)
docker run -p 3307:3306 --name mysql-master \
--network mysql-net \
-v /mydata/mysql/master/log:/var/log/mysql \
-v /mydata/mysql/master/data:/var/lib/mysql \
-v /mydata/mysql/master/conf/my.cnf:/etc/mysql/my.cnf \
-e MYSQL_ROOT_PASSWORD=root \
--restart always \
-d mysql:8.0.30

# 启动 Slave1 (3308)
docker run -p 3308:3306 --name mysql-slave-1 \
--network mysql-net \
-v /mydata/mysql/slave1/log:/var/log/mysql \
-v /mydata/mysql/slave1/data:/var/lib/mysql \
-v /mydata/mysql/slave1/conf/my.cnf:/etc/mysql/my.cnf \
-e MYSQL_ROOT_PASSWORD=root \
--restart always \
-d mysql:8.0.30

# 启动 Slave2 (3309)
docker run -p 3309:3306 --name mysql-slave-2 \
--network mysql-net \
-v /mydata/mysql/slave2/log:/var/log/mysql \
-v /mydata/mysql/slave2/data:/var/lib/mysql \
-v /mydata/mysql/slave2/conf/my.cnf:/etc/mysql/my.cnf \
-e MYSQL_ROOT_PASSWORD=root \
--restart always \
-d mysql:8.0.30

4. 主库配置 (Master)

  1. 进入主库并创建同步账号:
1
2
docker exec -it mysql-master mysql -uroot -proot

  1. 执行 SQL:
1
2
3
4
5
6
7
8
-- MySQL 8.0 必须先创建用户再授权,并指定加密规则(防止从库连不上)
CREATE USER 'backup'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'backup'@'%';
FLUSH PRIVILEGES;

-- 记录 File 和 Position 的值
SHOW MASTER STATUS;

假设此时查到: File: mysql-bin.000003, Position: 831


5. 从库配置 (Slaves)

分别进入 mysql-slave-1mysql-slave-2 执行同步命令。

1
2
docker exec -it mysql-slave-1 mysql -uroot -proot

关键同步命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
CHANGE MASTER TO 
MASTER_HOST='mysql-master', -- 使用 Docker 网络中的容器名 , 或者替换成 master 的ip
MASTER_USER='backup', -- 使用的同步的账号
MASTER_PASSWORD='123456', -- 同步的账号密码
MASTER_PORT=3306, -- 注意这是容器内部端口
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=831; -- 填刚才 SHOW MASTER STATUS 查到的数字

START SLAVE;

-- 查看状态
SHOW SLAVE STATUS\G

进入 slave2 执行

1
2
docker exec -it mysql-slave-2 mysql -uroot -proot

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CHANGE MASTER TO 
MASTER_HOST='mysql-master', -- 使用 Docker 网络中的容器名 , 或者替换成 master 的ip
MASTER_USER='backup', -- 使用的同步的账号
MASTER_PASSWORD='123456', -- 同步的账号密码
MASTER_PORT=3306, -- 注意这是容器内部端口
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=831; -- 填刚才 SHOW MASTER STATUS 查到的数字

CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='backup',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=831;

START SLAVE;

-- 查看状态
SHOW SLAVE STATUS\G


6. 验证

  • Slave_IO_Running: Yes
  • Slave_SQL_Running: Yes

如果在主库创建一个数据库 CREATE DATABASE gulimall_pms;,你在从库 SHOW DATABASES; 就能立刻看到了。


MySQL主从复制部署
https://xiamu.icu/数据库/MySQL主从复制部署/
作者
肉豆蔻吖
发布于
2026年1月13日
许可协议