先讲个事,前段时间,系统长时间不用的一个功能被开放出来了,想当然的我没有在测试平台上测试,直接操作了正式系统(的确是我不严谨),导致好多数据异常,页面展示错乱了。于是我想到的第一个就是进行备份还原。项目进行了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语句

关于MySql数据库误操作数据找回的办法的更多相关文章

  1. MySQL数据库忘记root密码解决办法

    MySQL数据库忘记root密码解决办法 1.在运行输入services.msc打开服务窗体,找到MYSQL服务.右键停止将其关闭.如图:

  2. [原创]MySQL数据库忘记root密码解决办法

    MySQL数据库忘记root密码解决办法 1.在运行输入services.msc打开服务窗体,找到MYSQL服务.右键停止将其关闭.如图:

  3. [异常篇]001.MySQL数据库忘记root密码解决办法[转载]

    MySQL数据库忘记root密码解决办法 1.在运行输入services.msc打开服务窗体,找到MYSQL服务.右键停止将其关闭.如图: 2.在运行输入cmd打开终端. 3.找到MYSQL的安装目录 ...

  4. Mysql数据库忘记密码找回方法

    Mysql数据库忘记密码找回 a 停止mysql服务 /etc/init.d/mysql stop b 使用--skip-grant-tables启动mysql,忽略授权登录验证 mysqld_saf ...

  5. 基于Python3.6使用Django框架连接mysql数据库的驱动模块安装解决办法

    解决办法1 使用PyMySQL模块,直接使用pip install pymysql即可. 参考文章:https://www.cnblogs.com/wcwnina/p/8719482.html 原文内 ...

  6. MySQL数据库不能远程访问的解决办法

    MySQL数据库不允许从远程访问怎么办? 下面提供两种方法: 1.改表法 MySQL的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 ...

  7. 阿里云安装mysql数据库出现2002错误解决办法

    在安装数据库的时候出现了如下错误: 解决办法如下: 1.在bin目录下 输入:kill -s 9 9907 再输入:ps -ef|grep mysql 显示如下: 2.回到lampp目录下,重启数据库 ...

  8. 最万能的解决mysql数据库的各种问题的办法

    ubuntu下安装mysql及卸载mysql方法 1. 删除mysql a. sudo apt-get autoremove --purge mysql-server-5.0 b. sudo apt- ...

  9. sql server 日志文件结构及误操作数据找回

    一. 概述 在sql server 里有数据文件.mdf和日志文件.ldf,日志文件是sqlserver数据库的另一个重要组成部分,日志文件记录了所有事务以及每个事务对数据库所做的修改.为了提高数据库 ...

随机推荐

  1. What are CBR, VBV and CPB?

    转自:https://codesequoia.wordpress.com/2010/04/19/what-are-cbr-vbv-and-cpb/ It's common mistake to to ...

  2. CRM系统如何改善企业业务流程

    工作流管理是CRM客户管理系统的一个重要功能.当企业进行业务管理和处理时,会有一套自己的工作流程.使用CRM系统,可以帮助企业改进整个工作流程,利用系统的流程设置模块,将各个部门所处理的活动定义为过程 ...

  3. jenkins邮件报警机制配置

    1.下载email插件 Jenkins配置email前需要先安装email插件:Email Extension.Email Extension Template Plugin 2.系统配置 在Jenk ...

  4. [bug] Docker:Error ruuning deviceCreate(createSnapDevice) dm_task_run failed

    原因 删除容器时报错,元信息出错,需要修复 最后一个参数要改成自己docker元信息路径,如: thin_check --clear-needs-check-flag /var/lib/docker/ ...

  5. Python re 截取文本中IP地址及用户名

    文本示例: ts=2019-07-10T06:43:06523942Z pid=1875 tid=6320 version=e73c536 proto=http id=5a61a613e395f883 ...

  6. BUUCTF(十)[GXYCTF2019]Ping Ping Ping 1

    BUUCTF系列 /?ip=baidu.com /?ip=baidu.com|ls 正常回显,当cat flag.php时,提示不让输入空格,而且后面还不让出现falg字符 IFS IFS (Inte ...

  7. Linux服务之nginx服务篇三(反向代理、负载均衡)

    一.Nginx实现反向代理 概念 反向代理:在收到客户端请求之后,会修目标IP地址和端口 正向代理:在收到客户端请求之后,会修源IP地址和端口 上游服务器:代理服务器后端的哪些真正给客户端提供服务的节 ...

  8. EasyUI_使用datagrid分页 (Day_28)

    本次分页涉及技术点 SSM+PageHelper+DatagrId 先来看下效果: 这是无条件分页,下一篇博客我们将讲有条件分页. 无论你是使用js加载table 还是直接使用标签. 使用datagr ...

  9. 常用数据库连接池配置及使用(Day_11)

    世上没有从天而降的英雄,只有挺身而出的凡人. --致敬,那些在疫情中为我们挺身而出的人. 运行环境 JDK8 + IntelliJ IDEA 2018.3  优点: 使用连接池的最主要的优点是性能.创 ...

  10. rocketmq常见问题及使用 新手篇

    一 部署阶段 1.启动命令 nameServer启动:nohup sh bin/mqnamesrv  -n ip地址:9876 & broker启动:nohup sh bin/mqbroker ...