无法直接恢复被删的表,只能通过row格式binlog重建表结构并回放drop前最后一笔事务的行事件;前提为log_bin=on、binlog_format=row且binlog未过期。

不能直接“恢复被删的表”,只能重建表结构后,把 DROP TABLE 前最后一刻的行数据捞回来。前提是 binlog 开启、格式为 ROW、且日志尚未过期——这三点缺一不可。
确认 binlog 是否满足闪回前提
误删后第一件事不是翻日志,而是验证 binlog 能不能用:
-
SHOW VARIABLES LIKE 'log_bin'必须返回ON;如果显示OFF,这条路直接中断 -
SHOW VARIABLES LIKE 'binlog_format'必须是ROW;MIXED或STATEMENT无法提取具体被删的行 -
SHOW VARIABLES LIKE 'expire_logs_days'要大于误删发生至今的天数;否则DROP对应的 binlog 已被自动清理 -
SHOW BINARY LOGS查看当前有哪些 binlog 文件;再用SHOW MASTER STATUS确认最新写入位置,避免解析已轮转掉的日志
常见坑:log-bin=mysql-bin(注意是短横线)必须写在 [mysqld] 段下,SET GLOBAL log_bin = 'ON' 会报错——这是只读变量,改了也白改。
定位 DROP TABLE 的精确位置和时间点
别指望 mysqlbinlog 自动标出“这里删了表”,得手动 grep 定位:
- 先找
DROP语句:mysqlbinlog --no-defaults --base64-output=DECODE-ROWS -v /var/lib/mysql/mysql-bin.000012 | grep -A5 -B5 "DROP TABLE.*t_user" - 记下该事件的
end_log_pos(比如123456),这是DROP结束的位置 - 再往前查这张表最后一次变更:
mysqlbinlog --no-defaults --base64-output=DECODE-ROWS -v --stop-position=123456 /var/lib/mysql/mysql-bin.000012 | grep -A3 -B3 "t_user" - 重点锁定
BEGIN到COMMIT之间的完整事务段——你要恢复的,就是这个事务里所有对t_user的行事件
注意:DROP TABLE 本身不产生 WRITE_ROWS,但前面那个事务里的 INSERT/UPDATE 才是你真正要的数据快照。
提取并重放 DROP 前最后一个事务的行事件
闪回不是“撤销 DROP”,而是把 DROP 前最后一笔事务里的所有变更,用反向逻辑重新执行一遍:
- 用位置切出目标事务:
mysqlbinlog --no-defaults --start-position=98765 --stop-position=123456 /var/lib/mysql/mysql-bin.000012 > /tmp/t_user_pre_drop.sql - 这份输出含大量注释和 session 设置,不能直接
source;需清洗成纯INSERT IGNORE语句(可用脚本或sed过滤) - 手动重建表结构:
CREATE TABLE t_user (id INT, name VARCHAR(20), ...);务必确保字段类型、字符集、引擎与原表一致 - 导入前加
SET FOREIGN_KEY_CHECKS = 0;和SET UNIQUE_CHECKS = 0;,避免约束中断导入
关键细节:mysqlbinlog 默认不校验 checksum,若日志损坏可能静默跳过错误段;大文件解析时建议加 2>/dev/null 屏蔽警告,防止干扰 grep 匹配。
没有 binlog 或备份时的最后手段
如果 log_bin = OFF,或者 binlog 已过期,就得依赖文件系统级抢救:
- 立刻停止 MySQL 服务,禁止任何写入;否则
.ibd文件占用的磁盘块会被覆盖 - 检查是否还有连接持有旧文件句柄:
lsof -p $(pgrep mysqld) | grep deleted;若有,说明数据仍可读,可尝试从/proc/PID/fd/下拷出 - 用
undrop-for-innodb扫描磁盘:./stream_parser -f /dev/sdb1(针对裸设备)或直接扫ibdata1和残留.ibd - 工具能恢复出表结构(需配合
sys_tables解析)和行数据,但字段类型、索引、外键等需人工补全
这种恢复方式成功率高度依赖误删后是否及时停写、磁盘碎片程度,以及表是否启用 innodb_file_per_table——很多线上环境没开这个,ibdata1 里混着多张表,恢复难度指数级上升。











