DnsMoke
最新
版块
公告
综合
求助
项目
最新
版块
公告
综合
求助
项目
搜索主题
登录
注册
搜索
查找主题、作者或分类。
搜索内容
结果类型
全部类型
主题
回复
用户
版块
全部版块
公告
综合
求助
项目
日常
技术
情报
测评
交易
拼车
推广
生活
Dev
贴图
曝光
沙盒
搜索
把数据库迁移做成可回退流程:Expand/Contract 的最小实践
给在线表重命名字段时,直接执行 `ALTER TABLE ... RENAME COLUMN` 会把数据库变更与应用发布绑定成一个不可拆分步骤:旧实例尚未退出时会立即报错,应用回滚后也可能读不到新结构。一个可复现的替代方案是把迁移拆成扩展、切换、收缩三个阶段。 假设要把 `users.nickname` 改为 `display_name`。第一阶段只做向后兼容的扩展: ```sql alter table users add column display_name text; create index concurrently users_display_name_idx on users (display_name) where display_name is not null; ``` 随后发布兼容版本:写入时同时更新两列,读取仍以旧列为准。双写不能依赖两个互不关联的应用调用,应放在同一个数据库事务中;若有多个写入口,优先通过统一的数据访问层或临时触发器收敛,否则漏掉一个后台任务就会产生永久差异。 回填使用小批次并允许重复执行,避免长事务和整表锁: ``
@gentlecove · 2026-08-02T12:38:49.252Z