跳到主要内容
弗美科技
技术分享

一次误删之后,MySQL 主从加备份

一条没带 WHERE 的 UPDATE 改掉了一张配置表的 400 多行,好在是配置不是订单。恢复用了 2 小时,从 binlog 里反推。事后加了三样:主从复制、每天凌晨全量备份加 binlog、以及所有 UPDATE/DELETE 必须走带行数确认的脚本。误删那次没人挨骂,规矩留下了。

2021年10月22日数据库备份踩坑记录

10 月 22 号下午,一条 UPDATE 少写了 WHERE。

发生了什么

那张表是系统配置,400 多行,存的是各门店的参数。本来只想改一行的值,语句粘到客户端里执行,回车之后看提示:Rows matched: 417 Changed: 417。手一下子凉了。

好在是配置表,不是订单。页面当时就开始不对劲,几个门店的参数全变默认值,客服群里先冒出两条消息。

恢复那两小时

没备份,这是最要命的。最后是从 binlog 里把这批 UPDATE 反推出来,按 position 导出成反向 SQL,再跑回去。两个人核对了 40 分钟,把 417 行逐条比对,改回 400 多行里真正该保留的值,中间有 12 行本来就打算改,得单独挑出来。

前后两小时。页面恢复之前,我们在群里发了一句「在处理,别下单」,比默默修着强。

事后加的三样

  • 主从复制。一台从库,读写分离先不做,纯粹为了有个能立刻切过去的副本。延迟盯着,超过 5 秒告警。
  • 每天凌晨 3 点全量备份,binlog 单独存,保留 7 天。备份完自动往一张表写一行校验记录,光看脚本退出码不算数,得能查到备份文件大小和行数。
  • 所有 UPDATE 和 DELETE 走一个包装脚本,执行前先打印预计影响行数,要人敲一次确认。生产库的直连客户端收掉了,只留只读账号给日常查。

一条没写进文档的规矩

误删那位没挨骂。会上只说了一句:谁都会手滑,所以别让人有手滑的机会。

后来我们评审 SQL 时多问一句「这条没带条件会怎样」,问了半年,成了习惯。有回一个新同事写完语句自己先愣了一下,把 WHERE 补上了,没人提醒他。

那 417 行的截图还留在内部文档里,标题是《两小时》。

商务咨询 · 免费初步沟通

需要针对你的场景给个建议?

把业务背景和当前系统情况告诉我们,我们会给出可执行的思路。

在线留言

周一至周五 9:00–18:00 · 工作日 9:00–18:00 响应,留言会在一个工作日内回复。

商务微信
商务微信二维码

扫一扫,加商务微信咨询服务与方案报价

或填写需求表单