再来谈谈如何从binlog文件恢复误update的数据,模拟Oracle的闪回功能

看腻文章了就来听听视频演示吧:https://www.bilibili.com/video/BV19m4y1V7jA/

传统处理:全量备份+增量binlog备份
模拟Oracle闪回:前提是binlog_format=ROW

drop table t_student;
create table t_student(id int,name varchar(18),class int,score varchar(18));
insert into t_student values(1,'a',1,66),(2,'b',1,58),(3,'c',2,86),(4,'d',2,78);
update t_student set score='failure';

原理:binlog的ROW模式记录update语句where所有列,调整binlog记录列保留修改前的值即可恢复
步骤

  1. 查找误操作的binlog文件内容
  2. binlog内容处理,转为可执行的SQL语句
  3. 执行SQL恢复达到回滚效果
# 查看当前biglog日志所在的点
mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000012 |      8736 |
| mysql-bin.000013 |       154 |
+------------------+-----------+
2 rows in set (0.00 sec)
# binlog查找到语句
[root@db01 data]# mysqlbinlog --no-defaults -v -v --base64-output=decode-rows mysql-bin.000013 | grep -B 15 'failure' | more
/*!*/;
# at 818
#230910 10:55:40 server id 3306  end_log_pos 876 CRC32 0x1ae07a0e       Table_map: `mdb`.`t_student` mapped to number127
# at 876
#230910 10:55:40 server id 3306  end_log_pos 1044 CRC32 0x279913de      Update_rows: table id 127 flags: STMT_END_F
### UPDATE `mdb`.`t_student`
### WHERE
###   @1=1 /* INT meta=0 nullable=1 is_null=0 */
###   @2='a' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
###   @3=1 /* INT meta=0 nullable=1 is_null=0 */
###   @4='66' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
### SET
###   @1=1 /* INT meta=0 nullable=1 is_null=0 */
###   @2='a' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
###   @3=1 /* INT meta=0 nullable=1 is_null=0 */
###   @4='failure' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
### UPDATE `mdb`.`t_student`
### WHERE
###   @1=2 /* INT meta=0 nullable=1 is_null=0 */
###   @2='b' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
###   @3=1 /* INT meta=0 nullable=1 is_null=0 */
###   @4='58' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
### SET
###   @1=2 /* INT meta=0 nullable=1 is_null=0 */
###   @2='b' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
###   @3=1 /* INT meta=0 nullable=1 is_null=0 */
###   @4='failure' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
### UPDATE `mdb`.`t_student`
### WHERE
###   @1=3 /* INT meta=0 nullable=1 is_null=0 */
###   @2='c' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
###   @3=2 /* INT meta=0 nullable=1 is_null=0 */
###   @4='86' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
### SET
###   @1=3 /* INT meta=0 nullable=1 is_null=0 */
###   @2='c' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
###   @3=2 /* INT meta=0 nullable=1 is_null=0 */
###   @4='failure' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
### UPDATE `mdb`.`t_student`
### WHERE
###   @1=4 /* INT meta=0 nullable=1 is_null=0 */
###   @2='d' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
###   @3=2 /* INT meta=0 nullable=1 is_null=0 */
###   @4='78' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
### SET
###   @1=4 /* INT meta=0 nullable=1 is_null=0 */
###   @2='d' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
###   @3=2 /* INT meta=0 nullable=1 is_null=0 */
###   @4='failure' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */

把语句对应binlog导出

[root@db01 data]# mysqlbinlog --no-defaults -v -v --base64-output=decode-rows mysql-bin.000013 | sed -n '/# at 876/,/COMMIT/p' > tbl_data.txt
[root@db01 data]# cat tbl_data.txt 
# at 876
#230910 10:55:40 server id 3306  end_log_pos 1044 CRC32 0x279913de      Update_rows: table id 127 flags: STMT_END_F
### UPDATE `mdb`.`t_student`
### WHERE
###   @1=1 /* INT meta=0 nullable=1 is_null=0 */
###   @2='a' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
###   @3=1 /* INT meta=0 nullable=1 is_null=0 */
###   @4='66' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
### SET
###   @1=1 /* INT meta=0 nullable=1 is_null=0 */
###   @2='a' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
###   @3=1 /* INT meta=0 nullable=1 is_null=0 */
###   @4='failure' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
### UPDATE `mdb`.`t_student`
### WHERE
###   @1=2 /* INT meta=0 nullable=1 is_null=0 */
###   @2='b' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
###   @3=1 /* INT meta=0 nullable=1 is_null=0 */
###   @4='58' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
### SET
###   @1=2 /* INT meta=0 nullable=1 is_null=0 */
###   @2='b' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
###   @3=1 /* INT meta=0 nullable=1 is_null=0 */
###   @4='failure' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
### UPDATE `mdb`.`t_student`
### WHERE
###   @1=3 /* INT meta=0 nullable=1 is_null=0 */
###   @2='c' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
###   @3=2 /* INT meta=0 nullable=1 is_null=0 */
###   @4='86' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
### SET
###   @1=3 /* INT meta=0 nullable=1 is_null=0 */
###   @2='c' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
###   @3=2 /* INT meta=0 nullable=1 is_null=0 */
###   @4='failure' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
### UPDATE `mdb`.`t_student`
### WHERE		-- 误操作之前的数据
###   @1=4 /* INT meta=0 nullable=1 is_null=0 */
###   @2='d' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
###   @3=2 /* INT meta=0 nullable=1 is_null=0 */
###   @4='78' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
### SET			-- 误操作之后的数据
###   @1=4 /* INT meta=0 nullable=1 is_null=0 */
###   @2='d' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
###   @3=2 /* INT meta=0 nullable=1 is_null=0 */
###   @4='failure' /* VARSTRING(54) meta=54 nullable=1 is_null=0 */
# at 1044
#230910 10:55:40 server id 3306  end_log_pos 1075 CRC32 0xe84469d8      Xid = 564
COMMIT/*!*/;

把binlog转换成SQL语句

[root@db01 data]# sed '/WHERE/{:a;N;/SET/!ba;s/\([^\n]*\)\n\(.*\)\n\(.*\)/\3\n\2\n\1/}' tbl_data.txt | sed -r '/WHERE/{:a;N;/@4/!ba;s/###   @2.*//g}' | sed 's/### //g;s/\/\*.*/,/g' | sed '/WHERE/{:a;N;/@1/!ba;s/,/;/g};s/#.*//g;s/COMMIT,//g' | sed '/^$/d' > recovery.sql
[root@db01 data]# cat recovery.sql 
UPDATE `mdb`.`t_student`
SET@1=1 ,@2='a' ,@3=1 ,@4='66' ,
WHERE@1=1 ;
UPDATE `mdb`.`t_student`
SET@1=2 ,@2='b' ,@3=1 ,@4='58' ,
WHERE@1=2 ;
UPDATE `mdb`.`t_student`
SET@1=3 ,@2='c' ,@3=2 ,@4='86' ,
WHERE@1=3 ;
UPDATE `mdb`.`t_student`
SET@1=4 ,@2='d' ,@3=2 ,@4='78' ,
WHERE@1=4 ;

替换@1、@2、@3、@4对应表字段 id 、name、class、score

sed -i 's/@1/id/g;s/@2/name/g;s/@3/class/g;s/@4/score/g' recovery.sql
sed -i -r 's/(score=.*),/\1/g' recovery.sql
[root@db01 data]# cat recovery.sql 
UPDATE `mdb`.`t_student`
SETid=1 ,name='a' ,class=1 ,score='66' 
WHEREid=1 ;
UPDATE `mdb`.`t_student`
SETid=2 ,name='b' ,class=1 ,score='58' 
WHEREid=2 ;
UPDATE `mdb`.`t_student`
SETid=3 ,name='c' ,class=2 ,score='86' 
WHEREid=3 ;
UPDATE `mdb`.`t_student`
SETid=4 ,name='d' ,class=2 ,score='78' 
WHEREid=4 ;

恢复

mysql> select * from t_student;
+------+------+-------+---------+
| id   | name | class | score   |
+------+------+-------+---------+
|    1 | a    |     1 | failure |
|    2 | b    |     1 | failure |
|    3 | c    |     2 | failure |
|    4 | d    |     2 | failure |
+------+------+-------+---------+
4 rows in set (0.00 sec)mysql> source /mysqldata/data/recovery.sql 
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from t_student;
+------+------+-------+-------+
| id   | name | class | score |
+------+------+-------+-------+
|    1 | a    |     1 | 66    |
|    2 | b    |     1 | 58    |
|    3 | c    |     2 | 86    |
|    4 | d    |     2 | 78    |
+------+------+-------+-------+
4 rows in set (0.00 sec)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147087.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

HTML——列表,表格,表单内容的讲解

文章目录 一、列表1.1无序(unorder)列表1.2 有序(order)列表1.3 定义列表 二、表格**2.1 基本的表格标签2.2 演示 三、表单3.1 form元素3.2 input元素3.2.1 单选按钮 3.3 selcet元素 基础部分点击: web基础 一、列表 …

做一个优秀的博士生,时间的付出是必要条件

*图片来自管理学季刊 时间的付出 所有成功的科学家一定具有的共同点,就是他们必须付出大量的时间和心血。这是一条真理。实际上,无论社会上哪一种职业,要想成为本行业中的佼佼者,都必须付出比常人多的时间。有时&…

数据结构——二叉树的基本概念及顺序存储(堆)

目录 一.前言 二.树概念及结构 2.1 树的概念 2.2 树的相关概念 2.3 树的表现 2.4 树在实际中的应用(表示文件系统的目录树结构) 三.二叉树的概念及结构 3.1 概念 3.2 特殊的二叉树 3.3 二叉树的性质 3.4 二叉树的存储结构 3.4.1 顺序存储 3…

深度学习笔记之线性代数

深度学习笔记之线性代数 一、向量 在数学表示法中,向量通常记为粗体小写的符号(例如,x,y,z)当向量表示数据集中的样本时,它们的值具有一定的现实意义。例如研究医院患者可能面临的心脏病发作风…

小谈设计模式(13)—外观模式

小谈设计模式(13)—外观模式 专栏介绍专栏地址专栏介绍 外观模式主要目的角色分析外观(Facade)角色子系统(Subsystem)角色客户端(Client)角色 工作原理核心思想总结简化接口解耦客户…

springboot和vue:九、v-for中的key+vue组件化开发

v-for中的key 目的 现在想要实现这样的一种效果&#xff0c;页面上存在初始姓名表单&#xff0c;同时存在输入框&#xff0c;输入姓名后点击添加按钮可以将新输入的姓名加入显示的姓名表单中。 代码 <!DOCTYPE html> <html lang"en"><head><…

8、Nacos服务注册服务端源码分析(七)

本文收录于专栏 Nacos 中 。 文章目录 前言确定前端路由CatalogController.listDetail()ServiceManager总结 前言 前文我们分析了Nacos中客户端注册时数据分发的设计链路&#xff0c;本文根据Nacos前端页面请求&#xff0c;看下前端页面中的服务列表的数据源于哪里。 确定前端…

【考研数学】高等数学第七模块 —— 曲线积分与曲面积分 | 3. 对面积的曲面积分(第一类曲面积分)

文章目录 二、曲面积分2.1 对面积的曲面积分&#xff08;第一类曲面积分&#xff09;2.1.1 问题引入 —— 曲面的质量2.1.2 对面积的曲面积分定义及性质2.1.3 对面积的曲面积分的计算法 写在最后 二、曲面积分 2.1 对面积的曲面积分&#xff08;第一类曲面积分&#xff09; 2…

【面试经典150 | 矩阵】螺旋矩阵

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;模拟方法二&#xff1a;按层模拟 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于…

C语言实例_调用SQLITE数据库完成数据增删改查

一、SQLite介绍 SQLite是一种轻量级的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它是一个开源的、零配置的、服务器端的、自包含的、零管理的、事务性的SQL数据库引擎。它被广泛应用于嵌入式设备、移动设备和桌面应用程序等领域。 SQLite的特点包括&…

【Golang】数组 切片

【Golang】数组 && 切片 1、数组 基本概念 数组是一个由固定长度的特定类型元素组成的序列&#xff0c;一个数组可以由零个或多个元素组成 因为数组的长度是固定的&#xff0c;所以在Go语言中很少直接使用数组 数组初始化 //1、默认数组中的值是类型的默认值 var arr…

华为智能企业上网行为管理安全解决方案(2)

本文承接&#xff1a; https://blog.csdn.net/qq_37633855/article/details/133339254?spm1001.2014.3001.5501 重点讲解华为智能企业上网行为管理安全解决方案的部署流程。 华为智能企业上网行为管理安全解决方案&#xff08;2&#xff09; 课程地址方案部署整体流程组网规划…

ARM-day2

1、1到100累加 .text .global _start_start:MOV r0, #1ADD r1,r0, #1fun:ADD r0,r0,r1ADD r1,r1, #1cmp r1, #0x65moveq PC,LRbl funstop:b stop.end2、思维导图

Spring Boot的自动装配中的@ConditionalOnBean条件装配注解在Spring启动过程中,是如何保证处理顺序靠后的

前言 为什么Spring Boot条件注解那么多&#xff0c;而标题中是ConditionalOnBean呢&#xff1f; 因为&#xff0c;相比之下我们用的比较多的条件装配注解也就是ConditionalOnClass、ConditionalOnBean了&#xff0c;而ConditionalOnClass对顺序并不敏感&#xff08;说白了就是判…

uniapp app 导出excel 表格

直接复制运行 <template><view><button click"tableToExcel">导出一个表来看</button><view>{{ successTip }}</view></view> </template><script>export default {data() {return {successTip: }},metho…

2023年【道路运输企业安全生产管理人员】最新解析及道路运输企业安全生产管理人员考试技巧

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 道路运输企业安全生产管理人员最新解析参考答案及道路运输企业安全生产管理人员考试试题解析是安全生产模拟考试一点通题库老师及道路运输企业安全生产管理人员操作证已考过的学员汇总&#xff0c;相对有效帮助道路运…

JavaSE | 初识Java(五) | 方法的使用

方法就是一个代码片段&#xff0c; 类似于 C 语言中的 " 函数 "。 方法可以是我们代码逻辑更清晰&#xff0c;并且可以服用方法使代码更简洁 方法语法格式 // 方法定义 修饰符 返回值类型 方法名称([参数类型 形参 ...]){ 方法体代码; [return 返回值]; } 实例&…

数据结构:KMP算法的原理图解和代码解析

文章目录 应用场景算法方案算法原理完整代码 本篇总结的是关于串中的KMP算法解析 应用场景 现给定两个串&#xff0c;现在要看较短的一个串是不是较长的串的子串&#xff0c;如果是就输出子串后面的内容&#xff0c;如果不是则输出Not Found 能匹配到&#xff1a; 长串&…

【办公自动化】在Excel中按条件筛选数据并存入新的表(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

Java环境配置无效

Java环境配置无效 老是使用1.8版本&#xff0c;象牛皮癣。 查找java来源 where java 打开C:\Windows\System32 删掉java.exe javaaw.exe javaaws.exe 正常