一、问题背景
场景:
- MySQL 主从复制环境
- 从库(Slave/Replica)宕机一段时间
- 从库重启后,同步主库时出现主键冲突错误
错误示例:
ERROR 1062 (23000): Duplicate entry '123' for key 'PRIMARY'
二、常见原因
1️⃣ 主从写入不一致(双写 / 并行写入)
- 如果从库在宕机期间被错误写入(直接写操作或误用),会导致主从数据不一致
- 主库已有的数据和从库新写入的数据产生冲突
2️⃣ 自增主键配置问题(AUTO_INCREMENT)
- MySQL 并行复制或主从配置不当,会导致 AUTO_INCREMENT 值重复
- 相关参数:
参数 | 作用 |
---|---|
auto_increment_increment | 步长,防止多主复制冲突 |
auto_increment_offset | 起始偏移值 |
默认单主复制:步长=1,偏移=1,多主复制需修改以避免冲突 |
3️⃣ 并行复制与事务冲突
- MySQL 5.7+ 支持 多线程复制(MTS / slave_parallel_workers)
- 从库宕机后,重放 binlog 可能出现:
- 顺序重放异常
- 并行执行导致主键重复
4️⃣ 主从复制中断导致脏数据
- 从库宕机期间:
- 主库继续写入
- 从库本地手动写入或应用写入
- 恢复复制时,binlog 重放就会出现冲突
三、排查步骤
- 查看从库状态:
SHOW REPLICA STATUS\G
重点字段:
Slave_IO_Running
/Slave_SQL_Running
→ 是否正常Last_Errno
/Last_Error
→ 错误信息Exec_Master_Log_Pos
/Relay_Master_Log_File
→ 当前执行位置
- 查看冲突的主键:
SELECT * FROM table_name WHERE id = 123;
- 检查 AUTO_INCREMENT 设置:
SHOW VARIABLES LIKE 'auto_increment%';
四、解决方案
1️⃣ 修复冲突数据(慎重操作)
- 如果冲突数据可丢弃,可删除从库冲突行:
DELETE FROM table_name WHERE id = 123;
- 然后 跳过错误继续复制:
STOP REPLICA;
SET GLOBAL sql_slave_skip_counter = 1;
START REPLICA;
⚠️ 注意:跳过错误会丢失该事务,必须确认业务允许
2️⃣ 修正 AUTO_INCREMENT 参数
单主复制:
-- 保持默认即可
auto_increment_increment = 1
auto_increment_offset = 1
多主复制:
[mysqld]
server-id = 1
auto_increment_increment = 2
auto_increment_offset = 1
-- 另一台主库
server-id = 2
auto_increment_increment = 2
auto_increment_offset = 2
- 这样不同主库生成的自增主键不会重复
3️⃣ 全量重新同步(最安全)
- 从库宕机严重或数据脏乱 → 停止复制:
STOP REPLICA;
RESET REPLICA ALL;
- 使用 mysqldump 或 Percona XtraBackup 从主库重新同步
- 重新启动复制:
CHANGE REPLICA TO
SOURCE_HOST='master_ip',
SOURCE_USER='repl_user',
SOURCE_PASSWORD='password',
SOURCE_LOG_FILE='最新binlog',
SOURCE_LOG_POS=最新位置;
START REPLICA;
✅ 优点:彻底解决主键冲突和数据不一致问题
❌ 缺点:数据量大时耗时长
4️⃣ 监控与防护措施
- 使用 只读从库,避免宕机期间写入
- 定期监控复制延迟:
SHOW REPLICA STATUS\G
- 配置 auto_increment_increment / offset 以支持多主场景
- 重要数据表可增加 唯一约束/业务逻辑校验
五、总结
问题类型 | 原因 | 解决方案 |
---|---|---|
宕机期间从库被写 | 数据不一致 | 删除冲突数据 + 跳过错误 |
AUTO_INCREMENT 冲突 | 多主或 MTS 配置不当 | 调整 auto_increment_increment/offset |
并行复制冲突 | 多线程复制 | 降低并行度或重建复制 |
数据脏乱 | 长时间宕机 | 全量同步,从主库重新拉取数据 |
💡 核心原则
- 从库宕机期间不要写数据 → 保证主从一致
- 多主复制必须配置自增偏移 → 避免主键冲突
- 出现主键冲突可跳过或全量同步 → 根据业务允许选择
- 监控复制延迟 → 避免问题积累
发表回复