系统架构设计师 · 高频练习

不停机发布时,数据库字段为什么不能先改名再上线应用?

高级 单选题 第 1074 题 较难 系统架构设计师Expand-Contract数据库模式演进零停机发布向后兼容
题目

订单系统需要把数据库字段 customer_name 改为 buyer_name。发布期间新旧两个版本的应用会同时运行。为了尽量避免停机和版本不兼容,最合理的步骤是()。

A 先删除 customer_name,再发布只读取 buyer_name 的新版本
B 先增加 buyer_name并保持兼容,部署迁移版本完成双写或回填,确认旧版本退出后再删除旧字段
C 在所有实例运行时直接改名,并假设连接池会自动适配
D 只修改接口文档,数据库和应用无需变化
题目类型:原创高频练习题 用途:用于帮助理解系统架构设计师相关考点和答案解析,不等同于官方真题。
正确答案
B
答案解析

平滑模式变更要让相邻版本有一段兼容窗口。先扩展结构,再迁移数据和流量,最后在确认无人依赖旧结构后收缩,避免旧实例立刻报错。

选项分析

A

错误。旧版本仍读取 customer_name,会立即失败。

B

正确。通过扩展、迁移、收缩建立版本兼容窗口。

C

错误。连接池不会自动修复SQL中的字段依赖。

D

错误。文档变化不能替代真实的数据结构和代码迁移。

本题为什么容易错

开发环境一次性升级看不出问题,滚动发布却会让多个版本短暂共存。题目只要强调不停机或灰度,就必须把兼容窗口考虑进去。

先看结论

简短答案

不停机发布时,数据库字段为什么不能先改名再上线应用,正确答案是 B(先增加 buyer_name并保持兼容,部署迁移版本完成双写或回填,确认旧版本退出后再删除旧字段)。平滑模式变更要让相邻版本有一段兼容窗口。先扩展结构,再迁移数据和流量,最后在确认无人依赖旧结构后收缩,避免旧实例立刻报错。

解析

易混淆概念对比表

概念本题判断区别要点记忆提示
先删除 customer_name,再发布只读取 buyer_name 的新版本 本题干扰项 错误。旧版本仍读取 customer_name,会立即失败。 看到该词不要急着选,先判断是否真正解决题干问题
先增加 buyer_name并保持兼容,部署迁移版本完成双写或回填,确认旧版本退出后再删除旧字段 本题正确答案 正确。通过扩展、迁移、收缩建立版本兼容窗口。 看到题干核心场景时优先联想到它
在所有实例运行时直接改名,并假设连接池会自动适配 本题干扰项 错误。连接池不会自动修复SQL中的字段依赖。 看到该词不要急着选,先判断是否真正解决题干问题
只修改接口文档,数据库和应用无需变化 本题干扰项 错误。文档变化不能替代真实的数据结构和代码迁移。 看到该词不要急着选,先判断是否真正解决题干问题
本题易混淆选项怎么区分
  • 先删除 customer_name,再发布只读取 buyer_name 的新版本:错误。旧版本仍读取 customer_name,会立即失败。
  • 在所有实例运行时直接改名,并假设连接池会自动适配:错误。连接池不会自动修复SQL中的字段依赖。
  • 只修改接口文档,数据库和应用无需变化:错误。文档变化不能替代真实的数据结构和代码迁移。
复习

知识点详解

Expand阶段只做兼容性增加,例如新增可空字段或表;Migrate阶段部署兼容代码、双读写或回填并观察一致性;Contract阶段在所有消费者迁移完成后移除旧结构。每一步都应可监控、可回退。

备考速记

先加路,再迁车,确认旧路没人走,最后才封路。

Expand-Contract 在向后兼容场景中的作用

实际项目可先让新代码仍读取旧字段但同时写两列,回填历史数据后切读新字段,观察一个完整业务周期,再通过依赖扫描和访问指标确认旧字段无调用。

拓展

同类题怎么考

  • 选择数据库零停机发布顺序。
  • 识别滚动发布中的前后版本兼容风险。
Expand-Contract 在系统架构设计师软考中的考法

看到新旧版本共存,优先排除先删除、先改名等破坏性方案。正确答案通常会给出兼容、迁移验证和最后清理。

解题思路

按时间线判断最清楚。T1 新旧应用都在,数据库必须同时支持它们;T2 数据回填和读写切换完成;T3 旧实例和下游消费者都不再访问 customer_name,才具备删除条件。只有 B 满足这条时间线。

考点定位

字段改名在兼容发布里通常拆成新增与删除两次变化。删除属于破坏性操作,必须最后做。

易错提醒

  • 新字段允许空值,但旧代码写入后没有同步新字段。
  • 回填完成就删旧字段,忘记报表和离线任务仍在读取。
  • 双写没有幂等和监控,产生两列数据不一致。

备考提示

  • 画三阶段时间线:扩展、迁移、收缩。
  • 删除字段前盘点在线服务、批处理、报表和外部消费者。

你可能还想了解

  • 数据库字段改名如何不停机?
  • Expand-Contract分哪几个阶段?
  • 滚动发布为什么要向后兼容?

本文小结

数据库平滑变更应先扩展兼容结构,再迁移数据和读写,最后确认依赖清零后删除旧结构。