用户把手机号从 138 换成 199 开头,改绑成功,再查历史订单提示无数据,按新号码算出的分片和订单实际所在片不是同一个。日志里能对上时间点,这种反而好排。
分片键取的是手机号,改绑只更新了用户表,订单表里冗余的分片键还是旧值。更新分片键意味着换片,普通 update 改不了行的物理位置。这一点先确认清楚,后面就不用反复试。
SELECT shard_key FROM t_order WHERE user_id = 88123 LIMIT 3; UPDATE t_order SET shard_key = '19900001111' WHERE user_id = 88123;
围绕「分片键更新」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
处理上按这个顺序:分片键尽量选不变的字段 手机号这类不放路由;已经用了 就在改绑时走迁移流程 先写新片再删旧片;迁移期间双读 两边都查一次合并结果;把分片键冗余列和用户表做定时比对。
结果对不对很好判断,改绑后用新号码能查到全部历史订单 旧片不再有该用户的残留行。
