操作数据库 update 忘了加 where

2022-01-21 09:46:25 +08:00
 moonchild

处理一个很不合理的测试需求,需要手动修改数据库若干条记录,平时用惯了 orm ,真在终端写 sql 语句的机会非常少。也是由于基本功太生疏,导致在 select 找到要修改的记录之后直接 update 一敲忘了加 where ,结果把所有数据都更新了,影响是相关所有数据变的不可用,并且影响了前端组件的加载。现在回滚数据库就只能损失一天的数据了,还好是集成环境,如果是生产环境,真不敢想是什么后果。

9477 次点击
所在节点    数据库
90 条回复
mywind
2022-01-21 19:55:37 +08:00
今天一样的经历,好在是测试数据库,binglog 也是 row 。很快就修复了。以后说什么终端打 sql 要加 begin 了。
retrocode
2022-01-21 20:01:09 +08:00
妈耶 看到这标题我血压就开始升高了 敏感操作前备份是个好习惯 好歹能回滚下
documentzhangx66
2022-01-21 20:12:06 +08:00
1.无论是 SQL 、程序代码、甚至在服务器上安装程序,或者在服务器上执行 shell ,请都先在相同的测试环境下,进行测试。执行后,确认业务任然正常,确认压测结论没有太大性能变化,再去服务器上执行。

而且 SQL 这种执行前,对服务器做个数据备份,还是很有必要的。

2.这种方案,不仅能避免自己写错导致的问题,甚至连一些软件的 bug ,也能避开一部分。

3.千万别偷懒,请做好测试,请在正式环境中执行危险操作前做好备份!
WilliamYang
2022-01-21 21:36:37 +08:00
@weiwenhao gorm 这个特性,害了很多公司,很多人
viator42
2022-01-21 21:47:08 +08:00
以前我也办过这种事,干活的时候没看清把公司 OA 生产环境的数据库清空了。突然嗷的一嗓子整层楼乱成一团,我赶紧把昨天的备份导进去才安静下来
AlexaZhou
2022-01-21 22:10:06 +08:00
手动执行 update 是比较危险,最好 begin transaction ,然后 update 再 commit ;
为了保险起见,我还有个习惯是先敲 where 条件, 再退回来敲 set xx=xxx
ajaxfunction
2022-01-22 01:02:24 +08:00
这种事情都会经历的,不经历记不住,就看影响大小了。
当年我在小公司做的项目数据库都没备份的,直到有一次 本以为在操作测试环境, 结果操作了生产环境,把所有人昵称都改成统一的了,反正就是头皮发麻,现在那种感觉现在都记得,估计当时高血压了。
后来才养成了习惯 每个项目无论用哪种手段每天 必须备份数据库,虽然后来一次也没用的上。
rookien
2022-01-22 11:33:30 +08:00
想起来我前年入职第一家公司的时候,也是忘了加 where ,当时心里是真的慌得一 p 啊,只能说还好是测试环境
UN2758
2022-01-22 19:17:05 +08:00
@lwldcr #8 同病相怜啊,我也是写的修数据脚本有 bug ,在生产环境上跑,结果把数据全清掉了,害得 cto 陪我一起修数据修到 11 点
qyvlik
2022-02-09 09:32:13 +08:00
上线 SQL 用 https://github.com/hhyo/Archery ,这个工具使用 goinception 做 SQL 的执行和备份,可以检查不安全的语句,以及执行 SQL 后回滚的 SQL 都会给你自动生成。

archery 的同类品还有如下:
https://github.com/jly8866/archer
https://github.com/cookieY/Yearning

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

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

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

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

© 2021 V2EX