← 中文资源

简体中文版本

零停机重命名数据库列

先引入新列、双写并回填,再切换读取,最后在单独部署中删除旧列,使滚动发布期间不会因重命名出错。

阅读英文原文

概述

直接重命名会让滚动发布期间仍在运行的旧版本崩溃,从而使两次部署之间出现错误。expand-contract 把一次破坏性变更拆成多个兼容步骤,让新旧代码在过渡期共存。

关键步骤

  1. 在一个部署中把新列加为可空。
  2. 双写两列,并以批处理回填历史行。
  3. 把读取切到新列,并停止写旧列。
  4. 待所有实例运行新代码后,在后续部署中删除旧列。

验证

  • 过渡期内新旧代码都能运行。
  • 新列数据完整且为最新。
  • 读取切换后新代码不再依赖旧列。
  • 删除旧列后应用无错误。

注意事项

  • expand-contract 需要多次部署与临时存储,对很小的 schema 可能是负担。
  • 需确保在仍有旧版本运行时绝不删除旧列。

适用范围

本条目围绕「零停机重命名数据库列」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。

-- deploy 1: add + dual write
ALTER TABLE users ADD COLUMN full_name text;
-- deploy 2: backfill (batched), switch reads
-- deploy 3: drop old
ALTER TABLE users DROP COLUMN name;