上个月二十几号,周四晚上八点多,我在给一个做建材的客户改后台。有个字段原来存字符串,现在要改成枚举,改 schema 是小事,npx prisma migrate dev 一跑,它会自己比对,然后问我要不要 reset 数据库。
我当时脑子在想别的事,白天另一个项目有个 bug 没修完,手指头已经按了 y。
然后它开始刷日志,一行一行往上滚,drop table 什么的。我盯着看了两秒,突然反应过来:等等,这连的是哪个库。
我们公司的 .env 只有一个,所有环境变量全塞在里面。上上周为了联调,我把 DATABASE_URL 改成 staging 的了,改完就没改回去。Prisma 只认 .env。
那个感觉不是慌,是先从后背凉上来,然后手才开始抖。我按了 Ctrl+C,日志停在中间,已经删了七八张表。
我先去看控制台,staging 那个库是云上的,有自动备份。查到这里我心里落了一半,另一半还悬着——我不确定它备份是每天一次还是每小时一次,也不确定恢复是恢复到新实例还是要覆盖原来那个。这两个差别很大。
后面就是捡。先给运维老陈发消息,打字打了删、删了打,最后发过去一句“哥,staging 的库被我 reset 了,有备份吗”。他过了两分钟回“有,别动”。那两分钟我一直在刷那个控制台页面,刷了大概二十遍。
等他的时候我问了 AI 一句:prisma migrate reset 删掉的表还能恢复吗。它说不能,除非有备份。行吧,我知道,问晚了一步。不过它顺手给了我几个词,backup、snapshot、point-in-time recovery,我记了下。snapshot 我第一次见的时候拼成了 snapshop,搜出来一堆卖东西的网站,查了下才知道差一个 t。restore 我按汉字读“瑞斯多”,对不对不知道,反正老陈说的时候我听懂了。还有个词 rollback,我直译过来是“滚回来”(?),大概是回滚的意思。但这次用不上,reset 不给你 rollback 的机会,它是直接把库推平重来。
老陈最后是用一小时前的那个快照恢复的,恢复到一个新实例,然后把连接串换过去。丢的是那一小时里测试同事录的几条数据,无所谓。他说下次注意,我说好。没骂我,这反而更难受一点。
回家路上我一直在想一件事:我不是不会,我是没看。按 y 之前,日志上其实已经打出来它要连的地址了,我眼睛在那行上过了一遍,没进脑子。英语差可以查词典,眼睛不看在哪个语言里都一样。
第二天我把 .env 拆成了两个,DATABASE_URL 只放在 .env.local 里,还是等老陈回了消息才敢改的。
今日单词:snapshot,快照。这次应该能记住了,毕竟差点靠它救的命。