位置: 文档库 > 数据库 > MySQL 主从同步错误(error)解决

MySQL 主从同步错误(error)解决

BlazeNebula 上传于 2024-12-07 20:16

《MySQL 主从同步错误(error)解决》

MySQL 主从同步是数据库高可用、读写分离和备份恢复的核心技术,但在实际部署中常因配置错误、网络问题或数据冲突导致同步中断。本文将系统梳理主从同步的常见错误类型、诊断方法及解决方案,帮助DBA快速定位并修复问题。

一、主从同步基础原理

MySQL 主从同步基于二进制日志(Binary Log)实现,主库将所有数据变更(DDL/DML)记录到binlog,从库通过I/O线程拉取binlog并由SQL线程重放。关键组件包括:

  • Binlog:主库数据变更的二进制记录
  • Relay Log:从库中转binlog的临时文件
  • I/O Thread:负责从主库拉取binlog
  • SQL Thread:负责执行Relay Log中的事件

二、常见同步错误分类

1. 网络层错误

典型错误:


Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from impossible position'

原因:

  • 主从服务器网络不稳定
  • 防火墙拦截3306端口
  • 主库binlog被清理而从库仍尝试读取

2. 数据一致性错误

典型错误:


Last_SQL_Error: Error 'Duplicate entry '100' for key 'PRIMARY'' on query. Default database: 'test' Query: 'INSERT INTO users (id) VALUES (100)'

原因:

  • 主从数据初始不一致
  • 从库执行了非确定性SQL(如UUID()、NOW())
  • 主库存在未记录到binlog的修改(如临时表操作)

3. 配置错误

典型错误:


Could not initialize master info structure; more error messages can be found in the MySQL error log

原因:

  • server_id重复
  • 未启用binlog或配置错误格式
  • 从库未设置read_only=1导致误写入

三、诊断工具与方法

1. 查看同步状态


SHOW SLAVE STATUS\G

关键字段解析:

  • Slave_IO_Running:I/O线程状态
  • Slave_SQL_Running:SQL线程状态
  • Last_IO_Error:I/O错误详情
  • Last_SQL_Error:SQL错误详情
  • Seconds_Behind_Master:同步延迟(秒)

2. 检查binlog位置


-- 主库查看当前binlog位置
SHOW MASTER STATUS;

-- 从库查看已执行位置
SHOW SLAVE STATUS\G | grep 'Read_Master_Log_Pos'

3. 数据一致性校验

使用pt-table-checksum工具:


pt-table-checksum --replicate=checksums.checksums --host=master_host --user=repl_user --password=repl_pass
pt-table-sync --sync-to-master h=slave_host,u=repl_user,p=repl_pass --print

四、典型错误解决方案

1. 错误1032(主键冲突)

现象:从库执行INSERT时主键已存在

解决方案:

  • 跳过单个事务:

STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;
  • 永久修复:重建从库数据,确保初始数据一致

2. 错误1062(唯一键冲突)

现象:从库执行UPDATE/DELETE时找不到对应行

解决方案:

  • 临时跳过:

STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1 START SLAVE UNTIL MASTER_LOG_FILE='binlog.000123', MASTER_LOG_POS=456;
START SLAVE;
  • 根本解决:检查应用逻辑是否在从库执行了写操作

3. 错误1236(binlog不存在)

现象:从库请求的binlog已被主库清理

解决方案:

  • 重建复制:

-- 主库锁定表并获取二进制坐标
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

-- 从库执行(需先备份从库数据)
STOP SLAVE;
CHANGE MASTER TO 
  MASTER_HOST='master_host',
  MASTER_USER='repl_user',
  MASTER_PASSWORD='repl_pass',
  MASTER_LOG_FILE='binlog.000123',
  MASTER_LOG_POS=456;
START SLAVE;

4. 错误2003(连接失败)

现象:从库无法连接主库

解决方案:

  • 检查网络连通性:

telnet master_host 3306
  • 验证复制账户权限:

-- 主库执行
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'slave_ip' IDENTIFIED BY 'repl_pass';
FLUSH PRIVILEGES;

五、预防性维护策略

1. 监控体系搭建

  • Prometheus+Grafana监控Seconds_Behind_Master
  • Zabbix监控Slave_IO_Running和Slave_SQL_Running状态
  • 设置告警阈值(如延迟>5分钟触发警报)

2. 定期维护任务


-- 每周执行
ANALYZE TABLE database.table;
OPTIMIZE TABLE database.table;

-- 每月执行
pt-table-checksum --replicate=checksums.checksums --host=master_host

3. 架构优化建议

  • 使用GTID复制简化故障切换
  • 配置semi-sync复制提高数据安全性
  • 部署中间代理(如ProxySQL)实现自动故障转移

六、高级故障场景处理

1. 主库崩溃后的恢复

步骤:

  1. 从从库中提升新主库:

STOP SLAVE;
RESET SLAVE ALL;
-- 修改my.cnf中的server-id并重启
  1. 重建其他从库复制:

CHANGE MASTER TO 
  MASTER_HOST='new_master_host',
  MASTER_AUTO_POSITION=1;
START SLAVE;

2. 大事务导致的同步阻塞

现象:Seconds_Behind_Master持续增大

解决方案:

  • 在主库设置:

SET GLOBAL binlog_group_commit_sync_delay=100;
  • 拆分大事务为多个小事务

3. 字符集不一致问题

现象:从库执行报错"Incorrect string value"

解决方案:

  • 统一主从字符集配置:

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

关键词:MySQL主从同步复制错误、binlog、数据一致性GTID半同步复制、pt-table-checksum、监控告警

简介:本文详细解析MySQL主从同步的常见错误类型及解决方案,涵盖网络问题、数据冲突、配置错误等场景,提供诊断工具使用方法和预防性维护策略,适合DBA及开发人员参考。