不能直接靠binlog恢复被勒索加密的数据库,因其只记录sql语句而不记录文件级加密行为;勒索病毒直接加密.ibd、.frm等物理文件,该操作不写入binlog。

不能直接靠 binlog 恢复被勒索加密的数据库——binlog 只记录 SQL 语句(如 DROP DATABASE、DELETE FROM),不记录文件级加密行为;勒索病毒通常绕过 MySQL 协议,直接篡改或加密磁盘上的 .ibd、.frm 文件,这类操作根本不会写入 binlog。
确认 binlog 是否还可用,先查三件事
别急着执行恢复命令,先验证 binlog 本身是否可信、完整、未被覆盖:
-
SHOW VARIABLES LIKE 'log_bin';返回ON才说明功能启用,否则 binlog 根本不存在 -
SHOW BINARY LOGS;查看当前活跃日志列表,注意最新文件的File_size:如果全是几 KB,大概率已被清空或重置 -
mysqlbinlog --base64-output=DECODE-ROWS -v /path/to/mysql-bin.000001 | head -n 50看开头时间戳——若最早记录在勒索发生之后,说明日志已被轮转覆盖,无法回溯到删库前
用 mysqlbinlog 找 DROP 或 DELETE 的精确位置
勒索行为往往伴随批量 DROP DATABASE 或 TRUNCATE TABLE,这些会写入 binlog,但必须准确定位到“最后一条合法数据操作”之后、“第一条恶意操作”之前的位置:
- 用
grep -i -A 5 -B 5 "DROP\|TRUNCATE\|DELETE FROM.*WHERE" /tmp/binlog.sql快速筛出可疑语句(先用mysqlbinlog导出为文本) - 重点关注
# at 123456行——这是事件起始偏移量,--stop-position=123455就能卡在恶意操作前一毫秒 - 避免用时间范围(
--start-datetime)恢复:MySQL 服务器时间可能被篡改,且 binlog 写入有毫秒级延迟,容易切错
恢复时必须绕开已损坏的 MySQL 实例
勒索后原实例很可能已不可信(配置被改、账号被删、甚至 mysqld 进程被注入),强行在原库上执行 mysqlbinlog | mysql 风险极高:
- 优先在干净环境(新装 MySQL 容器或另一台机器)中重建库结构,再导入 binlog 内容
- 导出 binlog 时加
--no-defaults --skip-gtids --database=your_db,防止 GTID 冲突或跨库误写 - 恢复命令末尾不要加
-f(force),遇到报错立即停住——比如碰到重复主键或缺失外键,说明 binlog 不完整或中间有 DDL 被跳过 - 如果
mysqlbinlog报command not found,不是路径问题就是权限问题:/www/server/mysql/bin/mysqlbinlog这种绝对路径必须存在且可执行,检查ls -l /www/server/mysql/bin/mysqlbinlog
真正棘手的是:binlog 只能救回“被删的数据”,救不回“被加密的文件”。如果病毒直接加密了 /var/lib/mysql/your_db/ 下的物理文件,哪怕 binlog 完整,你也得先拿到未加密的表空间快照(如 LVM 快照、云盘快照)才能拼出可用数据。没有备份快照 + binlog 被覆盖 = 基本无解。











