【分享】误删mysql某表数据,通过binlog日志进行数据恢复 【理解:binlog日志】记录的是mysql客户端对数据库server的修改操作,包括DML DDL语句 【时间】误删时大概是那个时间范围 【位置】查看binlog日志的位置及时那个日志文件 【输出】命令解密binlog日志,截取对应时间点日志记录并输出到文件(a.txt)
mysqlbinlog --no-defaults --base64-output=decode-rows -v -v --start-datetime="2020-11-11 16:46:50" --stop-datetime="2020-11-11 16:53:10" /application/mysql/data/mysql-bin.000043 >> /application/a.txt
【过滤并替换】暂分为2步: 第一步:过滤非DELETE操作的文本输出到b.txt文件 命令:
sed -n '/### DELETE FROM `mes`.`prod_line_sn`/,/COMMIT/p' a.txt >> b.txt
注: 1.注意命令中的引号; 2.mes为数据库名字; 3.prod_line_sn为表名
第二步:多次过滤,并将delete语句替换为insert语句,得到数据库可直接执行的sql文件 命令:
cat b.txt | sed -n '/###/p' | sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/SELECT/g;' | sed -r 's/(@23.*),/\1;/g' | sed 's/@[0-9][0-9]=//g' | sed 's/@[1-9]=//g' > source.sql
注: 1.@23代表当前表最大列的数量; 2.@[0-9][0-9]过滤两位列的字符(第10列-第99列); 3.@[0-9]过滤一位列的字符(第1列-第9列)
【恢复】 1,登录mysql数据库,mysql /source文件目录/source.sql 2,通过数据库操作工具,执行sql文件即可恢复
推荐使用:【数据误删闪回工具】 https://www.jb51.net/article/172030.htm
|