Mysql数据恢复-日志文件提取删除数据
如: 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中的内容,恢复成功.
- 本文标签: 其他
- 本文链接: https://www.jimmy2k.top/article/319
- 版权声明: 本文由JimmyZ的个人博客原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权