当前位置:首页 >  站长 >  数据库 >  正文

手滑 DELETE 忘了 WHERE?binlog 十分钟找回误删数据

 2026-08-28 14:52  来源: 互联网   我来投稿 撤稿纠错

  一键部署OpenClaw

DBA 圈流传一句话:没删过库的人生不完整。但删了能找回来,才是真本事。误删数据的救命稻草就是 binlog——它记录了每一行数据的变更,既能用来恢复,也能反查哪条语句闯的祸。前提是提前开了 log-bin,没开的话神仙难救,所以第一件事去检查配置。

SHOW VARIABLES LIKE 'log_bin'; -- 值为ON才有救
SHOW BINARY LOGS; -- 看有哪些日志文件
SHOW BINLOG EVENTS IN 'mysql-bin.000124' LIMIT 20; -- 快速浏览内容

误删场景分两种。第一种:DELETE 误删了部分行。思路是从 binlog 里把删除前的旧值反解出来。用 mysqlbinlog 工具导出可读格式:

# 先确定误删语句的时间范围,导出这段
mysqlbinlog --no-defaults \
--start-datetime='2026-08-26 09:00:00' \
--stop-datetime='2026-08-26 09:30:00' \
--database=site_db \
/var/lib/mysql/mysql-bin.000124 > /tmp/binlog_误删.sql

# ROW格式下能看到被删的完整行
grep -B2 -A2 '### DELETE FROM' /tmp/binlog_误删.sql | head -40

ROW 格式的 binlog 里,DELETE 事件的 WHERE 部分就是被删掉的那行数据原值,把它改写成 INSERT 语句重放回去,数据就回来了。量大的话写脚本批量转换,量小手工改几条也快。

第二种更惨:整表 DROP 或 TRUNCATE。binlog 里没有旧值,只能靠备份恢复——从最近一次 mysqldump 恢复全量,再用 binlog 把备份时点到误操作之间的增量重放。这也解释了为什么备份和 binlog 缺一不可:备份是底,binlog 是增量。

# 恢复流程:全量 + 增量
gunzip < site_db_2026-08-25_0300.sql.gz | mysql -uroot -p site_db
mysqlbinlog --start-datetime='2026-08-25 03:00:00' \
--stop-datetime='2026-08-26 09:05:00' \
mysql-bin.00012[3-4] | mysql -uroot -p site_db

两个保命习惯:一,恢复操作先在测试库演练,确认无误再动生产;二,恢复前把当前库再备份一份,防止恢复过程引入新事故。另外线上执行 DELETE 或 UPDATE 前,先把 WHERE 单独跑一遍 SELECT 数行数,这个习惯比任何工具都靠谱。(数据来源:MySQL官方手册)

申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!

相关标签
php教程
数据恢复

相关文章

  • 页面白屏不报错?把 PHP 的错误日志配明白,排错效率翻倍

    线上环境出于安全把错误显示关了,这是对的——报错信息暴露路径给攻击者等于送情报。但代价是出了问题页面上啥都没有,只剩白屏。正确姿势是:页面上不显示,错误全部落日志。;php.ini生产环境错误处理四件套display_errors=Off;页面不显示错误log_errors=On;错误写日志erro

    标签:
    php教程
  • 定时任务还在页面里套 include?cron + PHP CLI 才是正路

    见过不少老站的处理方式:写个task.php,靠别人挂个监控或者用JS定时刷来触发,更狠的是每次有人访问首页顺带跑一遍统计。这些歪招的共同问题是不可控——没人访问就不跑,被搜索引擎高频抓取就狂跑。定时任务就该交给系统的cron。PHP从命令行跑有个专属的SAPI叫CLI,和网页那套php-fpm是两

    标签:
    php教程
  • PHP-FPM 进程池参数怎么算?内存除法题,算错就 502

    后台传个30MB的视频或者8MB的主题包,进度条走到一半报错,或者干脆显示上传成功但文件不存在。这类问题的根源九成是PHP的上传限制,而且牵一发动全身——不是改一个参数就完事,得三个一起改。;php.ini上传相关三件套upload_max_filesize=64M;单个文件最大体积post_max

    标签:
    php教程
  • 服务器磁盘天天告警?八成是日志没轮转,logrotate 十分钟配好

    有个经典事故:网站跑了半年突然全挂,查半天发现是磁盘满了,罪魁祸首是access.log涨到了80GB。日志不管理,等于给服务器埋了个定时炸弹。Linux自带的logrotate就是干这个的,大多数发行版装完就有,不用额外装任何东西。logrotate的思路很简单:按你定的周期把当前日志改名存档,压

  • 网站突然 502:别急着重启,顺着这条链路查五分钟定位

    半夜收到监控告警,打开网站一片502BadGateway。很多人的第一反应是重启服务器,运气好恢复了,运气不好过一小时又来。502的本质就一句话:Nginx活着,但后面的PHP-FPM或者上游服务没应答或拒绝连接。顺着这条链路查,比乱重启快得多。第一步看PHP-FPM进程在不在。psaux|grep

    标签:
    php教程

热门排行

信息推荐