跳到主要内容

差点把数据库干了,捡回来一条命

周工转码中
周工转码中

· 阅读约 4 分钟

今早八点半,坐在工位上泡了一杯高碎,想着一上午把那个劳务结算脚本跑通,下午还能看看老郭发的图纸。结果十点半的时候,我差点把人家线上库给清了。

具体情况是这样。我最近帮隔壁成本部的小李写了个小工具,扫日志、对账目,算劳务队每天的出工记录。其实需求很简单,就是他们月底对着几十张Excel眼睛快瞎了,想让我把线上系统里三十天的登录和结算日志拉出来做对账。我用 Python 写了差不多一个礼拜,昨天刚跑通。今天小李说,能不能加个功能,把一周前那几笔重复结算的单子查出来,顺带把状态给改了——财务部催得紧,说那几笔显示未结清的其实已经结过了,挂着影响月底账目,得改掉。

我当时想着,这个简单啊。数据库连接字符串我直接从我自己写的测试环境 copy 过来的。测试环境也有一份运行数据,样子长得一模一样。问题是,我手一滑,把上面那个地址换成下面这个的时候,没注意后面的端口号跟库名多打了两个字。

等脚本跑完,终端里出来一个数字:更新了 3200 行。

我心想不对,昨天的数据一共才三百来条。哪来的三千多行?

我马上查了下连接配置。果然,连的是线上正库,库名就多了个 _prod。而且我的 UPDATE 语句里,条件写的是“所有未结算的单据”,本来应该在前面加个时间过滤,我取消了注释的那行只过滤了半个月,剩下的全给它干过去了。等于把一年的结算状态全改成了“已结”。

我当时脑子嗡的一声。老实讲,干工地那么多年,从来没有这种心脏骤停的感觉。我们那会儿顶层浇筑,偶尔泵管堵了、混凝土撒一地,最多是返工加赔料,不至于让别人整个月的活儿都白干。

赶紧给小李发消息,他没回——大概在开会。我打开数据管理后台,看到刚才那张表的数据像被狗啃过一样。整个二十多万行里,有一年多的记录状态全部变成了三。

冷静下来的办法是抽了半根烟,然后想了一下到底有没有备份。昨晚睡觉前我干了一件事:把这台机上的数据库用命令导出了个文件,放在它自己机器的备份目录下面——本意是因为我老觉得那个测试服务器不太稳,怕写了一半崩了。现在回头真是感激自己这个破习惯。同目录下还有另一个系统自动做的周一全备,日期是9月1号,缺最近五天。手动那个正好是昨晚十二点整的,数据全乎。

我把它解压,开了个只读事务,导入到本地一个临时表,然后对着业务表的 id 一项一项比对。把今天早上更新过的那些 ID 找出来,重新按备份里边的原值改了回来。跑了大概四十分钟,中间网络断了一次,这破办公室的 Wi-Fi 还不如工地板房的。

改完再查,正确了。又把备份文件复制了两份,一份放我U盘,一份放到小李的共享盘里。我现在终于理解为啥老项目经理说“资料室钥匙只有两把”是什么意思了。

到现在那股后劲还在,手指尖有点麻。中饭没吃,现在打了这段字,算给自己压压惊。我觉得这事不丢人,你上手新工具,总要毁几次东西才叫上手。我们上塔吊的时候,头三天也都得摔扳手。问题不在于你犯错,在于你犯错之后有没有第二个把得住的家伙兜底。

这事之后我给自己定了个规矩:凡是 UPDATE 之前,先查一遍库名,再白纸黑字把连接地址抄下来贴屏幕上。就像我们那会儿动火作业前要签审批单一个意思。要是嫌麻烦不出这个单据,出了事就是去派出所做笔录的问题了。

明天还得接着改那个脚本,加个判断条件,线上库和测试库的地址靠人工去挑这事儿,该谁干谁干,反正摊我头上,就做了这个插销。

做完了,应该能睡个安稳觉。

周工转码中
周工转码中

干了二十年土木,四十岁转码第六个月。手艺人学新手艺。

查看主页 →