专栏名称: 数据分析与开发
伯乐在线旗下账号,分享数据库相关技术文章、教程和工具,另外还包括数据库相关的工作。偶尔也谈谈程序员人生 :)
目录
相关文章推荐
数据分析与开发  ·  确认裁员了,很严重,所有数据人提前做好准备吧! ·  昨天  
数据中心运维管理  ·  一文读懂:数据中心电气规划与供配电系统设计 ·  昨天  
数据中心运维管理  ·  2025年数据中心七大可持续性策略 ·  4 天前  
数据中心运维管理  ·  数据中心规划方案 ·  3 天前  
51好读  ›  专栏  ›  数据分析与开发

我不小心删除了所有的数据

数据分析与开发  · 公众号  · 数据库  · 2017-02-17 21:50

正文

(点击 上方公众号 ,可快速关注)


来源:外刊 IT 评论

www.vaikan.com/i-accidentally-deleted-all-our-data/

如有好文章投稿,请点击 → 这里了解详情


昨天,我和在Famigo公司的同事Cody 和 Shaun 一起去参加 MongoDallas研讨会。我们在几个月前听说了这个会议,感到去这个会议将会是次有趣的活动。 我们公司几乎所有的东西都是存储在MongoDB里的,Cody会在这个会议上做一次演讲介绍我们的使用情况。


会议办的非常好,进行的过程中没有出什么意外情况。(跟上次活动一样,10gen公司给会议提供了大量的饮料。)午餐期间,我们跟 GameStop公司的几个家伙侃大山。其中有个人问我们在正式环境服务器上做过的最糟的一件事情是什么。我想不出什么,但Cody给大家讲了一个他在以 前的岗位上的一个故事。是他把完全重写的代码放到服务器上后,整个环境立即崩溃了。


可结果却是,我在下午实现了我对生产环境犯下的最大的错误。


午餐之前,在两个演讲之间,我检查了一下我们的服务器,看看是否一切正常。我发现了一个异常,跟保持唯一数据值有关。我们的API中的一个竞争关系的条件语句导致了数据库中的两个账户保存了相同的email地址,但每个账户的email地址必须是唯一的。


我迅速的定位了问题,在我们的缺陷跟踪系统了添加了一条记录,描述了问题的原因,以及产生冲突的账户。我删除了这个账户,因为它没有跟任何数据关联,我们的客户在下次登录时,系统会自动初始化一条记录。



然后,我继续查找,看看数据库中是否还有其它产生冲突的账户。我循环数据库里的每个账户,依次保持它们(没有做任何改变);有问题的数据会在保持时抛出异常信息。我在Python的交互shell里编码,所以当时的代码并没有保留下来,但它们大概是这样的:


from mongoengine import connect

from models import Family

connect ( 'the-production-database' )

for family in Family . objects :

family . save ()


代码执行完并没有出现异常,于是我关掉了笔记本,把注意力重新放到会议上。几个小时后,Cody收到了大量的报告服务器响应变慢的邮件。他迅速的打开了笔记本,我在旁边看着他的屏幕。当我看到这一幕时,几乎诱发了我的心脏病:


>>> Family . objects . count ()

38


这数量少了好几个数量级!我们极度不安,从会议厅里溜了出去。


事情很快就明白了,我们的帐户信息,而且只是帐户信息,被弄丢了。我查看新近出现的账户信息,把它们加入的时间和我最后一次提交操作的时间对比。它们不可思议的接近。


不幸的是,我的屏幕会话没有足够的回滚信息来让我看看今天早些时间究竟做了什么。因为我是在交互式shell里执行的,我找不到任何历史记录。最大可能的猜测,我应该是干了类似这样的事情:


for







请到「今天看啥」查看全文