我不小心清空了生产数据库中的整个数据集。接下来发生的事情如下。
由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!
最近,我工作中发生的一起不幸事故却让我受益匪浅。没错,我不小心把生产数据库中的整个数据集都清空了。
在深入探讨细节之前,先让我简单介绍一下自己。我是一名全栈工程师,专长是 React 和 Node.js。我目前在一家创业公司工作,我们生产环境使用 Node.js 和 Postgres。
最近,我在开发一个用于更新数据库表的 API。该表的结构如下:
module.exports = (sequelize, Sequelize) => {
const User = sequelize.define("user", {
name: {
type: Sequelize.STRING
},
email: {
type: Sequelize.STRING
},
data : Sequelize.JSON,
});
return User;
};
这里需要注意的一点是dataJSON结构中的内容。我构建的API应该更新表中的数据对象。
举个例子,这是 GET 请求的数据结构。
它包含dataJSON 结构,其中包含诸如phone、address、country和 等字段postal code。
所以,我需要编写一个API来更改数据中的电话号码。我觉得这应该挺简单的,而且只用了几个步骤就完成了。
app.post('/phone-number/update/:id',async (req,res) => {
try {
const id = req.params.id;
const phonenumber = req.body.phonenumber
const user = await User.update({ "data.phone" : phonenumber },{
where : {
id
}
})
res.status(200).json(user)
}
catch(e){
res.status(500).json(null)
}
})
它会更新数据对象中的电话号码。目前一切正常。之后,我编写了一个测试用例来覆盖将更新后的电话号码存储到数据库中的场景,并且测试通过了。
目前一切看起来都很顺利。于是,项目进入了生产阶段。但我完全没有意识到生产阶段即将发生的灾难。当时我在家,心想:
生产环境中发生的情况是,API完全清除了JSON数据,并将其替换成了空字符串phone number。我看到这一幕感到非常震惊。
举个例子,这是 API 调用前后的数据对比。
API更新后,
然后,我意识到 postgres update 命令JSON不应该这样运行。幸运的是,我们的数据库在问题发生之前正好做了备份。所以,我直接回滚了数据库数据,并注释掉了这个 API 中的相关功能。
但是,我的首席技术官注意到了这个问题,并帮我解决了这个问题。与此同时,我找到了另一种修复 API 功能的方法。大概是这样的:
app.post('/phone-number/update/:id',async (req,res) => {
try {
const id = req.params.id;
const phonenumber = req.body.phonenumber
let user = await User.findOne({ id })
user.data = { ...user.data,phone : phonenumber }
await user.save()
res.status(200).json(user)
}
catch(e){
res.status(500).json(null)
}
})
我知道这看起来不像是一个有效的解决方案,但当时我需要一个可以立即部署的可用方案。我迅速编写了测试用例来覆盖所有场景,并提交了一个 PR。CTO 亲自查看了这段代码,进行了审查并提出了一些反馈意见。最终,这个补丁当天就被合并到生产环境中了。
这看起来或许是个微不足道的小问题,但它却有可能导致整个数据集丢失。与其为此担忧,我不如把它当作一次宝贵的学习经历。他们是:
- 即使我们编写了测试用例来涵盖这种情况,但如果能够手动测试这种情况,总是会更好。
- 如果你的代码导致生产服务器崩溃,千万不要感到压力。我知道这种情况不应该发生,但在某些极端情况下,它确实会发生。所以,把它当作一次学习的机会,避免将来再犯同样的错误。
- 这类事情总会发生。在那种情况下,有同事或前辈的支持会很有帮助。这是我们职业生涯中不可避免的一部分。
希望你从这次真实经历中有所收获。我分享这段经历是希望你能从中获得经验,而无需经历同样的困境。我们下次再见。祝你编程愉快 :-)
文章来源:https://dev.to/ganeshmani/i-accidentally-wiped-the-entire-dataset-in-the-production-database-here-s-what-happened-next-l7d




