加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_宿迁站长网 (https://www.0527zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

mysql中update误操作 利用binlog日志 模拟oracle闪回性能

发布时间:2022-06-25 04:30:01 所属栏目:MySql教程 来源:互联网
导读:对于update误操作,可以模拟oralce 的闪回功能,利用binlog日志,具体操作如下: mysql select * from test1; +------+---------+--------+ | dept | name | salary | +------+---------+--------+ | it | gaopeng | 100 | | it | yhb | 100 | | it | dzy | 10
  对于update误操作,可以模拟oralce 的闪回功能,利用binlog日志,具体操作如下:
  mysql> select * from test1;
  +------+---------+--------+
  | dept | name    | salary |
  +------+---------+--------+
  | it   | gaopeng |    100 |
  | it   | yhb     |    100 |
  | it   | dzy     |    100 |
  | uu   | yl      |    100 |
  | uu   | yl1     |    200 |
  | uu   | yl3     |    300 |
  +------+---------+--------+
  6 rows in set (0.05 sec)
  mysql> update test1 set name='test';
  Query OK, 6 rows affected (0.06 sec)
  Rows matched: 6  Changed: 6  Warnings: 0
  mysql> select * from test1;
  +------+------+--------+
  | dept | name | salary |
  +------+------+--------+
  | it   | test |    100 |
  | it   | test |    100 |
  | it   | test |    100 |
  | uu   | test |    100 |
  | uu   | test |    200 |
  | uu   | test |    300 |
  +------+------+--------+
  6 rows in set (0.00 sec)
  mysql> exit
  [root@localhost data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v -v db-bin.000016 |grep -B 15 'test'|more
  ps: grep -B 15 'test' 因为更改后的字段值为test,所以我们这里选test前15行和之后所有的数据.
 
  # at 384
  #150424 14:07:59 server id 199  end_log_pos 456 CRC32 0x7b4aabf1        Query   thread_id=2     exec_time=0     error_code=0
  SET TIMESTAMP=1429855679/*!*/;
  BEGIN
  /*!*/;
  # at 456
  #150424 14:07:59 server id 199  end_log_pos 510 CRC32 0x5f63d428        Table_map: `test`.`test1` mapped to number 74
  # at 510
  #150424 14:07:59 server id 199  end_log_pos 699 CRC32 0xf362ace6        Update_rows: table id 74 flags: STMT_END_F
  ### UPDATE `test`.`test1`
  ### WHERE
  ###   @1='it' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='gaopeng' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @3=100 /* INT meta=0 nullable=1 is_null=0 */
  ### SET
  ###   @1='it' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='test' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @3=100 /* INT meta=0 nullable=1 is_null=0 */
  ### UPDATE `test`.`test1`
  ### WHERE
  ###   @1='it' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='yhb' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @3=100 /* INT meta=0 nullable=1 is_null=0 */
  ### SET
  ###   @1='it' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='test' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @3=100 /* INT meta=0 nullable=1 is_null=0 */
  ### UPDATE `test`.`test1`
  ### WHERE
  ###   @1='it' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='dzy' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @3=100 /* INT meta=0 nullable=1 is_null=0 */
  ### SET
  ###   @1='it' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='test' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @3=100 /* INT meta=0 nullable=1 is_null=0 */
  ### UPDATE `test`.`test1`
  ### WHERE
  ###   @1='uu' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='yl' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @3=100 /* INT meta=0 nullable=1 is_null=0 */
  ### SET
  ###   @1='uu' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='test' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @3=100 /* INT meta=0 nullable=1 is_null=0 */
  ### UPDATE `test`.`test1`
  ### WHERE
  ###   @1='uu' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='yl1' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @3=200 /* INT meta=0 nullable=1 is_null=0 */
  ### SET
  ###   @1='uu' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='test' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @3=200 /* INT meta=0 nullable=1 is_null=0 */
  ### UPDATE `test`.`test1`
  ### WHERE
  ###   @1='uu' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='yl3' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @3=300 /* INT meta=0 nullable=1 is_null=0 */
  ### SET
  ###   @1='uu' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='test' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
 
 
  这就是我们需要的日志,捞取这部分数据
  [root@localhost data]# mysqlbinlog --no-defaults --base64-output=DECODE-ROWS -v -v db-bin.000016 | sed -n '/# at 510/,/COMMIT/p'>/root/1.txt
  ps:sed -n '/#at 510/,/COMMIT/p'   表示从选取'# at 510'开始,到第一个commit结束的内容,然后导到1.txt文件.
  捞取之后的文件如下:
  [root@localhost ~]# cat 1.txt
  # at 510
  #150424 14:07:59 server id 199  end_log_pos 699 CRC32 0xf362ace6        Update_rows: table id 74 flags: STMT_END_F
  ### UPDATE `test`.`test1`
  ### WHERE
  ###   @1='it' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='gaopeng' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @3=100 /* INT meta=0 nullable=1 is_null=0 */
  ### SET
  ###   @1='it' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='test' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @3=100 /* INT meta=0 nullable=1 is_null=0 */
  ### UPDATE `test`.`test1`
  ### WHERE
  ###   @1='it' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='yhb' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @3=100 /* INT meta=0 nullable=1 is_null=0 */
  ### SET
  ###   @1='it' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='test' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @3=100 /* INT meta=0 nullable=1 is_null=0 */
  ### UPDATE `test`.`test1`
  ### WHERE
  ###   @1='it' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='dzy' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @3=100 /* INT meta=0 nullable=1 is_null=0 */
  ### SET
  ###   @1='it' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='test' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @3=100 /* INT meta=0 nullable=1 is_null=0 */
  ### UPDATE `test`.`test1`
  ### WHERE
  ###   @1='uu' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='yl' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @3=100 /* INT meta=0 nullable=1 is_null=0 */
  ### SET
  ###   @1='uu' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='test' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @3=100 /* INT meta=0 nullable=1 is_null=0 */
  ### UPDATE `test`.`test1`
  ### WHERE
  ###   @1='uu' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='yl1' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @3=200 /* INT meta=0 nullable=1 is_null=0 */
  ### SET
  ###   @1='uu' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='test' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @3=200 /* INT meta=0 nullable=1 is_null=0 */
  ### UPDATE `test`.`test1`
  ### WHERE
  ###   @1='uu' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='yl3' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @3=300 /* INT meta=0 nullable=1 is_null=0 */
  ### SET
  ###   @1='uu' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @2='test' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
  ###   @3=300 /* INT meta=0 nullable=1 is_null=0 */
  # at 699
  #150424 14:07:59 server id 199  end_log_pos 730 CRC32 0x83588cbb        Xid = 44
  COMMIT/*!*/;
  [root@localhost ~]#
 
  现在开始对捞取的这部分数据进行转换,转换成能执行的sql格式.其中会用到大量的sed命令,sed本人也不精通,我会解释每个sed执行后达到的目的,具体关于sed命令参数等,请另行参考;
 
  [root@localhost ~]# sed '/WHERE/{:a;N;/SET/!ba;s/([^n]*)n(.*)n(.*)/3n2n1

(编辑:云计算网_宿迁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!