zoukankan      html  css  js  c++  java
  • 关于MySql数据库误操作数据找回的办法

      先讲个事,前段时间,系统长时间不用的一个功能被开放出来了,想当然的我没有在测试平台上测试,直接操作了正式系统(的确是我不严谨),导致好多数据异常,页面展示错乱了。于是我想到的第一个就是进行备份还原。项目进行了7天的备份,每天凌晨自动备份,但是凌晨到现在的数据就会丢失了,这可是重大问题啊。我顿时慌了,于是只能寻求DBA的帮助。这边省略五百字。。。

      最后问题解决了,让我对数据恢复产生了兴趣,听DBA讲用的方法是Flashback闪回工具,也简单,于是我也自学了一下,这边做个介绍。

      flashback可以把数据库恢复到以前某个时间点(或者说某个binlog的某个pos)。比如忘了带where条件的update、delete操作,传统的恢复方式是利用全备+二进制日志前滚进行恢复,相比于传统的全备+增备,flashback显然更为快速、简单。这里有个注意点,DDL语句是不支持进行flashback的,谨慎操作。

      先讲讲所谓的闪回是什么意思,了解他的原理是什么。

      其实很简单,相当于回滚,MySQL的binlog以event的形式,记录了MySQL中所有的变更情况,利用binlog我们就能够重现所记录的所有操作。flashback工具(-B 参数)可对rows格式的binlog可以进行逆向操作,将已执行的delete语句反向生成insert语句,将update语句生成反向update语句,将insert语句反向生成delete语句。这里提一句,binlog是有三种格式的:

    • statement,基于SQL语句的模式,一般来说生成的binlog尺寸较小,但是某些不确定性SQL语句或函数在复制过程可能导致数据不一致甚至出错;
    • row,基于数据行的模式,记录的是数据行的完整变化。相对更安全,推荐使用(但通常生成的binlog会比其他两种模式大很多);
    • mixed,混合模式,可以根据情况自动选用statement抑或row模式;这个模式下也可能造成主从数据不一致。它属于MySQL 5.1版本时期的过渡方案,已不推荐使用了。

      注意:使用mysqlbinlog flashback 工具必须设置:binlog_format = row。如果误操作的事务是由多个event组成的,那么必须将整个事务倒序恢复,即从最后一个event恢复到第一个event。

      使用方法:

      第一步:安装flashback

      MySQL本身是不自带flashback的,我们需要进行自己安装。下载地址:https://pan.baidu.com/s/1U33OO79RjBMJPSi0dDpKdg

      将mysqlbinlog文件移至mysql安装路径的bin目录下,执行mysqlbinlog --help(自行解决报错),无任何报错后再执行mysqlbinlog -V,看是否mysql是否版本发生了变化,且多了一个 -B 参数,这样就装完了。

      第二步:测试效果

      随便建一张表,比如叫frame_ou

      create table frame_ou(

        ouguid  varchar(50) not null,

        ouname varchar(20),

        oulevel  int(5)

      )

      我们往里面插入一条数据,insert into frame_ou values('111','组织部',1);

      看下binlog里面,可以看到这句插入语句mysqlbinlog -vv mysql-bin.000004 

    1 ### INSERT INTO `test`.`frame_ou`
    2 ### SET
    3 ###   @ouguid=111 /* VARSTRING(50) meta=50 nullable=0 is_null=0  */
    4 ###   @ouname='组织部' /* VARSTRING(50) meta=20 nullable=1 is_null=0 */
    5 ###   @oulevel=1 /* SHORTINT meta=0 nullable=1 is_null=0 */

      然后执行下flashback   mysqlbinlog -vv mysql-bin.000004 -B,然后就会发现

    ### DELETE FROM `test`.`frame_ou`
    ### WHERE
    ###   @ouguid=111 /* VARSTRING(50) meta=50 nullable=0 is_null=0  */
    ###   @ouname='组织部' /* VARSTRING(50) meta=20 nullable=1 is_null=0 */
    ###   @oulevel=1 /* SHORTINT meta=0 nullable=1 is_null=0 */

      同理,delete操作将会被转换为insert,update被转换为反向的update;若在一个事务中既有insert、update、delete语句,通过使用-B参数后,不仅三种DML语句完成了逆向转换,并且语句顺序也会发生颠倒。

    在binlog中找到误操作的pos变化区间后,使用mysqlbinlog -B 恢复:

    # mysqlbinlog -B --start-position=431 --stop-position=509 mysql-bin.000004 | mysql -uroot -p

      注意事项:

      1)        binlog_format=row

      2)        只支持insert、update、delete

      3)        不支持drop 、truncate、alter等DDL语句

  • 相关阅读:
    第九周:关于程序的历史
    第八周
    第八周2
    关于bom和dom的概念及用法应用
    关于css中position的两个属性值sticky和fixed的不同
    css颜色表示法
    atan2(x,y)与pow(x,y)
    第9周作业
    第8周作业
    第⑦周作业
  • 原文地址:https://www.cnblogs.com/timePasser-leoli/p/11346942.html
Copyright © 2011-2022 走看看