记一次mysql数据被恶意篡改的恢复
客户员工与客户公司产生了矛盾离职,离职的时候系统账号权限还未收回,此员工使用账号登录系统之后恶意篡改用户数据被发现。
系统本身做了mysql主从同步,但是因为是恶意篡改数据,对于程序和数据库而言其属于合理的操作范围,主从同步也会正常同步
目前系统有日志记录功能,不过日志记录只记录了用户修改时传入的参数,并未记录修改前的数据库记录(此处后续已加强,关键数据操作时日志要记录修改前的)
重要提示:上述行为是违法的,触发刑事责任,这个员工可能是个法盲,后续估计面临6个月以上的刑期。我看刑,有判头
因为知道mysql有binlog,因此第一时间去服务器查看binlog文件,还好还没过期(系统设置的binlog保留天数是最近7天),下面开始数据提取之路:
第一步复制出来相应日期的binlog文件到某个单独目录(也可以在binlog目录操作,不过不建议那样做)
cp mysql-bin.000078 /data/backup
第二步将binlog内容转为肉眼可见的SQL命令文件
因为之前我们设置的binlog记录模式是mixed,mixed模式是row模式和statement模式的混合体,所以提取的时候需要对命令做一个加强,提取binlog内容使用的是mysql自带的 mysqlbinlog命令
mysqlbinlog --no-defaults --base64-output=DECODE-ROWS --start-datetime='2022-09-16 10:20:00' -v mysql-bin.000078 > sql78_tmp.log
参数说明:
- --no-defaults 按照默认编码
- --base64-output=DECODE-ROWS 显示row模式的sql文,不加这个提取的sql文不完整
- --start-datetime 从某个时间段开始进行提取,当然也可以指定一个区间范围,可以增加--end-datetime
- -v 显示statement模式的sql文
-
将解析的内容输出到后续的文件中
执行完毕之后查看sql78_tmp.log即可看到解析之后的信息,然后根据关键字去搜索对应sql文执行记录即可。