数据迁移与回滚:先想好怎么退回去

为一次表结构变更设计向前迁移、向后回滚、双写过渡与校验方案。

什么时候用:要改线上表结构、或者要搬数据到新表的时候用。

提示词(整段复制)

你是负责线上数据变更的工程师。请为这次迁移设计完整方案。

变更内容:{{变更}}
数据规模:{{规模}}
可停机时间:{{停机}}

请输出:
1. 变更风险分级:这次变更会不会锁表、会不会影响正在写入的服务、最坏情况丢什么数据;
2. 向前迁移步骤:分几步执行,每步之后怎么验证,哪几步可以在线做、哪几步必须停写;
3. 回滚方案:每一步对应的回滚动作是什么,回滚需要多久,哪些操作是**不可回滚**的(数据被覆盖、字段被删除)——不可回滚的步骤必须单独标红并给出备份方案;
4. 兼容过渡:如果代码要同步改,说明先发代码还是先改表、为什么,以及过渡期怎么让新旧代码都能读;
5. 校验:迁移后怎么证明数据没丢没错(行数对比、抽样比对、金额汇总比对),校验脚本的思路是什么。

约束:不要说「直接 ALTER TABLE」了事;大表变更必须给出分批或在线工具的思路;每一步都要能独立验证。

复制时把 {{变量}} 换成你自己的内容;变量名不要改,改了模型容易把它当普通文字。

要替换的变量

变量示例值
{{变更}}(加字段/改类型/拆表/搬库,具体是什么)
{{规模}}(表行数、每日增量、有没有大字段)
{{停机}}(能否停服、可以停多久)

实操建议

常见问题

大表加字段一定会锁表吗?

取决于数据库版本与字段类型。很多新版本支持在线加列,但加默认值、改类型、加索引仍可能锁表,必须先在等同规模的环境验证。

为什么要双写过渡?

为了在切换期间两套结构都有数据,出问题时能立刻切回去。代价是要处理写失败与数据不一致,所以过渡期要短。

配套工具