MySQL 8.0.36 主从复制搭建文档(Docker 环境)
·
一、环境说明
| 项目 | 主库(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精确控制复制对象(如只同步业务库)
更多推荐
所有评论(0)