今天上午接了个活,给一家本地餐饮店改会员系统。他们之前找的学生做的,那哥们收了三千块做完就消失了,现在卡里余额不显示了,客户扫码付款成功但积分不动。店家急得不行,说再修不好这周会员日就完了。
我远程上去看了一眼,好家伙,代码我大概看明白了,但问题不好定位。顺手查了下数据库,发现那学生的表结构设计得就离谱,一个字段存了会员卡号、手机号、积分记录,全塞在 text 里,用的时候靠正则硬抠。我心想这也能跑起来?正想着,手一抖点了表结构的更改选项,想看看能不能拆出来,结果界面卡了一下——等我缓过来,表没了。
对,就当着还在正常营业的系统,我把表删了。
我当时脑子嗡的一下。店家那边微信已经发过来了:"师傅,系统好像停了,收银台那边在催。"我看了一眼时间,上午十点半,店里已经在来人了。第一时间跟店家说网络波动,别急,半小时内恢复。其实心里想的是:如果备份也没有,这单我可能要赔钱不说,以后这片的名声也别想做了。
先看了下有没有开 binlog——谢天谢地,那学生虽然菜,但装环境的时候默认的 MySQL 配置里 binlog 是开着的。这账我得学会算了:如果他那会儿手贱把 binlog 关了,今天就不是写博客,是写道歉信了。我赶紧从 binlog 里找之前全量备份的时间点,然后重放日志。说实话那个库不大,总共也就七百多 M,但重放加上恢复花了我四十分钟。期间店家又催了两次,我给他报了个"网络波动,大文件损坏"的鬼话糊弄过去。
恢复完之后我没敢让系统直接上线,先把数据导出来在本地起了个环境跑一遍,确认没丢数据才连回去。还好,积分记录一条没少。我顺手把那个 text 字段做了拆表,会员主表、积分明细表分开。弄完已经下午一点了,午饭没吃,胃有点难受。
这单收尾款的时候跟店家说误了点工期,没算加班费。店家挺高兴,说比我之前找的那些人都靠谱。我不怪那学生,因为我刚入行那年也干过这种蠢事——直接在线上环境改表,把几十条数据弄没了赔了一千五。说白了,那人人都是这么过来的,但改完得长记性,以后再碰线上库,先备份再动手,这句话值多少钱买来的我自己知道。
晚上吃饭的时候想了想,今天要真出事赔钱还好,主要是以后报价就涨不上去了。现在想想还是有点后怕的。对了,那个店家的会员日这个周六,系统目前跑得挺稳,他说回头给我介绍两家也用同一家的同行。我这周估计还得去趟他店里吃碗粉,顺便把备份策略给他写上。