mysql 误删除数据恢复

小鱼儿 2022-06-18 08:19 519阅读 0赞

mysql 误删除数据恢复
1.首先确认误删除了那些表的数据以及什么时间执行的删除操作
2.根据上面的时间去mysql服务器下载二进制日志
3.把下载的二进制日志文件上传到本地数据库服务器上,执行如下命令分析
mysqlbinlog —no-defaults -v -v —base64-output=DECODE-ROWS —start-datetime=”2017-04-01 00:00:00” —stop-datetime=”2017-04-01 00:18:50” /home/mysqldata/mysql-bin.000561 >rmdata.txt
mysqlbinlog —no-defaults -v -v —base64-output=DECODE-ROWS /home/mysqldata/mysql-bin.000562 >rmdata.txt
--start-datetime 开始时间
--stop-datetime 结束时间
4.提取相应表的删除语句
sed -n ‘/DELETE FROM `xxx`.`table_name`/,/@15=/{p}‘ rmdata.txt >tablename.txt
@15表中的最后一个字段
5.提取的delete语句转换成相应的insert语句
python recover.py tablename.txt 25 > tablename.sql
命令行中的25 表示 需要还原的表的字段有25个
recover.py 脚本内容如下(网上找的)
#!/bin/env python
# -*- encoding: utf-8 -*-
#———————————————————————————————————————-
# Name: recover.py
# Purpose: 通过Binlog恢复Delete误操作数据
# Author:
# Created:
# update:
# Copyright:
# Licence:
#———————————————————————————————————————-
def read_binlog(file,column_num):
f=open(file)
num = ‘@’+str(column_num)
while True:
lines = f.readline()
if lines.strip()[0:3] == ‘###‘:
lines=lines.split(‘ ‘,3)
if lines[1] == ‘DELETE’ and lines[2] ==’FROM’: #该部分替换Delete为Insert
lines[1] = “INSERT”
lines[2] = ‘INTO’
lines[-1] = lines[-1].strip()
if lines[1].strip() == ‘WHERE’:
lines[1] = ‘VALUES (‘
if ‘’.join(lines).find(‘@’) <> -1 and lines[3].split(‘=’,1)[0] <> num: #num为列数,要是小于最大的列数,后面均加,
lines[3] = lines[3].split(‘=’,1)[-1].strip()
if lines[3].strip(‘\‘’).strip().find(‘\‘’) <> -1:
lines[3] = lines[3].split(‘/*‘)[0].strip(‘\‘’).strip().strip(‘\‘’).replace(‘\\‘,’’).replace(‘\‘’,’\\\‘’) #这里过滤掉转义的字符串
lines[3] = ‘\‘’ + lines[3] + ‘\‘,’
elif lines[3].find(‘INT meta’) <> -1: #过滤Int类型的字段为负数后带的(),正数不受影响
lines[3] = lines[3].split(‘/*‘)[0].strip()
lines[3] = lines[3].split()[0] + ‘,’
elif lines[3].find(‘NULL’) <> -1:
lines[3] = lines[3].split(‘/*‘)[0].strip()
lines[3] = lines[3] + ‘,’
else:
lines[3] = lines[3].split(‘/*‘)[0].strip(‘\‘’).strip().strip(‘\‘’).replace(‘\\‘,’’).replace(‘\‘’,’\\\‘’) #这里过滤掉转义的字符串
lines[3] = ‘\‘’ + lines[3].strip(‘\‘’’ ‘) + ‘\‘,’
if ‘’.join(lines).find(‘@’) <> -1 and lines[3].split(‘=’,1)[0] == num: #num为列数,要是小于最大的列数,后面均加);
lines[3] = lines[3].split(‘=’,1)[-1].strip()
if lines[3].find(‘\‘’) <> -1:
lines[3] = lines[3].split(‘/*‘)[0].strip(‘\‘’).strip().strip(‘\‘’).replace(‘\\‘,’’).replace(‘\‘’,’\\\‘’) #同上
lines[3] = ‘\‘’ + lines[3] + ‘\‘);’
elif lines[3].find(‘INT meta’) <> -1: #同上
lines[3] = lines[3].split(‘/*‘)[0].strip()
lines[3] = lines[3].split(‘ ‘)[0] + ‘);’
elif lines[3].find(‘NULL’) <> -1:
lines[3] = lines[3].split(‘/*‘)[0].strip()
lines[3] = lines[3] + ‘);’
else:
lines[3] = lines[3].split(‘/*‘)[0].strip(‘\‘’).strip().strip(‘\‘’).replace(‘\\‘,’’).replace(‘\‘’,’\\\‘’) #同上
lines[3] = ‘\‘’ + lines[3].strip(‘\‘’’ ‘) + ‘\‘);’
print ‘ ‘.join(lines[1:])
if lines == ‘’:
break
if __name__ == ‘__main__‘:
import sys
read_binlog(sys.argv[1],sys.argv[2])

6.查看tablename.sql文件语句确认没有问题,执行语句即可恢复删除数据

发表评论

表情:
评论列表 (有 0 条评论,519人围观)

还没有评论,来说两句吧...

相关阅读