一个 0 字节的文件,差点送走我整个测试库
一个 0 字节的文件,差点送走我整个测试库
那天的任务很普通,给测试环境重灌一次数据库。
流程跑过很多遍了,先把旧库 dump 一份备份(dump 就是把整个数据库导出成一个文件,出事了能灌回去的那种保命备份),再灌新的快照进去。这一步从来没出过幺蛾子,我把命令丢给 Claude Code,让它照着脚本执行,自己切到另一个窗口干别的去了。
过了一会儿回来看,日志全绿,命令都跑完了,没有任何报错。
按流程,下一步就是把旧库清掉,灌新快照。动手之前,我鬼使神差地瞟了一眼那个备份文件的大小。
0 字节。
空的。一个字节都没有。
我盯着那个 0 看了两秒,第一反应是我看错了,把 ls 又敲了一遍。还是 0。也就是说,如果刚才没瞟这一眼,直接执行下一步,旧库被清掉,而我手里握着的保命备份,是一个空文件。
整个测试库,几个月攒下来的数据和账本,就隔着这一眼。
说实话,写到这里我还有点后怕。
先确认了一下旧库还活着,什么都没动,才开始往回翻日志。第一层原因很快找到了,那台机器上存的数据库凭证是旧的,之前轮换过密码,这台机器的凭证文件没同步到。dump 命令认证失败,退出了,输出文件自然是空的。
失败就失败吧,正常。真正让我愣住的是第二层。
这个脚本的第一行,明明白白写着 set -e。
写 shell 的朋友都认识它(set -e 的意思是,脚本里任何一条命令失败,整个脚本立刻退出,不再往下走),它就是干这个的,就是防「前面失败了后面继续跑」这种事故的。dump 都失败了,它为什么一声不吭。
答案是 shell 的一条冷知识,我写了这么多年脚本,栽在这里才真正记住。那条 dump 命令不是单独一行,它在一条 && 链的中间,长得类似这样,
pg_dump ... && gzip ... && echo "backup done"
set -e 的规则是,只有「独立的命令」失败才触发退出,出现在 && 或者 || 链条中间的失败,不算数。shell 认为你既然用了 &&,就是在自己接管控制流,它就不插手了。于是 dump 认证失败,链条断掉,脚本继续往下走,日志照常收尾,一切看起来岁月静好。
好家伙,我专门用来防事故的那行代码,亲眼看着事故发生,然后按规矩保持了沉默。
顺手说一下怎么写才对。要么把链条拆成独立的行,让 set -e 真正管得着;要么在关键命令后面显式检查退出码和产物。备份这种保命环节,我现在的写法是 dump 完立刻校验文件体积,小于阈值直接报错中止,一行 stat 的事,比任何「应该没问题」都硬。
复盘下来,根因有两层。一层是环境的问题,凭证过期没有任何告警,属于基建欠的债。另一层是认知的问题,我对 set -e 的边界理解错了,一直以为它是个全覆盖的保险丝,其实人家有免责条款。
你注意到没有,两层里没有一层是 AI 的问题。
Claude Code 在这件事里的表现无可挑剔。我给它脚本,它忠实执行,日志干净利落。它唯一做的事情,是把这套流程跑得比我手工快得多、顺滑得多,也因此把我流程里那个洞,放大得比手工时代快得多。
这是整件事最扎我的地方。以前我自己手敲这套命令的时候,大概率会在 dump 完成后顺手 ls 一眼,看看文件长啥样。不是流程要求,就是手工操作自带的那种下意识的谨慎。这种谨慎不值钱,但它一直在兜底。把活交给一个不知疲倦、绝不偷懒、也绝不会「顺手看一眼」的执行者之后,下意识的兜底消失了,流程里的洞就是洞,一定会漏。
所以事后我做的,不是给自己立「以后要小心」的 flag。立那个没用,人的记性靠不住,AI 干脆没有记性。
我做的是把防线长到流程里。现在我的部署清单里有一条硬规则,所有恢复类操作之前,强制检查备份文件的体积,不达标直接中止,谁来执行都一样。这行字写在 Claude Code 每次跑部署都必须读的流程文件里,它不会忘,也不会觉得「这次应该没事」。
同一个思路我还推了一步。现在它干完活跟我汇报,我不收「搞定了」三个字,要贴命令的真实输出,要贴产物的真实状态。那天的日志之所以全绿,就是因为「绿」只代表命令跑完了,不代表事情做对了。证据和结论之间的这条缝,就是事故住的地方。
出过一次事的礁石,要标在海图上,而不是指望下次路过时眼神好。
这次翻车,后来成了我一本小册子里的「展品二」。这一年多我把 Claude Code 当主力交付生产代码,攒下了一整套流程和防线,也攒下了五次值得进博物馆的翻车,0 字节备份是其中一次,另外四次一次比一次离谱,有一次一条命令直接送走了一个还在 review 的 PR。我把这些整理成了一本《Claude Code 实战手册》,16 页 PDF,十个章节,从上下文管理、plan mode、worktree 并行开发,到怎么治 AI 报喜不报忧,每一条都是真金白银的学费换来的。
关注「小岛AI」,后台回复 CC,就能拿到。
以及,你要是也有过这种「差一眼就完蛋」的时刻,评论区讲讲,我很想知道大家的海图上都标着些什么礁石。