当前位置: 首页 > 编程日记 > 正文

mysql 5.6 binlog_format_ROW 格式binlog 在MySQL5.6上的数据恢复实验

5.6和5.7版本的MySQL,有个参数binlog_row_image,默认值为FULL,表示记录的是全部的binlog操作日志(仅在binlog_format=ROW时候生效)。此外binlog_row_image还可以是minimal,表示binlog记录的就只是影响后的行。如此一来使用ROW格式就能节约很多的磁盘空间。

因此,我们服务器上就可以直接设置binlog_format=ROW格式了,至于binlog_row_image设置为FULL还是minimal,各位就自行考虑了。

环境版本如下:

> SELECT @@version

+-------------+

| @@version  |

|-------------|

| 5.6.34-log  |

+-------------+

> SELECT @@binlog_format;

+-------------------+

| @@binlog_format  |

|-------------------|

| ROW              |

+-------------------+

假设我们的操作都是在一个库里面执行的,MySQL服务器上只跑了这一个hellodb业务的数据库。

如果数据库多的话,还会增大恢复的难度,如下事例(下面的grant操作实例不够明显,但是差不多就是那个操作步骤):

step1  准备一个全量备份:

mysqldump --flush-logs -A > /root/all.sql

step2  手工误操作删除部分数据

> use hellodb;

> delete from scores where `StuID`=8 AND `ID`=14;

# 模拟误操作删了1条用户数据,然后上报需要回滚操作。

此时还有个线程,执行了 grant all on *.* to 'abc'@'%'; 假设这个grant操作的是管理员正常的操作。

> delete from scores where `StuID`=5 AND `ID`=10;

# 模拟再次误操作删了1条用户数据,然后上报需要回滚操作。

........

........

在我们发现操作错了,到汇报这期间,还要很多用户的正常操作,也造成了数据库的一些更新。例如下面这条插入的记录。

........

INSERT INTO students VALUES(100,'www',100,'F',3,5);

........

........

step3  mysql停机

/etc/init.d/mysql stop

step4 导出相关的binlog

cd /data/mysql

看下最近的binlog文件,假如我这里看到的是 mysql.0000010 这个文件。

# 先导出一份binlog文件,

mysqlbinlog --base64-output=decode-rows -vv mysql.000010 > /root/1.sql

vi /root/1.sql 找到刚才我们误操作的部分,类似如下(下面被我添加了部分注释):

BEGIN  ---> 这个BEGIN-COMMIT要删除

/*!*/;

# at 662771  --->  注意这个Postion,回滚要用到

#170116 15:21:31 server id 106  end_log_pos 662826 CRC32 0xc2733cd6    Table_map: `hellodb`.`scores` mapped to number 156

# at 662826

#170116 15:21:31 server id 106  end_log_pos 662873 CRC32 0x0d302d22    Delete_rows: table id 156 flags: STMT_END_F

### DELETE FROM `hellodb`.`scores`

### WHERE

###  @1=14 /* INT meta=0 nullable=0 is_null=0 */

###  @2=8 /* INT meta=0 nullable=0 is_null=0 */

###  @3=4 /* SHORTINT meta=0 nullable=0 is_null=0 */

###  @4=57 /* TINYINT meta=0 nullable=1 is_null=0 */

# at 662873

#170116 15:21:31 server id 106  end_log_pos 662904 CRC32 0x7bda6198    Xid = 1136

COMMIT/*!*/;

# at 662904  ---> 这个BEGIN COMMIT要保留,这个是用户的正常操作的sql

#170116 15:21:42 server id 106  end_log_pos 663027 CRC32 0xa7dc153b    Query  thread_id=10    exec_time=0    error_code=0

SET TIMESTAMP=1484551302/*!*/;

grant all on *.* to 'abc'@'%'

/*!*/;

# at 663027

#170116 15:21:49 server id 106  end_log_pos 663102 CRC32 0xa7570f25    Query  thread_id=10    exec_time=0    error_code=0

SET TIMESTAMP=1484551309/*!*/;

BEGIN  ---> 这个BEGIN-COMMIT要删除

/*!*/;

# at 663102  --->  注意这个Postion,回滚要用到

#170116 15:21:49 server id 106  end_log_pos 663157 CRC32 0x20b81986    Table_map: `hellodb`.`scores` mapped to number 156

# at 663157

#170116 15:21:49 server id 106  end_log_pos 663204 CRC32 0x26d9f8b8    Delete_rows: table id 156 flags: STMT_END_F

### DELETE FROM `hellodb`.`scores`

### WHERE

###  @1=10 /* INT meta=0 nullable=0 is_null=0 */

###  @2=5 /* INT meta=0 nullable=0 is_null=0 */

###  @3=7 /* SHORTINT meta=0 nullable=0 is_null=0 */

###  @4=63 /* TINYINT meta=0 nullable=1 is_null=0 */

# at 663204

#170116 15:21:49 server id 106  end_log_pos 663235 CRC32 0x81f9c1d6    Xid = 1138

COMMIT/*!*/;

# at 663235

#170116 15:22:59 server id 106  end_log_pos 663310 CRC32 0xb3b0508d    Query  thread_id=10    exec_time=0    error_code=0

SET TIMESTAMP=1484551379/*!*/;

BEGIN ---> 这个BEGIN-COMMIT要保留,这个是用户的正常操作的sql

/*!*/;

# at 663310  --->  注意这个Postion,回滚要用到

#170116 15:22:59 server id 106  end_log_pos 663373 CRC32 0x17a48bfc    Table_map: `hellodb`.`students` mapped to number 152

# at 663373

#170116 15:22:59 server id 106  end_log_pos 663424 CRC32 0x0acbd405    Write_rows: table id 152 flags: STMT_END_F

### INSERT INTO `hellodb`.`students`

### SET

###  @1=100 /* INT meta=0 nullable=0 is_null=0 */

###  @2='www' /* VARSTRING(150) meta=150 nullable=0 is_null=0 */

###  @3=100 /* TINYINT meta=0 nullable=0 is_null=0 */

###  @4=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */

###  @5=3 /* TINYINT meta=0 nullable=1 is_null=0 */

###  @6=5 /* INT meta=0 nullable=1 is_null=0 */

# at 663424

#170116 15:22:59 server id 106  end_log_pos 663455 CRC32 0x1f37c970    Xid = 1139

COMMIT/*!*/;

step5 准备恢复的数据

mysqlbinlog mysql.000010 --stop-position=662771 > /root/22.sql                            # 导出step2中第一个DELETE前的数据

mysqlbinlog mysql.000010 --start-position=662904  --stop-position=663027 > /root/33.sql  # 导出step2中这个正常的grant授权操作语句

mysqlbinlog mysql.000010 --start-position=663310  > /root/44.sql                          # 导出step2中的那个正常的INSERT操作及其后面的全部SQL操作

step6 开始恢复数据

/etc/init.d/mysql start

mysql < /root/all.sql

mysql < /root/22.sql

mysql < /root/33.sql

mysql < /root/44.sql

step7 检查恢复后结果

> use hellodb;

> SELECT * from students where `StuID`=100 AND `Name`='www';

+---------+--------+-------+----------+-----------+-------------+

|  StuID | Name  |  Age | Gender  |  ClassID |  TeacherID |

|---------+--------+-------+----------+-----------+-------------|

|    100 | www    |  100 | F        |        3 |          5 |

+---------+--------+-------+----------+-----------+-------------+

> SELECT * from scores where `StuID`=8 AND `ID`=14;

+------+---------+------------+---------+

|  ID |  StuID |  CourseID |  Score |

|------+---------+------------+---------|

|  14 |      8 |          4 |      57 |

+------+---------+------------+---------+

> SELECT * from scores where `StuID`=5 AND `ID`=10;

+------+---------+------------+---------+

|  ID |  StuID |  CourseID |  Score |

|------+---------+------------+---------|

|  10 |      5 |          7 |      63 |

+------+---------+------------+---------+

可以看到恢复的效果不错。

0b1331709591d260c1c78e86d0c51c18.png

相关文章:

Appium学习笔记2_Android获取元素篇

在利用Appium做自动化测试时&#xff0c;最重要的一步就是获取对应的元素值&#xff0c;根据元素来对对象进行对应的操作&#xff0c;如果获得对象元素呢&#xff1f; Appium Server Console其实提供了一个界面对话框"Inspector",但是一般情况下&#xff0c;它无法获…

C#制作安装包

软件项目编码完工后,接下来就是制作安装包了.有一些人对制作安装包不屑一顾,但我认为这是软件工程中必不可少的环节,就如何包装商品一样.我曾经经过一个星期的研究,学会了如何制作安装包. 我做的一个安装包是可以操作配置文件的,具体步骤如下: 1)在我已经开发好的解决方案项目…

ThunderGBM:快成一道闪电的梯度提升决策树

想在 GPU 上使用使用闪电般快速的提升方法&#xff1f;了解这个库就好了。在很多任务上&#xff0c;它都比 LightGBM 和 XGBoost 快。尽管近年来神经网络复兴并大为流行&#xff0c;但提升算法在训练样本量有限、所需训练时间较短、缺乏调参知识等场景依然有其不可或缺的优势。…

cyclicbarrier java_Java并发编程之CyclicBarrier和线程池的使用

原标题&#xff1a;Java并发编程之CyclicBarrier和线程池的使用下面我们来讲述一下线程池和CyclicBarrier的使用和对比。一、场景描述有四个游戏玩爱好者玩游戏&#xff0c;游戏中有三个关卡&#xff0c;每一个关卡必须让所有玩家到达后才能允许通过。其实这个场景里的玩家中如…

在CentOS 7中安装与配置Tomcat-8方法

安装前提 在CentOS 7中安装与配置JDK8 安装tomcat apache-tomcat-8.0.14.tar.gz文件上传到/usr/local中执行以下操作&#xff1a; [rootlocalhost ~]# cd /usr/local [rootlocalhost ~]# tar -zxv -f apache-tomcat-8.0.14.tar.gz // 解压压缩包 [rootlocalhost ~]# rm -rf …

java I/O总结(收藏)

Java I/O总结——InputStream By: 海市蜃楼 | In: Android开发 22十一2009在前面介绍了Decorator&#xff08;装饰&#xff09;模式&#xff0c;让我自己想起了刚开始工作时那段“痛并快乐”的学习时光。在学习Android网络方面&#xff0c;也发现网络方面的很多内容都与Java I/…

我了解到的新知识之——电热水器用电安全

今天写一篇文章和大家分享一个与科技产品无关的话题&#xff0c;就是关于我们每天都会使用的电热水器。到底出了什么问题呢&#xff1f;我在今天准备打开热水器时&#xff0c;发现按下开关之后没有反应&#xff0c;于是就去查看漏电保护器&#xff0c;发现漏电保护器和墙面上的…

android native java_在Android Native层中创建Java虚拟机实例

前言Android应用中JNI代码&#xff0c;是作为本地方法运行的。而大部分情况下&#xff0c;这些JNI方法均需要传递Dalvik虚拟机实例作为第一个参数。例如&#xff0c;你需要用虚拟机实例来创建jstring和其他的Java对象、查找类或成员变量等。大部分情况下&#xff0c;在你用JNI接…

Qt 学习之路:模型-视图高级技术

PathView PathView是 QtQuick 中最强大的视图&#xff0c;同时也是最复杂的。PathView允许创建一种更灵活的视图。在这种视图中&#xff0c;数据项并不是方方正正&#xff0c;而是可以沿着任意路径布局。沿着同一布局路径&#xff0c;数据项的属性可以被更详细的设置&#xff0…

3.7Python数据处理篇之Numpy系列(七)---Numpy的统计函数

目录 目录前言&#xff08;一&#xff09;函数一览表&#xff08;二&#xff09;统计函数1&#xff08;三&#xff09;统计函数2目录 前言 具体我们来学Numpy的统计函数 &#xff08;一&#xff09;函数一览表 调用方式&#xff1a;np.* .sum(a)对数组a求和.mean(a)求数学期望.…

android图像处理系列之三--图片色调饱和度、色相、亮度处理

原图&#xff1a; 处理后&#xff1a; 下面贴代码&#xff1a; 一、图片处理层&#xff1a; package com.jacp.tone.view; import java.util.ArrayList; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.gra…

JAVA动态读取xml_Java动态生成和解析xml文件步骤详解

packageday12;importjava.io.FileInputStream;importjava.util.ArrayList;importjava.util.List;importorg.dom4j.Document;importorg.dom4j.Element;importorg.dom4j.io.SAXReader;/*** 使用DOM4J解析XML文档*authortarena**/public classParseXMLDemo {public static voidmai…

C++基础知识(二)

八、 继承&#xff1a;让某个类的对象获得另一个类的对象的特性。通过继承可实现代码重用&#xff0c;即从已存在的类派生出的一个新类将自动具有原来那个类的特性。 类的继承还具有&#xff1a;(1)单向性&#xff1b;A类为B类的基类&#xff08;父类&#xff09;&#xff0c;则…

Spring MVC 学习笔记 对locale和theme的支持

Spring MVC 学习笔记 对locale和theme的支持 Locale Spring MVC缺省使用AcceptHeaderLocaleResolver来根据request header中的 Accept-Language 来确定访客的local。对于前端jsp页面上&#xff0c;spring提供了标签<spring:message>来提供从resource文件中获取的文字的动…

iOS逆向(4)-代码注入,非越狱窃取微信密码

利用LLDB对微信进行分析&#xff0c;然后利用分析的结果&#xff0c;再逐步讲解如何Hook微信的登录过程&#xff0c;截获微信密码。 在上一篇文章(APP重签名)中&#xff0c;已经介绍了如何对APP重签名&#xff0c;并且利用XCode将微信跑起来&#xff0c;既然到了这一步&#xf…

java http请求 工具类_Java 实现 Http 请求工具类

1 packagecom.demo.util;23 importjava.io.BufferedReader;4 importjava.io.IOException;5 importjava.io.InputStreamReader;6 importjava.io.OutputStreamWriter;7 importjava.net.URL;8 importjava.net.URLConnection;910 public classHttpUtil {11 /**12 * 向指定URL发送GE…

Entity Framework学习三:查询、插入、更新和删除操作

1.LINQ过滤数据 var query from person in context.Peoplewhere person.FirstName.StartsWith("a")select person; var methodQuery context.People.Where(p > p.FirstName.StartsWith("a")); 两种不同的写法&#xff0c;效果一样。 多条件组合查找…

c/s开发基础自学纪录为主

1&#xff0e;常用属性 &#xff08;1&#xff09;Name属性&#xff1a;用来获取或设置窗体的名称。 &#xff08;2&#xff09;WindowState属性&#xff1a;用来获取或设置窗体的窗口状态。 &#xff08;3&#xff09;StartPosition属性&#xff1a;用来获取或设置运行时窗体的…

不错的威盾PHP加密专家解密算法

<?php /*********************************** *威盾PHP加密专家解密算法 http://www.my400800.cn ***********************************/ $filename"phpfilename.php";//要解密的文件 $lines file($filename);//0,1,2行 //第一次base64解密 $content"&quo…

java网络编程udp_java网络编程 UDP网络编程问题

为什么我的代码运行后&#xff0c;黑窗口&#xff0c;不显示一端发来的数据&#xff0c;而是黑窗口打印很多空格&#xff1f;请帮一下&#xff0c;初学者&#xff01;谢谢&#xff0c;下面是二个具有发送和接受功能的代码&#xff1f;发送端————importjava.net.*;imp...为什…

权限组件(10):三级菜单的展示和增删改查

效果图&#xff1a; 三级菜单的实现和一级、二级菜单差不多。需要注意的是增加三级菜单时&#xff0c;三级菜单是用户提交后在后台通过二级菜单的id添加的。 一、路由分发 rbac/urls.py ... from django.urls import re_pathfrom rbac.views import menu ...urlpatterns [...…

ROS知识(4)----初级教程之常见问题汇总

一、开机启动ROS的工作空间的路径设置失败 现象&#xff1a;在教程&#xff1a;http://wiki.ros.org/cn/ROS/Tutorials/CreatingPackage中的第5.1小节&#xff0c;运行以下命令失败&#xff1a; $ rospack depends1 beginner_tutorials 提示错误&#xff1a;[rospack] Error: …

sql server 海量数据速度提升:SQL优化-索引(11) 【转】

12、高效的TOP 事实上&#xff0c;在查询和提取超大容量的数据集时&#xff0c;影响数据库响应时间的最大因素不是数据查找&#xff0c;而是物理的I/0操作。如&#xff1a; select top 10 * from ( select top 10000 gid,fariqi,title from tgongwen where neibuyonghu办公室or…

java重定向带参数_急 求助重新封装重定向带参数问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼这是我写的代码 不知道行不行 求助package base.web.resolver.result;import java.util.HashMap;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.logging.log4j.…

Java程序员从笨鸟到菜鸟之(五)java开发常用类(包装,数字处理集合等)(下)...

本文来自&#xff1a;曹胜欢博客专栏。转载请注明出处&#xff1a;http://blog.csdn.net/csh624366188 写在前面&#xff1a;由于前天项目老师建设局的项目快到验收阶段&#xff0c;所以&#xff0c;前天晚上通宵&#xff0c;昨天睡了大半天&#xff0c;下午我们宿舍聚会&#…

对数组中的数字 1 和 2 进行排序,使得数字 1、2 分别位于前、后部分

问题描述&#xff1a;假设某个数组中只有数字 1 和 2&#xff0c;进行排序&#xff0c;使得数字 1 位于数组前部分&#xff0c;数字 2 位于后部分。 这道算法题其实不是很难&#xff0c;使用各种排序算法应该都能解出&#xff0c;但是若要考虑性能问题&#xff0c;那就得选择一…

@class和#import

class 作用&#xff1a; 可以简单的引用一个类 简单使用&#xff1a; class Dog; 仅仅是告诉编译器&#xff0c;Dog是一个类&#xff1b;并不会包含Dog这个类的所有内容 具体使用&#xff1a; 在.h文件中使用class引用一个类 在.m文件中使用#import包含这个类的.h文件 作用上的…

java登陆界面连接数据库_java 登陆界面怎么写,连接数据库后

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼界面是package 界面类;import javax.jws.soap.SOAPBinding.Use;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing…

C# 汉字编码GB2312转换

功能界面 源码&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace wordsConvert {public partial class Fo…

python批量爬取文档

最近项目需要将批量链接中的pdf文档爬下来处理&#xff0c;根据以下步骤完成了任务&#xff1a; 将批量下载链接copy到text中&#xff0c;每行1个链接&#xff1b;再读txt文档构造url_list列表&#xff0c;利用readlines返回以行为单位的列表&#xff1b;利用str的rstrip方法&a…