在业务系统规模扩大之后,单台MySQL数据库往往难以支撑高并发读写,这时利用MySQL自身的数据同步与复制能力来搭建主从架构,是非常实用的做法。下面基于实际项目经验,梳理从零实现数据同步与复制的关键步骤。

一、核心概念与准备工作
MySQL复制主要依赖二进制日志(binlog)来完成。主库将所有变更记录到binlog,从库通过IO线程拉取日志并写入中继日志,再由SQL线程回放,从而实现数据同步。
- 主库开启binlog,并配置唯一server-id
- 从库配置不同的server-id
- 创建具备复制权限的账号
二、主库配置示例
修改主库配置文件并重启服务,核心参数如下:
[mysqld] server-id=1 log-bin=mysql-bin binlog-format=ROW
主库创建复制账号的SQL语句:
CREATE USER 'repl'@'192.168.0.1' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.1'; FLUSH PRIVILEGES;
三、从库建立复制链路
在从库执行以下命令指向主库,并启动复制线程:
CHANGE MASTER TO MASTER_HOST='192.168.0.1', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; START SLAVE;
使用SHOW SLAVE STATUSG查看复制状态,若Slave_IO_Running与Slave_SQL_Running均为Yes,说明同步正常。
四、常见问题与处理
| 问题现象 | 可能原因 | 处理办法 |
|---|---|---|
| IO线程未运行 | 网络不通或账号权限不足 | 检查防火墙与repl账号授权 |
| SQL线程报错 | 主从数据不一致 | 跳过错误或用备份重新初始化从库 |
| 复制延迟变大 | 从库写入性能差 | 升级硬件或优化慢查询 |
五、项目中的经验总结
实际项目中建议对复制延迟做监控,例如定时读取Seconds_Behind_Master。遇到网络闪断,MySQL能从断点位置继续复制,不必全量重做。对于重要的业务表,可配合半同步复制降低数据丢失风险。
数据同步不是配置完就一劳永逸,持续的监控和报警才是保障稳定性的关键。
六、简单延迟监控脚本
#!/bin/bash
# 检查从库延迟
delay=$(mysql -e "SHOW SLAVE STATUSG" | grep Seconds_Behind_Master | awk '{print $2}')
if [ "$delay" != "NULL" ] && [ "$delay" -gt 30 ]; then
echo "复制延迟超过30秒,当前: $delay"
fi
通过上述方式,团队可以在普通硬件环境下用MySQL原生能力构建可靠的数据同步与复制体系,支撑读写分离和容灾备份场景。