程序犯了好些小错误,出事了,现在坐立不安

2015-02-13 20:59:36 +08:00
 kankana

有个feature是要求用户suspended 30天后,将此用户的所有数据给删掉. 30天内是可以恢复的。

我直接队列,将该任务延迟到一个月后。

现在才发现用户提前被删除了。

原来,延迟参数,我传递的是30*24*60, 实际上,时间单位是秒。。。

现在用户要恢复,结果数据全没了。。。

很对不起老板。。。搞砸了。。。


lessons learned:

1, 加强测试。

2, 定时备份数据库。

7051 次点击
所在节点    程序员
55 条回复
evlos
2015-02-13 22:54:39 +08:00
>> 只是,有些敏感数据,是属于我们的,不希望用户退款后,能够再利用到这些数据.

为什么不直接禁止用户访问呢?
aaronlam
2015-02-13 22:54:58 +08:00
过个好年,有错就改
873681136
2015-02-13 22:56:05 +08:00
我自己也在维护一个OJ,我的做法是添加一个锁定字段,删除操作并不实际删除,而是在锁定字段打个标记,其它数据查询都优先查询非锁定的标记,这样到时恢复数据就好办多了。
overflow
2015-02-13 23:01:33 +08:00
永远不要轻易删除
chinafeng
2015-02-13 23:02:13 +08:00
@kankana 如果按照你这种心理,那我觉得我都能天台见了,最高纪录10分钟编译正式生产3次...调整好自己的心态,就算是国家的天河计算机,前几天都还有漏洞能控制大部分超算,更何况这些小产品小公司(相对国家来说,这些应该都算小了吧)
sb
2015-02-13 23:05:44 +08:00
摸摸…学习下各种教训
zungmou
2015-02-13 23:20:26 +08:00
对于运行的系统,从不去删除数据,只有空间不足时通过数据维护的功能对距离时间最久的数据进行删除。
Felldeadbird
2015-02-13 23:38:20 +08:00
尽量逻辑删除。免得到时候出问题就麻烦大了。
surewen
2015-02-13 23:42:23 +08:00
在我司,这种错误犯两次就得走人。
Phariel
2015-02-13 23:46:55 +08:00
learned => learnt
kankana
2015-02-13 23:59:30 +08:00
@Phariel 欢迎歪楼,欢迎google
kankana
2015-02-14 00:03:12 +08:00
@chinafeng 标题说"好些",但内容我只写了一个. 唉,太马虎了老实说. 完全没经验. 代码部署前, 生产环境得做调整,完全没考虑到...
Elethom
2015-02-14 00:10:32 +08:00
想問問 po 主在哪家公司⋯⋯
realityone
2015-02-14 00:39:41 +08:00
我是把记录移到另一个表里,专门记录被标记删除的数据
juneszh
2015-02-14 00:43:55 +08:00
*个毛线啊 3600 86400 这些“常量”都不记还怎么当程序员的 回去打屁股吧
kmvan
2015-02-14 00:48:40 +08:00
楼主是无证编程还是酒后编程?
palytoxin
2015-02-14 00:52:20 +08:00
以前公司自己的框架,数据库curd操作都做了封装,所有表都有个is_deleted字段
服务器的数据不可能也千万不要真的删除。
老板人挺好,新年加油
sharpnk
2015-02-14 03:35:28 +08:00
"30*24*60" code review is for shit like this. If senior members of your team failed to spot errors like this during the code review, they should be partially responsible too.
qw7692336
2015-02-14 03:53:59 +08:00
@sumhat 或许比较机密的数据,真的要删除
msg7086
2015-02-14 08:16:28 +08:00
@Phariel
‘Learnt’ or ‘learned’?
These are alternative forms of the past tense and past participle of the verb learn. Both are acceptable, but learned is often used in both British English and American English, while learnt is much more common in British English than in American English. [1]

[1]: http://www.oxforddictionaries.com/words/learnt-vs-learned

@kankana
这就是测试不到位啦。
每次完成一个功能就要写对应的测试。
比如写完这个「30天后删除」,就必须要测试它。

Timecop.travel(29.days.ago) do
@u = User.new
@u.suspend
end
User.clean_suspended
expect(User.find(@u).count).to eq(1)

Timecop.travel(31.days.ago) do
@u = User.new
@u.suspend
end
User.clean_suspended
expect(User.find(@u).count).to eq(0)

另外,如果mysql有做binlog的话,是可以重放还原的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/170815

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX