mysql 误删除数据恢复

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文件语句确认没有问题,执行语句即可恢复删除数据

猜你喜欢

转载自blog.csdn.net/weiwangsisoftstone/article/details/68945420