SELECT count(*) FROM information_schema.tables
WHERE table_schema LIKE 'ds_1%' AND table_name = 't_order';

新增 4 个分片后先注册了路由,建表脚本还在跑,30 秒内的查询有 18 次报 1146 Table doesn't exist,错误集中在 ds_12 到 ds_15。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,路由元数据先于物理表生效,中间件按新规则把请求转发到尚未初始化的库。发布流程没有把建表和路由注册排成有依赖的两步。

围绕「分片元数据同步」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。改完隔一天再看一次,当场正常不代表能稳住。

测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

处理上按这个顺序:先建表再注册路由 顺序不能反;建表脚本执行完做一次存在性校验 通过才放量;路由上线加灰度 只放 1% 流量观察;监控 1146 错误 出现就自动摘除对应片。

改完只确认一件事:新片上线过程没有 1146 错误 建表校验全部返回 1。

作者 9823189