MySQL误操作数据恢复的简单实践r11笔(记第67天)

  

  ,,前几天有个同事碰到了一个MySQL数据恢复的问题,他运行了一条更新语句,结果忘记了加的条件,结果等反应过来已经晚了。我简单确认了下,是否存在备份,没有,是否开启了日志,没有。所以这个恢复无从谈起。   

  

  ,,当然后来他也花了些功夫逐条数据修复,事情过去了,数据恢复的重要性,人为操作的重要性就不言而喻了,但是有些时间工作职责还是需要下移。我觉得还是需要好好总结下数据恢复的问题。我会从以下几个方面来谈。   

  目录   

     

  

     

  

     

  

     

     

  
  

  

  首先手工恢复数据,其实有一些思路,一种就是通过全备+ binlog的时间,偏移量来恢复。另外一类是通过解析binlog来恢复,前提条件是日志格式为行。我们来简单模拟解析binlog的恢复方式。   

     

     

     

  先看一看binlog的情况,可以看到当前的binlog是序号为15的日志文件。   

  

  比;显示二进制日志;
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
  | Log_name ,,,,,,,| File_size |
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
  | mysql-bin。000014 | 1073742219 |
  | mysql-bin。000015 |,998953054 |
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
  2行集(0.00秒)为了方便模拟,我们可以切换一下日志,刷新日志之后得到的日志情况如下:   

  

  比;显示二进制日志;
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
  | Log_name ,,,,,,,| File_size |
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
  | mysql-bin。000015 | 999120424 |
  | mysql-bin。000016 |,,,,,6722 |
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
  2行集(0.00秒)创建表测试   

  

  创建表的测试(int id不是null 主键,名字varchar(20),备忘录   varchar(50))引擎=InnoDB auto_increment=100默认字符集=utf8;插入几条数据   

  

  比;插入测试值(“name1”,“memo1”), (2, ' name2 ', ' memo2 '), (3“name3”“memo3”), (4‘name4 memo4), (5‘name5 memo5);
  查询好了,五行影响(0.00秒)
  记录:5,重复:0,警告:0查看一下数据的基本情况:   

  

  比;从测试;select *
  + - - - + - - - - - - - - - - - - - - + +
  | | id name | memo |
  + - - - + - - - - - - - - - - - - - - + +
  |,1 | name1 | memo1 |
  |,2 | name2 | memo2 |
  |,3 | name3 | memo3 |
  |,4 | name4 | memo4 |
  |,5 | name5 | memo5 |
  + - - - + - - - - - - - - - - - - - - + +为了测试方便,先标记一个时间戳祝辞,选择current_timestamp ();
  + - - - - - - - - - - - - - - - - - - - - - - - - +
  | | current_timestamp ()
  + - - - - - - - - - - - - - - - - - - - - - - - - +
  | 2017-02-06 04:14:33 |
  + - - - - - - - - - - - - - - - - - - - - - - - - +我们开始模拟DML的操作。   

  

  比;删除从测试在id (1,3);
  查询好,2行影响(0.01秒)   

  

  比;更新测试集备忘录='新' id在(2、4);
  查询好,2行影响(0.01秒)
  行匹配:2,改变:2,警告:0   

  

  比;插入测试值(6 ' name6 memo6);
  查询好了,1行影响(0.00秒)做完上面三个DML操作之后,我们标记一下时间。   

  

  比;选择current_timestamp ();
  + - - - - - - - - - - - - - - - - - - - - - - - - +
  | | current_timestamp ()
  + - - - - - - - - - - - - - - - - - - - - - - - - +
  | 2017-02-06 04:15:44 |
  + - - - - - - - - - - - - - - - - - - - - - - - - +下面我们来解读一下binlog,根据时间戳得到一个基本可读的日志,里面还有这些数据变更,但是语句和执行的还是有一些出入,我们直接拷贝一份binlog到/tmp目录下解析。   

  

  mysqlbinlog ——已- v start-datetime=" 2017-02-06 04:14:33 ",,   ——stop-datetime=" 2017-02-06 04:15:44 ",,/tmp/mysql-bin.000016   ——结果文件=/tmp/result.sql生成的文件result.sql内容如下,可以看到这些操作在binlog中都有了很详细的标记,数据的情况基本都是一目了然,更新的部分变化前变化后的数据都一览无余。其实DML中难度较大的就是更新,而插入、删除就是一个加减法。   

MySQL误操作数据恢复的简单实践r11笔(记第67天)