一、环境说明

项目 主库(Master) 从库(Slave)
容器镜像 mysql:8.0.36 mysql:8.0.36
IP 地址 172.17.0.2 172.17.0.3
MySQL 端口 3306 3306
复制账号 repl repl
密码 Ld0305 Ld0305
主库 server-id 1 -
从库 server-id - 2
网络模式 bridge(默认网络) bridge(默认网络)

二、主库配置(my.cnf)

路径示例:/etc/mysql/my.cnf

[mysqld]
########################
# 基础配置
########################
user = mysql
datadir = /var/lib/mysql
socket = /var/run/mysqld/mysqld.sock
pid-file = /var/run/mysqld/mysqld.pid
​
skip-name-resolve               # 禁止DNS解析,加快连接速度
secure-file-priv = /var/lib/mysql-files
max_connections = 500
​
########################
# 主从复制核心配置
########################
server-id = 1                   # 主库唯一ID
log-bin = binlog             # 开启binlog并设置文件前缀
log_bin_index = binlog.index
binlog_format = ROW             # 使用行格式最安全可靠
binlog_row_image = FULL         # 行格式记录全部列信息(推荐)
sync_binlog = 1                 # 每次事务提交同步binlog(安全)
​
########################
# 二进制日志保留策略
########################
expire_logs_days = 32            # 自动清理32天前的binlog
max_binlog_size = 100M
​
########################
# 过滤策略
########################
# 不要使用 binlog_do_db 或 binlog_ignore_db 过滤业务库!
# 只排除系统库,防止干扰
binlog_ignore_db = information_schema
binlog_ignore_db = performance_schema
binlog_ignore_db = sys
​
########################
# 推荐性能参数
########################
​
​
########################
# 其他
########################
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
​
[client]
socket = /var/run/mysqld/mysqld.sock
​
!includedir /etc/mysql/conf.d/

三、从库配置(my.cnf)

路径示例:/etc/mysql/my.cnf

[mysqld]
########################
# 基础配置
########################
user = mysql
datadir = /var/lib/mysql
socket = /var/run/mysqld/mysqld.sock
pid-file = /var/run/mysqld/mysqld.pid
​
skip-name-resolve
secure-file-priv = /var/lib/mysql-files
max_connections = 500
​
########################
# 主从复制核心配置
########################
server-id = 2                   # 从库唯一ID(每个从库都不同)
log-bin = binlog
log_bin_index = binlog.index
relay-log = relaylog
relay-log-index = relaylog.index
read_only = 1                   # 防止手工误写
relay_log_recovery = 1          # 防止relay损坏导致复制中断
log_slave_updates = 1           # 支持级联复制
binlog_format = ROW
binlog_row_image = FULL
​
########################
# 二进制日志保留策略
########################
expire_logs_days = 32
max_binlog_size = 100M
sync_binlog = 1
​
########################
# 并行复制(性能)
########################
slave_parallel_workers = 4              # 根据CPU核心数设置
slave_parallel_type = LOGICAL_CLOCK
​
########################
# 过滤策略(从库控制同步内容)
########################
replicate_ignore_db = information_schema
replicate_ignore_db = performance_schema
replicate_ignore_db = sys
​
########################
# 其他
########################
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
​
[client]
socket = /var/run/mysqld/mysqld.sock
​
!includedir /etc/mysql/conf.d/

四、创建复制账号(在主库执行)

CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'Ld0305';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

注意:使用 mysql_native_password 是为了解决 MySQL 8 默认的 caching_sha2_password 插件在非 SSL 连接下报错的问题。


五、主库查看当前 binlog 信息

SHOW MASTER STATUS;

输出示例:

mysql> SHOW MASTER STATUS;
+---------------+----------+--------------+-------------------------------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB                          | Executed_Gtid_Set |
+---------------+----------+--------------+-------------------------------------------+-------------------+
| binlog.000004 |      827 |              | information_schema,performance_schema,sys |                   |
+---------------+----------+--------------+-------------------------------------------+-------------------+
1 row in set (0.00 sec)

记录下这两个字段: File = binlog.000004 Position = 827


六、从库配置主从关系

在从库中执行:

STOP SLAVE;
RESET SLAVE ALL;
​
CHANGE MASTER TO
  MASTER_HOST='172.17.0.2',
  MASTER_USER='repl',
  MASTER_PASSWORD='Ld0305',
  MASTER_LOG_FILE='binlog.000004',
  MASTER_LOG_POS=827;
​
START SLAVE;

七、验证同步状态

执行:

SHOW SLAVE STATUS\G;

关键字段应为:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0

✅ 表示主从复制正常运行。


八、测试同步效果

1️⃣ 在主库创建数据库:

CREATE DATABASE test;

2️⃣ 在从库查看:

SHOW DATABASES;

应能看到:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.02 sec)

说明主从复制已生效 🎉


九、常见问题汇总

错误信息 原因 解决方法
Access denied for user 'repl'@'172.17.0.3' 权限或密码错误 检查 GRANT REPLICATION SLAVE 与密码一致性
Authentication requires secure connection 默认使用 caching_sha2_password 插件 改用 mysql_native_password 插件
Could not find first log file name in binary log index file 主库 binlog 文件被删除或重新初始化 重新执行 RESET SLAVE ALL,使用新的 SHOW MASTER STATUS 信息
Slave_IO_Running: No 主从连接失败 检查网络、主库 IP、用户权限
从库没同步 主库 binlog 未记录该库 检查是否被 binlog_ignore_db 过滤

🔒 建议

  • replicate_do_db 精确控制复制对象(如只同步业务库)

更多推荐