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