原创

Mysql数据恢复-日志文件提取删除数据

温馨提示:
本文最后更新于 2024年06月12日,已超过 2 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

如:  delete from tmp where area_code like '%05%'

马上进入mysql,输入以下命令

mysql> FLUSH LOGS;

重新创建新的日志文件mysql-bin.000002, 则误删的记录就保留在旧日志文件mysql-bin.000001中

cp /app/mysql/data/mysql-bin.000001 /opt/tmp

mysqlbinlog \

--start-datetime="2019-10-24 17:10:00" \

--stop-datetime="2019-10-24 17:20:00" \

--base64-output=decode-rows \

--result-file=deldata.txt \

-v /app/mysql/data/mysql-bin.000001

 

4. 去除不相关的内容:根据关键字: DELETE FROM `yqy_show`.`tmp_citypb`

注意: grep -A 9中的9代表误删表的字段总数+1的值,如上图,我的表中8个字段;若此数值过大或过小,数据会有误差,如用50,,则需长时间导出数据,同时导出的数据会多了些无用数据,若此数据过小,数据会不完整.

grep -A 9 "DELETE FROM \`yqy_show\`.\`tmp_citypb\`" ./deldata.txt > 201910.txt

 

cat 201910.txt  //提取的部分数据如下

### DELETE FROM `yqy_show`.`tmp_citypb`

### WHERE

###   @1=1

###   @2=20186

###   @3=20

###   @4='杭州市'

###   @5='0571'

###   @6='SYS_CITY'

###   @7=1210

###   @8=121015

5. 创建数据导出脚本bintosql.sh,若有字段含有时间戳, 即类型为: timestamp,假设第3个字段为时间戳, 需用函数FROM_UNIXTIME()转换.若没有时间戳字段,将以下的14,15行注释掉就好.

注: 脚本内,两个:$col -le 8 中的8 ,为该表的8个字段总数.

filename=$1

tabname=$2

fpath=/opt/tmp

insertsql=$fpath/$tabname".sql"

cat $fpath/$filename|grep "###   @" > $tabname.tmp

s1="INSERT INTO \`yqy\`.\`$tabname\` VALUES"

line_str=""

while read line

do

col=`echo "$line" | awk -NF "=" '{print $1}' | sed 's/###   @//g'`

val=`echo "$line" | awk -NF "=" '{print $2}'`

if [[ $col -eq 1 ]]; then

line_str="("$val

# elif [[ $col -eq 3 ]]; then

# line_str=$line_str",FROM_UNIXTIME("$val")"

elif [[ $col -le 8 ]]; then

line_str=$line_str","$val

fi

 

if  [[ $col -eq 8 ]]; then

line_str=$line_str"),"

s1=$s1$line_str

fi

done < $tabname.tmp

#echo $s1|sed 's/.$//'

s2=`echo $s1|sed 's/.$//'`

#echo $s2

echo $s2";" > $insertsql

7. 提取deldata.txt中的误删数据,将自动生成insert sql脚本(如下则生成sql脚本:201910.sql)

sh /opt/tmp/bintosql.sh 201910.txt 201910

8. 在查询编辑器中,执行201910.sql中的内容,恢复成功.

 

 

正文到此结束