mysql主从不一致修复
MySQL主从同步冲突案例:删除表重建+pt工具修复数据
一、案例背景
- 环境:
- MySQL版本:5.7.38
- 架构:1主2从(仅同步指定库)
- 主库IP:10.10.1.50
- 从库IP:10.10.1.51、10.10.1.52
- 问题现象:从库同步中断,
Slave_SQL_Running: No
,报错Duplicate entry 'xxx' for key 'hash_code'
(唯一键冲突)。
二、问题分析
- 错误日志:
Last_Error: Could not execute Write_rows event on table jian_butler_new.project_siku_company;Duplicate entry '43af7282d730419ba13806f72d620637' for key 'hash_code'
- 原因:主库数据变更(插入/更新)时,从库存在重复唯一键值,导致同步失败。
三、解决方案:删除表重建+pt工具同步
步骤1:暂停从库同步并备份数据
STOP SLAVE; -- 暂停同步SET SQL_LOG_BIN=0; -- 禁用主库日志记录(避免操作同步到其他从库)
步骤2:重建表并切换表名(以project_siku_company为例)
-- 创建备份库archCREATE DATABASE IF NOT EXISTS arch;
-- 新建空表(结构与原表一致)CREATE TABLE arch.project_siku_company_new LIKE jian_butler_new.project_siku_company;
-- 重命名表(原表备份到arch,新表替换原表)RENAME TABLE jian_butler_new.project_siku_company TO arch.project_siku_company, arch.project_siku_company_new TO jian_butler_new.project_siku_company;
步骤3:批量处理其他冲突表
重复步骤2,依次处理以下表:
- project_siku_info
- project_siku_bids_info
- project_siku_professional_person
- …(共12张表,完整列表见附录)
步骤4:恢复从库同步
START SLAVE; -- 启动同步SHOW SLAVE STATUS\G -- 检查同步状态
步骤5:使用pt工具校验并修复数据差异
1. 主库执行数据校验(指定表)
# 校验jian_butler_new库的指定表pt-table-checksum \ h='10.10.1.50',u='gaojinbo',p='gaojinbo.com',P=3306 \ -d jian_butler_new \ -t project_siku_company,project_siku_info,...(12张表) \ --nocheck-replication-filters \ --replicate=open_data.ptchecksums \ --no-check-binlog-format
2. 生成修复语句(仅打印,不执行)
pt-table-sync \ --print \ --replicate=open_data.ptchecksums \ h='10.10.1.50',u='gaojinbo',p='gaojinbo.com',P=3306
3. 执行数据修复
pt-table-sync \ --execute \ --replicate=open_data.ptchecksums \ h='10.10.1.50',u='gaojinbo',p='gaojinbo.com',P=3306
步骤6:处理其他表的唯一键冲突
-- 针对jian_butler_variable库的表冲突pt-table-checksum \ -d jian_butler_variable \ -t temp_project_bidding,temp_project_bidding_change,... \ --nocheck-replication-filters \ --replicate=open_data.ptchecksums
-- 跳过复制错误(示例)SET GLOBAL SLAVE_EXEC_MODE=IDEMPOTENT; -- 允许重复执行(幂等模式)STOP SLAVE;START SLAVE;SET GLOBAL SLAVE_EXEC_MODE=STRICT; -- 恢复严格模式
四、处理结果
- 从库状态:
Slave_SQL_Running: Yes
,同步恢复正常。 - 数据一致性:通过
pt-table-checksum
验证,主从数据差异清零。
五、附录:重建表完整列表
原表名 | 备份表名 | 新表名 |
---|---|---|
jian_butler_new.project_siku_company | arch.project_siku_company | jian_butler_new.project_siku_company |
jian_butler_new.project_siku_info | arch.project_siku_info | jian_butler_new.project_siku_info |
jian_butler_new.project_siku_bids_info | arch.project_siku_bids_info | jian_butler_new.project_siku_bids_info |
…(共12张表,省略中间行) | … | … |
六、关键要点
- 避免手动修改同步表:通过
RENAME TABLE
原子操作切换表,防止同步期间数据不一致。 - pt工具使用前提:主从同步需先暂停(
STOP SLAVE
),避免修复过程中数据变更引发新冲突。 - 唯一键冲突预防:主库插入数据时需确保唯一性,或在从库设置
slave_skip_errors
(谨慎使用)。