主题
分库分表 生产检查清单
适用 ShardingSphere 5.x(JDBC/Proxy),配置格式随版本变化,以官方文档为准。每条都可勾选,括号内是默认值或判断依据。 这份清单只列「不做会出事」的动作,机制解释见各篇正文。
上线前
- [ ] 先确认真的需要分:单表 2000 万行开始评估、5000 万行动手;分片键要基数高、覆盖 80% 以上查询、数据分布均匀,并用真实量级数据验证各分片条数偏差(建议 <10%)。
- [ ] 分片算法与扩容路径一起定:取模只适合 2^n→2^(n+1) 翻倍扩容(每次迁移约 50% 数据);要平滑扩容选一致性哈希或 16384 虚拟槽;把 N→2N 的迁移步骤写成 runbook。
- [ ] 全局 ID 不冲突:雪花 = 41bit 时间 + 10bit 机器 + 12bit 序列,worker-id 全局唯一;时钟回拨超过 1 秒要有兜底(等待、Redis 记录或切 Leaf 号段)。
- [ ] 绑定表条件核对:
t_order与t_order_item必须同分片键、同算法、同分片数才配bindingTables;字典/配置小表才配broadcastTables,广播表不能是大表。 - [ ] 无分片键 SQL 有清单:盘点后台、报表、导出和
COUNT(*),逐条给 Hint 或迁到 ES;不允许默认全分片广播。 - [ ] 迁移可回退:双写 → 历史迁移 → 条数 + 抽样 MD5 对账 → 读流量 10%→50%→100% → 写切换 → 老集群只读保留 7–14 天;同一 ID 的写必须串行或 upsert。
- [ ] 跨分片事务有边界:能单库就单库;必须跨分片用 Seata AT/TCC,明确补偿与幂等,不假设本地事务能覆盖多库。
运行中
- [ ] 分片健康度:各分片数据量/增长率偏差、单分片 QPS/CPU、广播查询比例、慢 SQL Top N、双写失败数与对账差异数,全部上监控。
- [ ] ID 与路由:雪花时钟回拨次数、号段剩余、发号延迟;Hint 使用后必须
HintManager.close(),否则线程复用会污染后续请求的路由。
故障时
- [ ] 某分片负载是其他 10 倍 → 看分片键取值分布和热点 key → 单调递增或低基数导致倾斜 → 评估二次拆分或按新键重建,不能在线改分片键。
- [ ] 跨分片 JOIN 结果偏少或出现笛卡尔积 → 核对两张表的分片键、算法、分片数是否完全一致 → 不满足就不是绑定表 → 改 SQL 或补映射。
- [ ] 扩容后部分数据查不到 → 定时对账的差异数与双写日志 → 双写时序(update 先于 create)或迁移遗漏 → 同 ID 串行化 + upsert + 分钟级增量校验。
- [ ] 深分页超时、Coordinator 内存高 → 看归并排序的 offset →
LIMIT 100000,20要在每个分片取 100020 条再归并 → 改WHERE id > lastMaxId LIMIT N游标分页。 - [ ] 主键重复 → 发号器日志的 worker-id 与时钟回拨计数 → 雪花发号器异常 → 立即切号段模式并修复机器号注册。