今天想说说删数据库记录这个事,搞得不好真能整出大问题。上周我那个小破后台系统更新,顺手要清理过期用户数据,结果差点把饭碗砸了。
没多想直接开干
早上开完会叼着包子坐电脑前,心想不就删个数据嘛打开数据库客户端,顺手敲了个DELETE FROM user WHERE expire_date < '2023-01-01',回车按得贼爽快。
两秒后我汗毛都竖起来了——控制台显示删了二十多万条记录。我他妈吓得肉包子都掉键盘缝里了,明明只要删三万条测试数据!
连滚带爬救火现场
赶紧翻备份发现昨晚上自动备份刚好卡壳了。手抖得连鼠标都握不住,是掐着大腿逼自己冷静,硬是翻出三天前的冷备文件复原。系统瘫痪了快三小时,用户投诉电话直接打爆老板手机。
- 注意点一:备份是爹
- 注意点二:WHERE条件用前先SELECT
下午被主管骂成狗之后学乖了。新建查询窗口先敲SELECT count()查要删多少条,确认数量对上了才敢写DELETE。结果鼠标点错行——把SELECT语句当成删除给执行了!幸好这回没写错条件。
- 注意点三:执行前检查窗口标签
深夜继续踩雷
晚上十点孩子发烧送急诊,回来脑子还是懵的。想着赶紧把剩下数据清理完,手快直接DELETE FROM order_record后面条件忘了写...光标在空白处闪闪,得亏临时接到老婆电话问退烧药放哪儿,回来发现没执行才捡回条命。
- 注意点四:没条件不操作
不死心又试了软删除方案。给表加了个is_deleted字段,本来以为万无一失了。第二天运营突然在群里吼:“谁把明星用户的成交数据标成删除了?!” 原来UPDATE忘记加WHERE条件,把整张表标记全刷了。
- 注意点五:更新比删除更危险
活成自己讨厌的样子
现在每次删数据都跟做贼似的:
1. 把要删的条件用大字写在便签贴屏幕边框上
2. 打开事务BEGIN TRAN先挂起
3. SELECT查三遍确认目标数据
4. 执行前站起来做组深蹲清醒脑子
5. COMMIT完还得检查操作日志
昨天新来的实习生看我删条记录整了十五分钟流程,眼神就像看神经病。害,等他自己删错次生产库就懂了。