MySQL存储过程
  • [MySQL存储过程]MySQL存储过程写法总结
  • [MySQL存储过程]mysql存储过程详细教程
  • [MySQL存储过程]MySql 存储过程实例,附完整注释
  • [MySQL存储过程]MySQL 触发器的创建和使用总结
  • [MySQL存储过程]mysql创建存储过程
  • [MySQL存储过程]SQL存储过程学习(一)
  • [MySQL存储过程]MySQL存储过程中的WHILE循环,LOOP循环以及REPEAT循环3种循环
  • [MySQL存储过程]MySQL 创建主键,外键和复合主键的语句
  • [MySQL存储过程]MySQL 文本文件的导入导出数据的方法
  • [MySQL存储过程]MySQL下将一个表的数据插入到另外一个表的实现语句
  • [MySQL存储过程]MySQL遭遇DELETE误操作的回滚解决方法
  • 直达腾讯云服务器
    腾讯云服务器,数据库,短信等热销产品限量秒杀;新购爆款3折起;
    腾讯云数据库MySQL入门机型仅12元/月
    腾讯云云服务器新购特惠,最低2折起,1核1G3年仅794.73元,即0.73元/日。
    腾讯云国际顶级CA机构SSL证书8.8折,云解析买一年最高送半年!
    腾讯云为数百万企业和开发者提供安全、稳定的云服务器、云数据库、CDN等云服务
    腾讯云服务器安全可靠高性能,多种配置供您选择
    腾讯云数据库性能卓越稳定可靠,为您解决数据库运维难题
    阿里云服务器入口
    180天免费用腾讯云服务器马上领取
    您当前位置:狗鱼MySQL教程 >> MySQL存储过程 >> MySQL遭遇DELETE误操作的回滚解决方法
    MySQL遭遇DELETE误操作的回滚解决方法
    更新日期: 2018年06月05日 来源: 本站原创 作者: 佚名 阅读:
    上一篇MySQL下将一个表的数据插入到另外一个表的实现语句 下一篇:没有了
    Mysql遭遇DELETE误操作的回滚解决方法
     

    方法:

    条件:开启Binlog,Format为Row。

    步骤:

    1.通过mysql自带工具mysqlbinlog 指定导出操作的记录:

    
     
    1. mysqlbinlog
    2. --no-defaults
    3. --start-datetime='2012-12-25 14:56:00'
    4. --stop-datetime='2012-12-25 14:57:00'
    5. -vv mysql-bin.000001 > /home/zhoujy/restore/binlog.txt

    2.数据取出来之后,需要把数据解析反转,原始数据:

    
     
    1. ### DELETE FROM test.me_info
    2. ### WHERE
    3. ### @1=2165974 /* INT meta=0 nullable=0 is_null=0 */
    4. ### @2='1984:03:17' /* DATE meta=0 nullable=1 is_null=0 */
    5. ### @3=NULL /* DATE meta=765 nullable=1 is_null=1 */
    6. ### @4=2012-10-25 00:00:00 /* DATETIME meta=0 nullable=0 is_null=0 */
    7. ### @5='' /* VARSTRING(765) meta=765 nullable=1 is_null=0 */
    8. ### @6=0 /* TINYINT meta=0 nullable=1 is_null=0 */
    9. ### @7='' /* VARSTRING(765) meta=765 nullable=1 is_null=0 */
    10. ### @8=-1 (4294967295) /* INT meta=0 nullable=1 is_null=0 */
    11. ### @9=0 /* MEDIUMINT meta=0 nullable=1 is_null=0 */
    12. ### @10=NULL /* MEDIUMINT meta=0 nullable=1 is_null=1 */
    13. ### @11=2 /* TINYINT meta=0 nullable=1 is_null=0 */
    14. ### @12=0 /* TINYINT meta=0 nullable=1 is_null=0 */
    15. ### @13='' /* VARSTRING(765) meta=765 nullable=1 is_null=0 */
    16. ### @14='' /* VARSTRING(765) meta=765 nullable=1 is_null=0 */
    17. ### @15=0 /* MEDIUMINT meta=0 nullable=1 is_null=0 */
    18. ### @16=320 /* INT meta=0 nullable=1 is_null=0 */
    19. ……………………
    20. ……………………
    21. ……………………

    Row格式的binlog记录的格式如上面所示,需要做的工作就是吧Delete的操作转换成Insert操作,发上面的都是有一定规律的,并且需要注意的是:

    1、字段类型 DATETIME 日期。在日志中保存的格式为 @4=2012-10-25 00:00:00,需要将2012-10-25 00:00:00加上引号。

    2、负数。在日志中保存的格式为 @1=-1 (4294967295), -2(4294967294),-3(4294967293),需要将()里面的数据去掉,只保留@1=-1。

    3、转义字符集。如:'s,/,等。

    上面3点清楚之后,可以写一个脚本(水平有限,在提升中,写的不好看):

    
     
    1. #!/bin/env python
    2. # -*- encoding: utf-8 -*-
    3. #-------------------------------------------------------------------------------
    4. # Name: restore.py
    5. # Purpose: 通过Binlog恢复Delete误操作数据
    6. # Author: zhoujy
    7. # Created: 2012-12-25
    8. # update: 2012-12-25
    9. # Copyright: (c) Mablevi 2012
    10. # Licence: zjy
    11. #-------------------------------------------------------------------------------
    12. def read_binlog(file,column_num):
    13. f=open(file)
    14. num = '@'+str(column_num)
    15. while True:
    16. lines = f.readline()
    17. if lines.strip()[0:3] == '###':
    18. lines=lines.split(' ',3)
    19. if lines[1] == 'DELETE' and lines[2] =='FROM': #该部分替换Delete为Insert
    20. lines[1] = "INSERT"
    21. lines[2] = 'INTO'
    22. lines[-1] = lines[-1].strip()
    23. if lines[1].strip() == 'WHERE':
    24. lines[1] = 'VALUES ('
    25. if ''.join(lines).find('@') <> -1 and lines[3].split('=',1)[0] <> num: #num为列数,要是小于最大的列数,后面均加,
    26. lines[3] = lines[3].split('=',1)[-1].strip()
    27. if lines[3].strip('/'').strip().find('/'') <> -1:
    28. lines[3] = lines[3].split('/*')[0].strip('/'').strip().strip('/'').replace('//','').replace('/'','///'') #这里过滤掉转义的字符串
    29. lines[3] = '/'' + lines[3] + '/','
    30. elif lines[3].find('INT meta') <> -1: #过滤Int类型的字段为负数后带的(),正数不受影响
    31. lines[3] = lines[3].split('/*')[0].strip()
    32. lines[3] = lines[3].split()[0] + ','
    33. elif lines[3].find('NULL') <> -1:
    34. lines[3] = lines[3].split('/*')[0].strip()
    35. lines[3] = lines[3] + ','
    36. else:
    37. lines[3] = lines[3].split('/*')[0].strip('/'').strip().strip('/'').replace('//','').replace('/'','///'') #这里过滤掉转义的字符串
    38. lines[3] = '/'' + lines[3].strip('/''' ') + '/','
    39. if ''.join(lines).find('@') <> -1 and lines[3].split('=',1)[0] == num: #num为列数,要是小于最大的列数,后面均加);
    40. lines[3] = lines[3].split('=',1)[-1].strip()
    41. if lines[3].find('/'') <> -1:
    42. lines[3] = lines[3].split('/*')[0].strip('/'').strip().strip('/'').replace('//','').replace('/'','///'') #同上
    43. lines[3] = '/'' + lines[3] + '/');'
    44. elif lines[3].find('INT meta') <> -1: #同上
    45. lines[3] = lines[3].split('/*')[0].strip()
    46. lines[3] = lines[3].split(' ')[0] + ');'
    47. elif lines[3].find('NULL') <> -1:
    48. lines[3] = lines[3].split('/*')[0].strip()
    49. lines[3] = lines[3] + ');'
    50. else:
    51. lines[3] = lines[3].split('/*')[0].strip('/'').strip().strip('/'').replace('//','').replace('/'','///'') #同上
    52. lines[3] = '/'' + lines[3].strip('/''' ') + '/');'
    53. print ' '.join(lines[1:])
    54. if lines == '':
    55. break
    56. if __name__ == '__main__':
    57. import sys
    58. read_binlog(sys.argv[1],sys.argv[2])

    执行脚本:

    python restore.py binlog.txt 36 > binlog.sql

    命令行中的36 表示 需要还原的表的字段有36个,效果:

    
     
    1. INSERT INTO test.me_info
    2. VALUES (
    3. 2123269,
    4. '1990:11:12',
    5. NULL,
    6. 2,
    7. '',
    8. 0,
    9. '',
    10. -1,
    11. 0,
    12. 340800,
    13. 1,
    14. 0,
    15. '',
    16. ……
    17. ……
    18. 1,
    19. NULL
    20. );

    最后还原:

    mysql test < binlog.sql

     

    感觉本站内容不错,读后有收获?

    我要小额赞助,鼓励提供更好的内容教程

    上一篇MySQL下将一个表的数据插入到另外一个表的实现语句 下一篇:没有了
    Copyright 2013-2017 Powered by 狗鱼MySQL教程,All Rights Reserved.
    广州相如计算机科技有限有限公司 版权所有 粤ICP备08130661号-4
    售前咨询:020-38667011 手机:13711588918