一、问题/场景描述
在数据库高并发或数据安全场景中,单点MySQL数据库容易出现性能瓶颈和数据丢失风险。例如,电商网站订单系统在促销期间读写压力剧增,单一数据库难以承载。此时,MySQL主从复制成为常见解决方案,通过将主库数据实时同步到从库,实现读写分离和灾备。许多开发者初次配置时,常遇到同步失败、IO线程错误或SQL线程中断等问题。
二、原因分析
主从复制失败的根本原因通常包括:网络不通导致主从无法连接;主库二进制日志未正确开启或格式不匹配;从库的server-id与主库冲突;复制用户权限不足或密码错误;数据一致性被破坏,如从库提前写入数据导致主键冲突。此外,防火墙规则、MySQL版本差异或字符集不统一也会引发同步异常。理解这些原因有助于快速定位问题。
三、详细解决步骤
以下步骤基于MySQL 5.7/8.0环境,演示如何配置一主一从复制。
步骤1:修改主库配置
编辑主库的my.cnf文件,启用二进制日志并设置唯一server-id。
sudo vim /etc/my.cnf
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
重启MySQL服务。
sudo systemctl restart mysqld
步骤2:创建复制用户
登录主库MySQL,创建专用复制用户并授权。
CREATE USER 'repl'@'从库IP' IDENTIFIED BY '密码';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'从库IP';
FLUSH PRIVILEGES;
步骤3:查看主库状态
记录当前二进制日志文件名和位置。
SHOW MASTER STATUS;
输出示例:File: mysql-bin.000001, Position: 154。
步骤4:修改从库配置
编辑从库my.cnf,设置不同server-id并启用中继日志。
sudo vim /etc/my.cnf
[mysqld]
server-id = 2
relay-log = mysql-relay-bin
重启从库服务。
sudo systemctl restart mysqld
步骤5:配置从库连接主库
在从库执行CHANGE MASTER语句,指定主库信息。
CHANGE MASTER TO
MASTER_HOST='主库IP',
MASTER_USER='repl',
MASTER_PASSWORD='密码',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
步骤6:启动并验证复制
启动从库复制线程。
START SLAVE;
检查状态。
SHOW SLAVE STATUSG;
确保Slave_IO_Running和Slave_SQL_Running均为Yes。
四、注意事项
配置前确保主从库MySQL版本一致,避免因版本差异导致复制失败。防火墙需开放MySQL端口(默认3306)。从库应设置为只读,防止误写数据破坏同步。定期监控复制延迟,可通过Seconds_Behind_Master字段判断。若需重新同步,建议使用mysqldump全量备份恢复从库数据后再启动复制。
五、适用环境
本文适用于 CentOS 7 / Ubuntu 22.04 + MySQL 5.7/8.0 环境,其他Linux发行版配置类似。
