简单记录几条命令通过mysql的binlog日志进行删除数据的恢复

1.先把mysql的binlog日志上传或下载到linux机器中

2.找到大致删除时间,越具体越好,确定恢复时间后查看文件内容

mysqlbinlog --no-defaults mysql-bin.023036 --start-datetime="2024-07-24 16:43:00.899" --stop-datetime="2024-07-24 16:45:00.899" > a1.txt

参数说明:

-vv 转换二进制内容

--start-datetime  起始时间

--stop-datetime  终止时间

--start-position 起始位置

--stop-position 终止位置

3.起始位置和终止位置根据实际情况进行选择一般是两个BEGIN之间的,如果为了保险可以多一些后面在进行过滤也是可行的

比如本次我需要的stock_bill已经包含在内了

起始位置:438978580  终止位置438978816

mysqlbinlog --no-defaults -vv --base64-output=decode-rows  --start-position='438978389' --stop-position='438997498' mysql-bin.023036 >a2.txt

binlog日志恢复_mysql

binlog日志恢复_字段_02

查看a2.txt文件的信息

binlog日志恢复_sed_03

4.格式处理,只过滤本次需要的信息,本次过滤后文件中只包含DELETE的删除信息了

通过查看上面的文件或者查看设计表看到字段的个数

此处的A65为字段长度+1

grep -A65 'DELETE FROM `erp_biz_1`.`stock_bill`' a2.txt >a3.txt

5.将删除语句更改为插入语句,产出的文件可执行在库中执行

cat a3.txt  |sed -n '/###/p'| sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/SELECT/g;' |sed -r 's/(@65.*),/\1;/g' | sed 's/@[1-9]=//g' | sed 's/@[1-9][0-9]=//g'  > a4.txt