# 一次 MySQL DELETE 误操作的数据恢复尝试实录
## 背景2026年1月20日中午有人在生产环境执行了一条 DELETE 清理脚本想删除 xxx 表中属于2026年订单的数据。结果删了 206,689 行。---## 第一步还原操作过程查生产sql日志11:51:12CREATE TABLE xxx_2026 ... 11:51:27INSERT INTO xxx_2026 SELECT * FROM ... (备份完成) 11:53:00DELETE FROM xxx WHERE orderno IN (SELECT orderno FROM tb_order_2026) (执行耗时: 116.287s)**操作逻辑**tb_order.sh 脚本的标准流程是——先 INSERT 到年度备份表再 DELETE 主表。备份已完成DELETE 也执行了。**删了多少**_2026 备份表记录了 206,689 行这基本上就是被 DELETE 掉的行数。但精确数字因为日志被截断始终没能确认。## 第二步发现第二个 DELETE 没执行脚本本意是删两批- 第一批2026-01-01 ~ 2026-01-06 的订单 ✅ 已执行- 第二批2026-01-06 ~ 2026-01-11 的订单 ❌ 未执行查日志发现第二次 DELETE 报了语法错误SQL 语法错误: DELETE FROM ... WHERE orderno IN (...)**原因**Navicat 传参时 SQL 被双引号包住导致语法错误第二次 DELETE 根本没有执行。这意味着 2026-01-06~11 的数据还在主表里没丢。## 第三步停止定时任务防止再次触发crontab 显示每月 15/16/23 号凌晨 3 点会执行 tb_order.sh每月15/16/23号凌晨跑清理脚本0 3 15,16,23 * * /opt/tb_order.sh 0 4 15,16,23 * * /opt/tb_pay_info.sh紧急执行bashsystemctl stop crond暂停定时任务防止23号凌晨脚本再次执行。第四步评估恢复方案方案一binlog 闪回mysqlbinlog --start-datetime2026-01-20 11:50:00 \--stop-datetime2026-01-20 12:00:00 \/var/lib/mysql/mysql-bin.000001 | grep DELETE结果无 binlog。该 数据库为自建的 实例没有开启 binlog无法用 mysqlbinlog 恢复。方案二HBR 全量备份# 查 HBR 备份日志grep 2026-01-19 /usr/local/aegis/hbrclient/logs/backup_job-*.log# 结果# backup_job-14940.log: 2026-01-19 02:02:00 开始全盘备份# backup_job-14940.log: 2026-01-19 03:00:06 全盘备份完成HBR 每天凌晨 2 点有全盘备份包含 /var/lib/mysql。理论上可以从 HBR 恢复一个副本再导出被删数据后插回主表。但 HBR 恢复操作复杂需要申请副本 → 挂载 → 启动临时实例 → 导出数据 → 清理副本。步骤多风险高暂时没有执行。方案三INSERT IGNORE 回滚最终方案_2026 备份表有 206,689 行结构已知id 主键 orderno 索引。回滚 SQLsql-- 分批插回每批1000行INSERT IGNORE INTO xxxSELECT * FROM xxx_2026WHERE id BETWEEN 1 AND 1000;INSERT IGNORE INTO xxxSELECT * FROM xxx_2026WHERE id BETWEEN 1001 AND 2000;-- ... 以此类推INSERT IGNORE 的好处如果 2026-01-06~11 的数据没被删的那批和 _2026 里有主键冲突不会报错直接跳过。但回滚最终没有执行完——因为 SHOW CREATE TABLE 结果没拿到无法精确确认主键列名回滚 SQL 暂停。踩的坑坑一SQL 被双引号包住导致语法错误Navicat 传参习惯会把变量用双引号包住但 MySQL 里字符串应该用单引号双引号是用于表名列名的。这导致第二次 DELETE 失败数据没有按预期删除干净。教训Navicat 传参时确认 SQL 语法不要依赖 GUI 自动加引号。坑二日志里的 COUNT 结果被截断11:51:27 INSERT INTO xxx_2026 SELECT * FROM ...11:51:27 SELECT COUNT(*) FROM ...查询执行了 11.733s日志里能看到语句发出但结果数字被截断。始终不知道精确删了多少行只能靠 _2026 表的行数反推。教训生产执行重要 SQL 前先在测试库跑一遍确认结果。坑三没有 binlog该 RDS 实例未开启 binlog导致无法用 mysqlbinlog 做增量恢复。教训生产数据库务必开启 binlog是数据安全的基本保障HBR 是全盘备份包含 /var/lib/mysql但不包含 binlog 日志文件binlog 是独立的。即使恢复了 HBR 副本也只能恢复到快照点的全量数据无法做增量。教训HBR binlog 双重保障才是完整的生产数据库备份策略。总结DELETE 删了多少约 206,689 行从备份表反推2026-01-01~06 数据已备份到 _2025 表未回滚2026-01-06~11 数据因语法错误未删除仍在主表定时任务已停止 crondbinlog未开启无法 mysqlbinlog 闪回HBR 备份2TB包含 MySQL 全量数据INSERT IGNORE 回滚因主键列名未确认未执行完经验总结1. 生产执行 DELETE 前必做检查清单□ 在测试库跑一遍确认影响行数□ 确认备份已就位INSERT SELECT 完成□ 确认 crontab 已暂停或该时段无定时任务□ 确认 binlog 已开启□ 确认 WHERE 条件无误特别检查引号是单引号□ 预估执行时间设置合适的 max_execution_time2. 备份表命名规范备份表加时间戳后缀xxx_2025 → xxx_20250623_1151这样即使多次操作备份不会覆盖。-- 检查是否开启SHOW VARIABLES LIKE log_bin;SHOW VARIABLES LIKE expire_logs_days;4. 脚本 DELETE 改为 UPDATE 标志位tb_order.sh 逻辑是 INSERT DELETE更安全的做法是-- 不删除只标记删除状态UPDATE xxxSET deleted 1, delete_time NOW()WHERE orderno IN (SELECT orderno FROM tb_order_2025);这样数据不丢失随时可以回滚。相关命令速查# 查 binlog 是否开启mysql -e SHOW VARIABLES LIKE log_bin;# 查 HBR 备份日志grep backup_job /usr/local/aegis/hbrclient/logs/backup_job-*.log | tail -10# 查 crontabcrontab -lcat /etc/cron.d/*# 暂停定时任务systemctl stop crond# 查备份表行数SELECT COUNT(*) FROM xxx_2025;# 分批 INSERT IGNORE 回滚示例INSERT IGNORE INTO xxxSELECT * FROM xxx_2025WHERE id BETWEEN 1 AND 1000;

相关新闻

大模型逻辑能力横评:28道题深度压力测试

大模型逻辑能力横评:28道题深度压力测试

1. 项目概述:一场不靠刷榜、只拼真功夫的逻辑能力“压力测试”我做这个大语言模型逻辑能力横评,已经持续了整整两年。不是为了凑热闹发个榜单蹭流量,而是因为——在真实工作场景里,模型能不能把一道题“想明白”,远比它…

2026/7/4 3:03:07阅读更多 →
C语言箭头操作符(->)完全教程:用法与实例

C语言箭头操作符(->)完全教程:用法与实例

大家好!在这篇文章中,我们将着重介绍C语言中的箭头运算符。C语言包含各种运算符来处理和操作数据记录,其中之一就是箭头运算符。那么,让我们开始吧!C中的箭头运算符的工作原理是什么?在C语言中,…

2026/7/4 3:03:07阅读更多 →
为了优雅地下载网页视频,我顺手写了个开源扩展:FlowPick 诞生记

为了优雅地下载网页视频,我顺手写了个开源扩展:FlowPick 诞生记

为什么我要做 FlowPick 刷网、找素材、存资料,总会撞上几个让人抓狂的瞬间: 网页上的精美配图,右键检查全是混淆过的代码,翻半天找不到原图地址; 想存一段教学视频,打开开发者工具(F12&#…

2026/7/4 3:03:07阅读更多 →
Kotlin安卓app版本自动升级设计实现

Kotlin安卓app版本自动升级设计实现

序: app项目上线后需要持续发版迭代,通过版本控制自动升级(或者说当app启动时,自动检测有最新版本,自动安装升级)就显得尤为重要,那么接下来设计具体如何落地,可以加我底部wx交流ga…

2026/7/4 4:53:22阅读更多 →
[DeepAgents:LangChain的Harness-04]TodoListMiddleware的任务拆解与状态流转

[DeepAgents:LangChain的Harness-04]TodoListMiddleware的任务拆解与状态流转

TodoListMiddleware赋予Agent显式的规划和任务跟踪能力。它强制Agent将复杂的多步骤目标分解为一组结构化的可执行项,从而将被动型Agent转变为主动型Agent。它通过拦截Agent的推理循环来注入规划逻辑和工具: 规划工具:它为Agent提供了write_t…

2026/7/4 4:53:22阅读更多 →
Windows平台Appium 2.0自动化测试环境搭建与真机连接实战指南

Windows平台Appium 2.0自动化测试环境搭建与真机连接实战指南

1. 项目概述与核心价值如果你是一名移动端测试工程师、自动化开发或者对手机应用自动化感兴趣的技术爱好者,那么“在Windows上搭建一套完整的Appium 2.0 Android SDK环境,并成功连接真机”这件事,大概率是你职业生涯中绕不开的“第一道坎”。…

2026/7/4 4:53:22阅读更多 →
我的渗透测试攻防指南

我的渗透测试攻防指南

目录 获取授权 一、已知条件 二、信息收集 1. 域名 2. ip 3. 端口 4. 网站系统信息 三、攻击 1. burpsuite 抓包分析 2. 有框 3. URL、网站框架特征 4. 网页源码分析 4. 文件上传点 JS文件API接口 漏洞扫描器 待续、更新中...... 获取授权 获取书面授权(避免法律风险),定义…

2026/7/4 4:53:22阅读更多 →
PM的游戏思维

PM的游戏思维

游戏思维:拥抱挑战,转化低估不怕事的思维,还有个关键,就是游戏心态。人生本来就是来体验的,项目管理亦是,就像游戏一样,没必要内耗。每一次挫折都是升级打怪,每个难题都是通关的谜题…

2026/7/4 4:53:22阅读更多 →
PX4多旋翼无人机集群协同控制:分布式架构与智能算法实践指南

PX4多旋翼无人机集群协同控制:分布式架构与智能算法实践指南

PX4多旋翼无人机集群协同控制:分布式架构与智能算法实践指南 【免费下载链接】PX4-Autopilot PX4 Autopilot Software 项目地址: https://gitcode.com/gh_mirrors/px/PX4-Autopilot 随着无人机应用场景的不断拓展,单一无人机已难以满足复杂任务需…

2026/7/4 4:48:22阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/3 14:18:39阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/3 14:38:35阅读更多 →
端到端自动驾驶:从GTC‘26看工程可信落地的核心逻辑

端到端自动驾驶:从GTC‘26看工程可信落地的核心逻辑

1. 项目概述:当算法工程师走进GTC26展厅,看到的不是芯片,而是“端到端”的呼吸节奏“端到端”这三个字,在GTC’26现场出现的频率,高得像NVLink带宽测试时的峰值曲线——它不再是一个论文里的技术路径选项,而…

2026/7/4 0:02:48阅读更多 →
缺牙修复科普:常见义齿类型与选择参考

缺牙修复科普:常见义齿类型与选择参考

缺牙修复科普:常见义齿类型与选择参考牙齿缺失是中老年人群中较为常见的口腔问题,不仅会造成咀嚼不便、进食受影响,长期还可能对营养摄入与日常社交带来困扰。义齿是改善缺牙问题的常用方式,目前市面上的义齿种类较多,…

2026/7/4 0:02:48阅读更多 →
STM32F091RC与LTC6904实现高精度方波信号生成

STM32F091RC与LTC6904实现高精度方波信号生成

1. 项目概述:LTC6904与STM32F091RC的精准方波生成方案在嵌入式系统开发中,精确的时钟信号和定时控制往往是项目成败的关键。LTC6904作为一款低功耗、高精度的可编程振荡器芯片,与STM32F091RC这款ARM Cortex-M0内核微控制器的组合,…

2026/7/4 0:02:48阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/4 1:16:56阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/4 2:33:55阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/4 2:33:55阅读更多 →