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语句

  • 相关阅读:
    解决PKIX:unable to find valid certification path to requested target 的问题
    Linux 上的常用文件传输方式介绍与比较
    用VNC远程图形化连接Linux桌面的配置方法
    红帽中出现”This system is not registered with RHN”的解决方案
    linux安装时出现your cpu does not support long mode的解决方法
    CentOS SSH配置
    es6扩展运算符及rest运算符总结
    es6解构赋值总结
    tortoisegit安装、clon、推送
    es6环境搭建
  • 原文地址:https://www.cnblogs.com/timePasser-leoli/p/11346942.html
Copyright © 2011-2022 走看看