网易首页 > 网易号 > 正文 申请入驻

为什么一句RENAME COLUMN,会让你的旧Pod全部报错?

0
分享至

你让编码智能体把 users.name 改成 full_name。它更新了模型,改好了每一条查询,然后写了一个只有一行的迁移:ALTER TABLE users RENAME COLUMN name TO full_name;。diff 很干净,测试也过了——因为测试只跑了一个版本的代码。而生产环境跑的是两个。


Kubernetes 的 Deployment 滚动发布时,会先把新的 ReplicaSet 扩容,同时把旧的缩容,maxUnavailable 和 maxSurge 默认都是 25%。在整个发布窗口里,旧 Pod 和新 Pod 是同时在对外提供服务的。你的迁移只跑一次,就在这个窗口之前或者窗口之中的某个位置。改名之后还活着的每一个旧 Pod,都会把 SELECT name ... 发给一张已经没有 name 列的表。

一行 RENAME 里其实塞了两种失败

第一种是代码与 schema 不匹配。先跑改名,旧 Pod 挂;先发代码,新 Pod 在迁移落地前挂。没有任何一种顺序能让两个版本同时满意,所以 strong_migrations 的 README 说得很直白:重命名一个正在被使用的列,会导致应用报错。Squawk 这个 linter 专门有一条 renaming-column 规则,也是同一个原因。

第二种是锁。改名不碰数据,Postgres 文档写的是对已存储的数据没有影响。但 ALTER TABLE 会拿 ACCESS EXCLUSIVE 锁,除非另有说明,而这种锁模式与其它所有锁模式都冲突,包括一条普通 SELECT 拿的 ACCESS SHARE 锁。如果有一个长事务正占着这张表,改名就得等。而在它等待期间,后面每一条需要这张表锁的语句都会排在它后面。表在改名完成或放弃之前,读写全被堵住。

解法是 2014 年就有的

Danilo Sato 在 2014 年把它叫做 Parallel Change:先把接口扩展成同时支持新旧,迁移客户端,再收缩回只留新的。落到 Postgres 的列改名上,就是四步。

  1. 扩展:加新列,加同步触发器,让新旧两列保持一致。
  2. 回填:用独立的批量脚本按主键把老数据搬过去。
  3. 切换:发新代码,只读写新列。
  4. 收缩:确认没有已发布代码再读旧列之后,单独一次发布删掉旧列。

回填脚本要按主键分批,每一批都远低于 30 秒的 statement_timeout。某一批超时了,它会自己回滚,循环重试同一段范围。跑完之后要检查有没有漂移:SELECT count(*) FROM users WHERE full_name IS DISTINCT FROM name; 这个数必须是零,才能往下走。

如果这一列需要 NOT NULL,Postgres 18 允许你在不加长锁的前提下补上。ALTER TABLE 文档允许在非空约束上用 NOT VALID,校验作为单独一条语句跑。校验那条的 statement_timeout 比别处长,因为它要扫全表,而且它只拿 SHARE UPDATE EXCLUSIVE 锁,读写照常。

第四步要等到没有任何已发布代码读 name,并且已经过了你会回滚的那个点。然后它在自己的一次发布里删掉旧列。DROP COLUMN 也很快,Postgres 不会物理删除这一列,只是让它对 SQL 不可见,空间会在下一次表重写时回来。有一个坑:有些 ORM 在启动时缓存列清单。strong_migrations 提到 Active Record 会在运行时缓存数据库列,所以在 Rails 上你要先把这一列加进 ignored_columns 并发布,再去执行删除。

该给智能体的规则

智能体写出那一行,是因为没有任何东西告诉它代码还有第二个版本。那就告诉它。Claude Code 在处理匹配文件时会加载 .claude/rules/ 下按路径生效的规则,所以这个文件只在智能体碰到迁移时才出现。规则可以写成:永远不要对运行中的应用正在读的表做 RENAME COLUMN 或 RENAME TABLE,改为提出 expand-contract;扩展迁移用 ADD COLUMN 加一个 BEFORE INSERT OR UPDATE 触发器保持新旧列同步;回填是独立的批量脚本,按主键推进,绝不放进迁移里;每个迁移文件开头都要有 SET lock_timeout 和 SET statement_timeout;DROP COLUMN 单独一个迁移,放在更晚的一次发布里,等没有已发布代码再读这一列之后;被要求做重命名时,写出完整的四步计划,本次改动里只放第一步。

仓库里其它编码智能体读的是 AGENTS.md,所以把这些条目也复制过去。规则文件只是建议,文档说得很直接:Claude 把它们当作上下文,而不是强制配置。所以要用一个不关心 SQL 是谁写的检查来兜底。在 CI 里跑 squawk 'migrations/*.sql',或者在 pull request 上用 squawk-action。它的 renaming-column 规则能抓住那一行,require-lock-timeout 和 require-statement-timeout 能抓住忘了写超时的迁移。它也会对第四步的删除报警,这没关系——那正是应该由人过一眼再发的那一个迁移。

想把 expand-contract 的记账工作自动化,pgroll 会帮你做加列、回填和同步触发器,并通过视图同时提供新旧两个 schema 版本。但手工知道这四步,仍然是你能审阅它、或者审阅你的智能体即将执行什么的前提。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
个人养老,山东打响第一枪!

个人养老,山东打响第一枪!

A活着
2026-10-17 20:09:06
莫斯科机场再次瘫痪

莫斯科机场再次瘫痪

战争研究所
2026-10-17 00:17:24
担心被中国拒之门外,高市早苗急了:先发制人?

担心被中国拒之门外,高市早苗急了:先发制人?

经点星娱
2026-10-18 08:53:48
狂轰77分27板21助!76人四巨头爆发,大帝梦回巅峰,一战认清5现实

狂轰77分27板21助!76人四巨头爆发,大帝梦回巅峰,一战认清5现实

篮球扫地僧
2026-10-18 15:54:07
A股:不必等开盘了,不出意外,明天周一,很可能迎C浪调整重启行情?

A股:不必等开盘了,不出意外,明天周一,很可能迎C浪调整重启行情?

趋势清风侠
2026-10-18 10:01:13
英超前瞻丨利兹联2-3曼联:风雨飘摇,卡里克还能扛多久?

英超前瞻丨利兹联2-3曼联:风雨飘摇,卡里克还能扛多久?

体育世界
2026-10-18 16:01:07
红薯被注意!研究发现:吃得越多,血栓者寿命可能越长?真的吗?

红薯被注意!研究发现:吃得越多,血栓者寿命可能越长?真的吗?

白宸侃片
2026-10-18 14:08:45
西交大学生周凯旋被判死刑,行刑前拒见家属,孤身赴死!

西交大学生周凯旋被判死刑,行刑前拒见家属,孤身赴死!

华人星光
2026-05-23 10:51:12
中日闹那么多天,躲在日本背后的第二条大鱼被我们钓了出来

中日闹那么多天,躲在日本背后的第二条大鱼被我们钓了出来

果妈聊娱乐
2026-10-16 09:18:34
“磨膝大户”被揪出,是跑步的10倍,医生:不想软骨磨光,早扔掉

“磨膝大户”被揪出,是跑步的10倍,医生:不想软骨磨光,早扔掉

医学原创故事会
2026-10-07 11:22:03
0.7nm芯片诞生!全球半导体正式踏入埃米时代,中国芯片压力来了

0.7nm芯片诞生!全球半导体正式踏入埃米时代,中国芯片压力来了

梁濆爱玩车
2026-10-18 04:04:27
2026全球中华小姐冠军伊娃,长得真的好像洋娃娃

2026全球中华小姐冠军伊娃,长得真的好像洋娃娃

娱你同欢
2026-08-24 14:45:18
普京:必须继续对乌克兰军工综合体实施大规模打击

普京:必须继续对乌克兰军工综合体实施大规模打击

俄罗斯卫星通讯社
2026-10-18 16:15:29
开售不到一月,iPhone 18 Pro酒红变淡粉

开售不到一月,iPhone 18 Pro酒红变淡粉

我是一个粉刷匠2
2026-10-15 20:10:31
特斯拉在研究让汽车飞上天,我们在研究车里怎么装下冰箱与火锅

特斯拉在研究让汽车飞上天,我们在研究车里怎么装下冰箱与火锅

王新喜
2026-10-16 19:15:29
如今许可馨改名换姓躲美国,靠打零工度日,父母双双提前退休了

如今许可馨改名换姓躲美国,靠打零工度日,父母双双提前退休了

泪满过眼
2026-10-18 03:08:00
万万没想到,消失 11 年的李兆会,竟给 44 岁未婚的车晓留下一手

万万没想到,消失 11 年的李兆会,竟给 44 岁未婚的车晓留下一手

卷史
2026-10-04 00:15:08
2亿多灵活就业者,只有35%的人交社保,问题出在哪?

2亿多灵活就业者,只有35%的人交社保,问题出在哪?

财话连篇
2026-10-18 16:00:26
中央党报评“尊界刹车事件”!

中央党报评“尊界刹车事件”!

新浪财经
2026-10-17 15:31:29
三镇vs申花:双方均四外援出战,李申圆、高天意、杨泽翔首发

三镇vs申花:双方均四外援出战,李申圆、高天意、杨泽翔首发

懂球帝
2026-10-18 16:47:20
2026-10-18 17:00:49
我是一个养虾人
我是一个养虾人
有态度网友ytd
217文章数 92关注度
往期回顾 全部

科技要闻

王江舟院士:6G到底是不是骗局 是不是收割

头条要闻

埃及街头现凉皮小摊一碗16元 老板:希望未来能开餐馆

头条要闻

埃及街头现凉皮小摊一碗16元 老板:希望未来能开餐馆

体育要闻

升级版杨瀚森再闯难关:当上开拓者第三中锋还得拼

娱乐要闻

李连杰回应抛妻弃女传闻,透露四个女儿关系

财经要闻

马斯克:美债问题只能靠AI和机器人解决

汽车要闻

星瑞L PLUS限时售价10.97万元起 开启智混3L时代

态度原创

房产
本地
健康
公开课
军事航空

房产要闻

利好密集落地+现房好房断档,广州楼市买入窗口,正在倒计时!

本地新闻

因新荣记出圈,这座浙东小城才是吃货天堂

看着很健康的人,怎么会突然猝死?

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

乌克兰全国超15处重要能源设施遭俄袭击 泽连斯基发声

无障碍浏览 进入关怀版