能否直接改表加字段,取决于两件事:已有数据能否无损迁移,以及线上读写是否允许短暂停写。如果新字段只做补充、旧字段继续保留,且业务允许几分钟写入暂停,通常可以增量扩展;如果新字段要替换旧字段的含义、历史数据必须回填,或系统要求零停写,就要走双写与分阶段迁移,不能一步改表了事。
“字段不够用”有两种完全不同的情况,处理代价差一个量级。
判断依据不是字段数量,而是旧数据在新结构下是否仍然成立。纯新增通常允许旧数据留空;语义变更则要求每一行旧数据都能映射到新结构,映射不出来的部分必须先定规则,否则迁移后会出现无法解释的记录。
如果站点访问量集中在白天、夜间写入很少,或者业务本身能接受几分钟的维护窗口,可以选择停写迁移。动作顺序是:先在测试库上用一份接近真实规模的数据跑一遍迁移脚本,记录耗时和失败行;确认可重复执行后,再在正式库执行,并在此之前做一次完整备份。
这里的关键是迁移脚本要可重跑。假设订单表新增“渠道”字段,脚本写成“字段不存在时才添加、只回填为空的行”,那么第一次执行中断后可以再跑一次,不会重复写入。反过来,如果脚本是“无条件更新全部行”,重跑就可能覆盖掉迁移期间产生的新数据。这个差别直接决定你下一步能不能放心在正式库上试。
停写迁移的边界很明确:一旦业务方无法给出维护窗口,或写入持续不断,这条路就不成立,必须转向下面的方式。
零停写扩展不能一次改完,要拆成可独立回退的阶段。
每一步都要能单独停下。回填任务跑到一半发现某类旧数据映射不出来,可以暂停任务、修正规则,而不是被迫回滚整个上线。
常见的误判是:拿几条自己造的测试数据跑通迁移,就认为方案可行。样本量小的时候,字段长度、空值、重复值、异常编码这些情况往往不会出现,规模化后才会暴露。因此验证要用真实数据的抽样,而不是手工构造的干净数据。
还要注意,请求量下降或某张表写入归零,不能单独证明迁移正确。它也可能是维护窗口、任务暂停或上游调用变更造成的。判断扩展是否成功,要看新旧结构的数据是否一致、回填进度是否走完、读取切换后业务结果是否和切换前对得上,而不是只看某一个流量指标。
假设一个场景:某站点给用户表增加“所属区域”字段,测试时用十条数据验证通过;正式回填时发现历史记录里同一用户存在多条不同区域的旧值。这时不能随便取最后一条,而要先确认业务上以哪条为准,再决定回填规则。规则没定清楚之前,回填任务应当停住,而不是先跑完再说。
无论走哪条路,收尾都要留下三样东西:新字段的含义与取值规则、历史数据的回填口径、以及旧结构的保留期限和删除条件。前两项决定后续开发怎么用这个字段,第三项决定什么时候可以真正清理。缺少任何一项,下一次再遇到字段不够用时,同样的判断还要重做一遍。
对太原网站开发而言,地点只影响服务沟通和部署环境的选择,不改变上面这套判断逻辑:先分清是加字段还是改语义,再看能否停写,最后用可重跑的脚本和可暂停的回填把风险控制在每一步之内。