3. 变更前检查清单的制定与验证

变更前检查清单的制定与验证 学习卡片

为什么数据库 schema 变更需要专门的检查清单

数据库 schema 变更与普通代码发布有本质区别:它直接触碰持久化数据,一旦执行往往不可逆,且影响面横跨应用层、数据层和运维层。一次看似简单的“加字段”可能因为锁表导致写入阻塞,一次“改类型”可能让旧版本应用读取失败。因此,变更前检查清单不是形式主义,而是把散落在 DBA、后端、运维脑中的隐性约束固化为可逐条核对的显性条目。

本案例以一次真实场景为例:为订单库 orders 表新增 channel_code 字段并建立索引,用于区分下单渠道。我们将制定一份覆盖备份、依赖、容量、兼容性四个维度的检查清单,并通过模拟执行验证其完整性。

检查清单的四个维度与关键条目

清单条目必须可验证、可判定,避免“确认无误”这类无法执行的描述。每个条目应包含:检查对象、判定标准、执行方式、不通过时的处置。

维度检查条目判定标准执行方式
备份变更前全量备份是否完成备份文件存在且校验和匹配检查备份任务日志与 md5
备份binlog 位点是否记录已记录当前 master 位点SHOW MASTER STATUS
依赖应用是否使用 SELECT *无 SELECT * 查询该表代码扫描 + 慢查询日志
依赖下游数据同步任务是否感知新字段同步任务 schema 已更新或忽略新字段检查 ETL 配置
容量磁盘剩余空间是否足够剩余空间 > 表大小 × 2df -h + 表大小查询
容量索引新增后预估大小预估增量 < 剩余空间 30%按行数 × 索引宽度估算
兼容性旧版本应用能否容忍新字段旧版本读取不报错在预发环境用旧版本验证
兼容性字段默认值是否影响存量数据默认值语义正确且不阻塞写入检查 DDL 语句

检查清单的依赖关系与执行顺序

清单条目并非彼此独立。备份必须在任何写操作前完成;容量检查依赖表大小统计,而表大小统计又依赖统计信息是否新鲜;兼容性验证需要在预发环境完成,不能在生产变更窗口内临时验证。下图展示了各条目之间的前置依赖与执行流向。

orders 表新增 channel_code 字段 — 变更前检查依赖流 备份维度 全量备份 + 校验和 记录 binlog 位点 确认备份可恢复 容量维度 表大小与行数统计 磁盘剩余空间检查 索引增量预估 依赖维度 SELECT * 扫描 下游 ETL 配置检查 ORM 映射兼容性 兼容性维度 旧版本应用读取验证 默认值语义确认 预发环境模拟执行 阻断条件(任一不通过即暂停) 备份校验失败 磁盘剩余 < 表大小 × 2 旧版本应用读取报错 全部通过 → 执行变更 进入变更窗口,按 DDL 执行 模拟执行验证 预发环境跑完整清单 记录每步耗时与异常

模拟执行:验证清单的完整性与可操作性

清单制定完成后,不能直接用于生产。需要在预发环境用相同表结构、相近数据量进行一次模拟执行,重点验证三件事:条目是否遗漏、判定标准是否可操作、执行顺序是否合理。

模拟执行的具体做法:

  1. 在预发库创建与生产 orders 表结构一致的副本,灌入约 500 万行模拟数据。
  2. 按清单顺序逐条执行,记录每条的实际耗时、输出结果和是否触发阻断。
  3. 对每条“通过”的条目,确认判定标准是否明确——例如“磁盘剩余 > 表大小 × 2”需要实际查询表大小和磁盘空间,而不是凭经验判断。
  4. 对每条“不通过”的条目,验证处置动作是否可执行——例如备份校验失败时,是否有重新备份的流程和时间预算。

模拟执行中发现的两个典型问题:

  • 原清单缺少“统计信息是否新鲜”条目。预发环境因统计信息过期,表大小查询结果偏差 40%,导致容量判断失真。补充条目:变更前执行 ANALYZE TABLE orders 并确认统计时间在 24 小时内。
  • 原清单将“旧版本应用读取验证”放在生产变更窗口内执行,模拟发现该验证需要 15 分钟以上,且需要部署旧版本实例,不适合在窗口内完成。调整为变更前 1 天在预发环境完成。

最终检查清单(可直接使用)

序号检查项判定标准执行命令/方式不通过处置
1全量备份完成备份文件存在,md5 与记录一致检查备份日志 + md5sum重新备份,推迟变更
2binlog 位点记录已记录 file 和 positionSHOW MASTER STATUS立即记录,否则无法回滚
3统计信息新鲜统计时间在 24 小时内ANALYZE TABLE orders执行 ANALYZE 后重新检查
4磁盘空间充足剩余空间 > 表大小 × 2df -h + information_schema.TABLES清理空间或扩容
5索引增量可控预估索引大小 < 剩余空间 30%行数 × 索引宽度估算评估是否必须建索引
6无 SELECT * 查询代码扫描无命中静态扫描 + 慢查询日志修改查询或确认兼容
7下游 ETL 已适配同步任务 schema 已更新检查 ETL 配置更新配置后重新验证
8旧版本应用兼容预发环境旧版本读取不报错部署旧版本实例验证调整字段默认值或推迟
9默认值语义正确默认值符合业务预期检查 DDL 语句修改 DDL 后重新评审
10回滚方案就绪回滚 DDL 已准备并验证预发执行回滚测试补充回滚方案

清单的验证不是一次性的。每次变更后应回顾:是否有条目未覆盖到实际发生的问题?判定标准是否过于宽松或严格?将新发现补充进清单,下一轮变更前重新模拟执行。清单本身也需要版本管理,与变更记录关联。