场景

遇到后台数据批量误删,需要进行数据恢复。

准备

1、确定需要恢复数据的时间段
2、查看是否开启了binlog
(1)终端执行命令,连接mysql

mysql -h地址 -P端口号 -u账号 -p

输入密码后回车即可连接成功


(2)执行如下命令,查看binlog日志是否开启

mysql> show variables like 'log_%';

log_bin如果为 ON 则为开启状态,如果开启了就可以继续操作了,如果没开启就GG

恢复数据

一、确认日志文件

查看下binlog日志列表

show master logs;

因为后台管理人员刚误删就反馈给我,00038 是最新的,所以确定我需要恢复的数据在 mysql-bin.000038 文件内。

也可以通过执行如下命令,查看文件最后一个操作事件 Position 结束点的值。

show master status;

二、导出日志文件

可以在终端工具中执行如下命令查看该文件内的内容,但是内容很多的情况下查看或者查询起来并不方便。

show binlog events in 'mysql-bin.000038'\G;

所以我们可以将该文件导出为 sql 或者 txt 文件:

1、进入到mysql的bin目录下:

// 这个是我使用宝塔的路径cd /www/server/mysql/bin

2、生成 sql 文件:

1、全部导出./mysqlbinlog --set-charset=utf8 /www/server/data/mysql-bin.000038 > tmp.sql;2、指定一个时间区间来导出./mysqlbinlog --base64-output=decode-rows -v --database=数据库名 --start-datetime="2021-12-04 16:50:00" --stop-datetime="2021-12-04 17:10:10" /www/server/data/mysql-bin.000038 > tmp.sql

3、下载生成的 sql 文件:

可以在刚刚执行命令的目录下看到生成的 sql 文件:


根据查看导出的 sql 文件,精准确定是哪一步执行的删除语句,然后记录好时间区间和 pos 点的区间,进行如下的数据恢复。

二、根据文件恢复数据
1、按pos点./mysqlbinlog --start-position=开始点 --stop-position=结束点 --database=数据库 /binlog路径/mysql-bin.000001 | ./mysql -u用户名 -p密码 -v 数据库2、按时间./mysqlbinlog--start-datetime="2022-12-30 10:00:00" --stop-datetime="2022-12-30 18:00:00" --database=demo5_p2p7_cn /www/server/data/mysql-bin.000038 | ./mysql -uroot -p12345 -v datebase;例子:./mysqlbinlog --stop-position=6731921 --database=demo5_p2p7_cn /www/server/data/mysql-bin.000038 | ./mysql -uroot -p12345 -v datebase;

命令执行完成后,即可完成数据的恢复。

PS:我是直接通过导出的 sql 文件进行恢复的,数据量少可以这样操作,数据量大还是需要根据 pos 点或者时间区间进行恢复