使用 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 恢复误删除或修改的数据的主要内容,如果未能解决你的问题,请参考以下文章