1. 主从同步异常问题定位与诊断
当MySQL主从复制架构出现同步异常时,首先需要准确定位问题根源。常见的异常现象包括:
- 从库SQL线程停止(Slave_SQL_Running: No)
- 出现1062(主键冲突)、1032(记录不存在)等错误代码
- Seconds_Behind_Master值持续增长
- show slave status显示Last_Errno和Last_Error字段出现错误信息
1.1 错误日志分析
首先检查从库错误日志,通常在/var/log/mysql/error.log或通过show variables like 'log_error'定位。典型错误包括:
[ERROR] Slave SQL: Could not execute Write_rows event on table db.tbl; Duplicate entry '123' for key 'PRIMARY', Error_code: 1062;1.2 复制状态诊断
执行SHOW SLAVE STATUS\G查看关键指标:
Slave_IO_State: Waiting for master to send event Master_Log_File: mysql-bin.000123 Read_Master_Log_Pos: 7856345 Relay_Log_File: relay-bin.000456 Relay_Log_Pos: 34567 Slave_IO_Running: Yes Slave_SQL_Running: No Last_Errno: 1062 Last_Error: Error 'Duplicate entry '123' for key 'PRIMARY''2. mysqldump修复方案设计
当出现数据不一致导致复制中断时,使用mysqldump重建从库是可靠的修复方案。相比直接跳过错误(SET GLOBAL sql_slave_skip_counter),这种方法能保证数据一致性。
2.1 方案选择依据
- 适用场景:主从数据差异较大、存在多表不一致、需要完全重建同步
- 优势:保证数据完整一致、修复彻底、操作可控
- 限制:需要停机维护、大数据量时耗时较长
2.2 操作流程概览
- 停止从库复制进程
- 主库使用mysqldump创建数据快照
- 从库导入数据并重新配置复制
- 验证数据一致性
3. 详细修复操作步骤
3.1 准备工作
在主库创建专用备份账号:
CREATE USER 'repl_backup'@'%' IDENTIFIED BY 'StrongPassword123!'; GRANT REPLICATION CLIENT, SELECT, RELOAD, SHOW VIEW, TRIGGER, LOCK TABLES ON *.* TO 'repl_backup'@'%';3.2 主库数据导出
使用mysqldump进行完整备份:
mysqldump -u repl_backup -p --master-data=2 --single-transaction \ --routines --triggers --all-databases > full_backup.sql关键参数说明:
--master-data=2:记录binlog位置但注释掉CHANGE MASTER语句--single-transaction:保证备份一致性(仅InnoDB)--routines:包含存储过程--triggers:包含触发器
注意:如果包含MyISAM表,需要添加
--lock-all-tables替代--single-transaction
3.3 从库数据重置
- 停止从库复制:
STOP SLAVE;- 重置从库数据(谨慎操作):
mysql -e "DROP DATABASE IF EXISTS db1; DROP DATABASE IF EXISTS db2;"3.4 数据导入与配置
- 导入主库备份:
mysql -u root -p < full_backup.sql- 获取主库binlog位置:
grep "CHANGE MASTER TO" full_backup.sql -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000123', MASTER_LOG_POS=7856345;- 重新配置复制:
CHANGE MASTER TO MASTER_HOST='master_host', MASTER_USER='repl_user', MASTER_PASSWORD='ReplPassword123!', MASTER_LOG_FILE='mysql-bin.000123', MASTER_LOG_POS=7856345; START SLAVE;4. 验证与监控
4.1 复制状态检查
SHOW SLAVE STATUS\G确认以下指标:
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
- Seconds_Behind_Master: 0(或逐渐减少)
- Last_Errno: 0
4.2 数据一致性验证
使用pt-table-checksum工具校验:
pt-table-checksum --replicate=test.checksums h=master_host,u=check_user,p=password pt-table-sync --replicate=test.checksums h=master_host,u=check_user,p=password --sync-to-master5. 常见问题与解决方案
5.1 导入过程中断
现象:导入大型数据库时连接超时中断
解决方案:
- 增加MySQL超时参数:
SET GLOBAL net_read_timeout=3600; SET GLOBAL net_write_timeout=3600;- 使用split工具分割SQL文件:
split -l 50000 full_backup.sql split_backup_- 按顺序导入分割后的文件
5.2 主键冲突处理
现象:导入后启动复制仍出现1062错误
解决方案:
- 临时跳过错误(仅限紧急情况):
SET GLOBAL sql_slave_skip_counter=1; START SLAVE;- 彻底解决需要重新确认主从数据差异
5.3 大表导入优化
对于超过50GB的大表:
- 使用mydumper并行导出:
mydumper -u backup_user -p password -B db_name -T large_table -o /backup/- 导入时禁用索引:
ALTER TABLE large_table DISABLE KEYS; -- 导入数据 ALTER TABLE large_table ENABLE KEYS;6. 预防措施与最佳实践
- 定期校验:每月执行pt-table-checksum校验主从一致性
- 监控配置:设置报警监控Slave_SQL_Running和Seconds_Behind_Master
- 备份策略:主库定期全备+binlog备份
- 参数优化:
# my.cnf配置 slave_parallel_workers=4 slave_parallel_type=LOGICAL_CLOCK slave_preserve_commit_order=17. 性能影响评估
- 主库影响:
- mysqldump使用--single-transaction时会产生FTWRL锁
- 建议在业务低峰期操作
- 监控主库Threads_running和QPS变化
- 从库影响:
- 导入过程CPU和IO负载较高
- 建议临时调大innodb_buffer_pool_size
- 监控
SHOW PROCESSLIST查看导入进度
8. 替代方案比较
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| mysqldump重建 | 数据一致性强 | 停机时间长 | 严重不一致/结构变更 |
| pt-table-sync | 无需停机 | 修复不彻底 | 少量表不一致 |
| 跳过错误 | 快速恢复 | 可能隐藏问题 | 紧急恢复/测试环境 |
| XtraBackup热备份 | 速度快 | 配置复杂 | 大型数据库 |
9. 操作记录与回滚方案
建议在执行前记录以下信息:
- 主从库版本信息
- 当前复制状态(SHOW SLAVE STATUS输出)
- 所有修改的参数(SHOW VARIABLES LIKE '%timeout%')
回滚方案:
- 从库快照备份
- 记录原主库binlog位置
- 出现问题时可快速回退到修复前状态