从 16 片扩到 32 片,迁移任务跑了 9 小时,进度停在 71%,控制台显示 5 个分片的校验任务一直重试,失败计数 3200 次。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
python migrate.py --from 0 --to 15 --shards 16-31 --on-conflict upsert SELECT shard_id, count(*) FROM migrate_fail GROUP BY shard_id;
迁移任务按旧分片顺序串行跑,遇到一条主键重复的记录就整批回滚并无限重试。新片里已经有双写进来的同 id 数据,写入逻辑没有做 upsert。这一点先确认清楚,后面就不用反复试。
「扩容数据迁移」这类改动最怕改一半,回滚脚本先准备好,再动生产。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
具体做法是,先停掉迁移任务 把失败分片和重试次数导出来;按主键比对源片和目标片 确认是重复还是缺失;把写入改成按主键 upsert 失败记录单独落表;迁移完成后跑一遍行数和主键集合校验。
改完照着核一遍,32 个分片行数之和与源库一致 失败表清零。
