使用 mysqlbinlog 分析 binlog 恢复误删除或修改的数据

Posted 小毕超

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 mysqlbinlog 分析 binlog 恢复误删除或修改的数据相关的知识,希望对你有一定的参考价值。

一、mysqlbinlog

在 mysql 中binlog 记录着所有的DDL 和 DML,前提是开启了 binlog,这个时候如果我们误删除了数据或者误修改了数据,就可以通过 binlog 日志文件进行查找恢复。但是 binlog 是以二进制的方式进行存储的,我们直接查看的话并不能看到我们想要的数据,而 mysqlbinlog 就是提供给我们方便查询binlog的工具,我们借助它可以根据时间段或者位置进行快速定位,并且还可以连接远程服务器的 mysql 查看 binlog 信息。

首先在开始实验前,请确保自己的mysql 已经开启了 binlog ,这里我配置的 binlog 的格式为 ROW 模式。

查看是否开启 binlog:

show variables like '%log_bin%';


查看 binlog 输出格式:

show variables like '%binlog_format%';


上面开启好,就可以进行下面的实验了。

二、误删除修改数据恢复

环境准备

首先新建一张表,下面基于该表进行实验:

CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `phone` varchar(255) DEFAULT NULL,
  `mail` varchar(255) DEFAULT NULL,
  `lock` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

首先向表中添加几条数据:

INSERT INTO `testdb`.`user`(`name`, `phone`, `mail`, `lock`) VALUES ('zhangsan', '110', '110@qq.com', '0');
INSERT INTO `testdb`.`user`( `name`, `phone`, `mail`, `lock`) VALUES ('lisi', '111', '111@qq.com', '0');
INSERT INTO `testdb`.`user`(`name`, `phone`, `mail`, `lock`) VALUES ('wangwu', '112', '112@qq.com', '0');
INSERT INTO `testdb`.`user`(`name`, `phone`, `mail`, `lock`) VALUES ('xiaoming', '113', '113@qq.com', '0');

首先查看下当前正在写入的 binlog 文件:

show master status;

也可以查看下当前有多少个 binlog 日志文件了:

show binary logs;

数据误修改

将 zhangsan 和 lisi 的phone 和 mail 修改为 001:

下面在 SQL 控制台查看下 binlog 信息:

show binlog events in 'binlog.000002';

这样还不能看出刚才修改前的内容,下面就要使用 mysqlbinlog 工具进行分析了,首先进入到 binlog 日志的位置,我们根据时间点过滤下:

mysqlbinlog --no-defaults --base64-output=decode-rows -v --start-datetime="2022-03-13 19:00:00" --stop-datetime="2022-03-13 19:10:00" ./binlog.000002 

其中 --no-defaults 表示不使用配置文件中( my.cnf 里配的 [client] )的参数,可以避免有些 mysqlbinlog 没有的参数导致的失败,--base64-output=decode-rows 解码方式,不加的话看到的是 base64 之后的,-v 显示sql 语句,也可以 -vv 显示sql语句和类型,--start-datetime--stop-datetime 表示开始和结束时间,或者使用 --start-position--stop-position 表示起始位置,如果是解析多个 binlog,则 --start-position 只对第一个 binlog 生效,--stop-position 只对最后一个 binlog 生效。


从这里就看到了修改前的数据,也可以将结果输出到文件中,使用 -r 即可:

mysqlbinlog --no-defaults --base64-output=decode-rows -v --start-datetime="2022-03-13 19:00:00" --stop-datetime="2022-03-13 19:10:00" ./binlog.000002 -r log.txt


数据误删除

误删除和上面同样的操作方式,下面将 wangwu 和 xiaoming 的数据进行删除:

再次使用 mysqlbinlog 进行分析:

mysqlbinlog --no-defaults --base64-output=decode-rows -v --start-datetime="2022-03-13 19:18:00" --stop-datetime="2022-03-13 19:20:00" ./binlog.000002


同样找到了修改前的数据:

三、扩展

远程查看 binlog:

mysqlbinlog -u root -p root -h 192.168.0.1 -P 3306 --no-defaults --base64-output=decode-rows -v --start-datetime="2022-03-13 18:08:00" --stop-datetime="2022-03-13 18:10:00" ./binlog.000001 > test2.sql

条件筛选

mysqlbinlog --base64-output=decode-rows  -v --no-defaults --database=raceEnroll  binlogs.000078 |grep zhangsan |more

以上是关于使用 mysqlbinlog 分析 binlog 恢复误删除或修改的数据的主要内容,如果未能解决你的问题,请参考以下文章

mysql中如何用mysqlbinlog工具将日志文件生成txt文件出来分析

技术分享 mysqlbinlog 技巧

mysqlbinlog 使用简介

binlog分析方法

Mysql Binlog三种格式介绍及分析

Mysql Binlog 三种格式介绍及分析