MySQL 8.0 的主从复制(Replication)配置相比旧版本有一些重要变化,主要体现在:
- 默认使用 基于 GTID 的复制(推荐)
- 弃用了
MASTER_*参数,改用SOURCE_* - 更强调 安全性(如 SSL、密码存储)
- 支持 并行复制、多源复制 等高级特性
下面我将 详细、完整、安全地 说明如何在 MySQL 8.0 中配置 一主一从 的经典异步复制。
🧩 环境准备
| 角色 | 主机 IP | MySQL 版本 |
|---|---|---|
| 主库(Source) | 192.168.1.100 | MySQL 8.0+ |
| 从库(Replica) | 192.168.1.101 | MySQL 8.0+ |
✅ 确保两台服务器网络互通,防火墙开放 3306 端口。
第一步:配置主库(Source)
1. 修改主库配置文件(/etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf)
[mysqld]
# 唯一服务器 ID(必须不同)
server-id = 1
# 启用二进制日志(必须)
log-bin = mysql-bin
# 可选:指定 binlog 格式(推荐 ROW)
binlog-format = ROW
# 启用 GTID(推荐,简化故障切换)
gtid_mode = ON
enforce_gtid_consistency = ON
# 可选:设置 binlog 过期时间(自动清理)
expire_logs_days = 7
🔁 修改后重启 MySQL:
sudo systemctl restart mysql
2. 创建复制专用用户
-- 登录主库
mysql -u root -p
-- 创建用户(注意:MySQL 8.0 默认认证插件是 caching_sha2_password)
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'StrongPass!2025';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
💡 建议限制 IP(如
'repl_user'@'192.168.1.101')以提高安全性。
第二步:配置从库(Replica)
1. 修改从库配置文件
[mysqld]
server-id = 2 # 必须与主库不同!
read_only = ON # 防止误写(可选但推荐)
relay-log = relay-bin # 中继日志(可选)
# 如果使用 GTID,也需开启
gtid_mode = ON
enforce_gtid_consistency = ON
🔁 重启从库 MySQL:
sudo systemctl restart mysql
第三步:启动复制(关键步骤)
方式 A:推荐 —— 使用 GTID 自动定位(无需手动查 binlog 文件和位置)
在从库执行:
-- 停止已有复制(首次配置可跳过)
STOP REPLICA;
-- 配置复制源(不指定 binlog 文件和位置!)
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.1.100',
SOURCE_USER='repl_user',
SOURCE_PASSWORD='StrongPass!2025',
SOURCE_SSL=0; -- 若未配 SSL,设为 0;若已配 SSL,设为 1
-- 启动复制
START REPLICA;
✅ 因为启用了 GTID,MySQL 会自动找到正确的同步点!
方式 B:传统方式(基于 binlog 文件 + Position)
仅在未启用 GTID 时使用(不推荐)
在主库查看当前 binlog 位置:
SHOW MASTER STATUS;
输出示例:
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 1567 | | | |
+------------------+----------+--------------+------------------+-------------------+
在从库配置:
STOP REPLICA;
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.1.100',
SOURCE_USER='repl_user',
SOURCE_PASSWORD='StrongPass!2025',
SOURCE_LOG_FILE='mysql-bin.000003',
SOURCE_LOG_POS=1567;
START REPLICA;
第四步:验证复制状态
在 从库 执行:
SHOW REPLICA STATUS\G
重点关注以下字段:
| 字段 | 正常值 |
|---|---|
Replica_IO_Running | Yes |
Replica_SQL_Running | Yes |
Seconds_Behind_Source | 0(表示无延迟) |
Last_IO_Error / Last_SQL_Error | 应为空 |
⚠️ 如果出现错误,检查网络、用户权限、防火墙、SSL 设置等。
第五步(可选):提升安全性
1. 启用 SSL 加密(避免明文传输密码)
在主库生成 SSL 证书(或使用已有 CA):
-- 查看是否支持 SSL
SHOW VARIABLES LIKE '%ssl%';
若已配置 SSL,在从库连接时加上:
CHANGE REPLICATION SOURCE TO
...
SOURCE_SSL=1,
SOURCE_SSL_CA='/path/to/ca.pem',
SOURCE_SSL_CERT='/path/to/client-cert.pem',
SOURCE_SSL_KEY='/path/to/client-key.pem';
2. 避免在配置中存储密码
使用 START REPLICA 动态传参(临时有效):
STOP REPLICA;
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.1.100',
SOURCE_USER='repl_user',
SOURCE_SSL=1;
START REPLICA USER='repl_user' IDENTIFIED BY 'StrongPass!2025';
✅ 这样密码不会写入元数据表(如
mysql.slave_master_info)
常见问题排查
| 问题 | 解决方法 |
|---|---|
Access denied for user | 检查用户名、密码、IP 白名单、权限 |
Could not find first log file name in binary log index file | 主库 binlog 被清理,需重新做全量备份 |
| 复制延迟大 | 检查网络、主库写入压力、从库性能 |
GTID_MODE mismatch | 主从必须同时开启或关闭 GTID |
✅ 最佳实践总结
- 始终使用 GTID 模式(
gtid_mode=ON) - 使用
SOURCE_*语法(MySQL 8.0+ 标准) - 创建专用复制用户,最小权限原则
- 启用 SSL/TLS 防止中间人攻击
- 避免在
CHANGE命令中写明文密码 - 定期监控
SHOW REPLICA STATUS
📚 官方文档参考
如有具体报错信息,可提供 SHOW REPLICA STATUS\G 输出,我可以帮你精准诊断。