mysql使用flashback恢复数据

常在河边走,哪有不湿鞋。如果我们经常操作数据库,很有可能就会造成误操作,假如我们不幸误删了数据,有没有办法快速恢复呢?
这里,我们就以用的最多的mysql举例,聊聊如何快速恢复数据。mysql官方貌似并没有提供什么快速恢复数据的工具,业界倒是有很多和myql相关的快速恢复的工具,比如:binlog2sql,或者myflash。但是我看了看,都需要搞一些安装包,并且我发现有些工具已经不维护了,不清楚有没有啥问题,所以我的诉求是:
1)、工具要权威,并且持续迭代
2)、不要装一些和恢复数据没关系的包
基于以上想法,我找到了一篇国外老哥写的文章,原文链接,能看懂英文的,尽量看英文,原文写的很清晰。
我们这篇文章除了翻译一下国外老哥的文章外,还对其内容进行了补充,原文只是介绍了恢复工具的使用,略过了一些细节,对于一些刚入门的同学来说,需要了解一些前置知识的,所以就有了这篇文章。文章中,我从如何获取恢复工具,恢复前的准备工作,以及如何使用恢复工具进行恢复,进行了详细的解释,方便刚开始用mysql的同学学习。
下面我们开始进入正题
我们此次的mysql恢复数据操作要依赖mariadb的恢复工具mysqlbinlog,mariadb的mysqlbinlog有一个很炫的功能,flashback,官方介绍,flashback就是我们今天的主角,快速恢复数据就靠它了(据说flashback是阿里云的彭立勋开发的,然后贡献给了mariadb),目前flashback只支持DML操作,还不支持DDL。

1、准备工作

我本地用的是mac,装docker来测试的。
1)、获取mariadb的mysqlbinlog文件,拷贝到mysql对应目录下
首先,docker安装mysql 5.7.30。然后再用docker安装mariadb 10.2.40,从mariadb 10.2.40安装目录中的/usr/bin目录下将mysqlbinlog复制到本地,可以使用以下命令

docker cp a2c08aacaa83115877f:/usr/bin/mysqlbinlog /Users/test/mariadb/usr/bin/mysqlbinlog

然后再次利用docker cp命令将该mysqlbinlog拷贝到mysql 5.7.30安装目录的/usr/bin下,替换mysql的mysqlbinlog。
2)、测试数据
建立一个名为user_like的库,然后建立一张表t,并插入一条数据

CREATE TABLE `t`  (`id` int(11) UNSIGNED NOT NULL,`c` int(11) UNSIGNED NULL DEFAULT NULL,`d` int(11) UNSIGNED NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,INDEX `c`(`c`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;INSERT INTO `user_like`.`t` (`id`, `c`, `d`) VALUES (5, 5, 5);

2、开启binlog

数据恢复工作,基本都是基于binlog来做的,所以需要开启binlog

接下来
1、首先确保你开启了binlog日志

show variables like 'log_%';

如果未开启,需要在my.cnf中配置一下,比如:

log-bin = mysql-bin
server-id=171562767
binlog_format=row

3、关闭gtid的三个变量

如果我们的mysql是一个集群的话,恢复工作通常是在一台从机上。我们需要先关闭从机

//1、将这台机器从主从集群上摘下来
STOP SLAVE;//2、关闭gtid模式
SET GLOBAL gtid_mode = ON_PERMISSIVE;
SET GLOBAL enforce_gtid_consistency = OFF;//3、设置从机可写
SET GLOBAL read_only = OFF;

4、模拟数据误删除

删除一条数据

delete from t where id = 5;

5、通过mysqlbinlog查看误删除的语句

1)、查看目前mysql中有哪些binlog日志

SHOW BINARY LOGS

在这里插入图片描述
2)、查看binlog中的事件信息

show binlog events in 'mysql-bin.000013';

在这里插入图片描述
红框中的内容就是和我们这次delete语句相关的事件信息。从红框中可以看到我们此次删除操作涉及的表是:user_like.t,Delete_rows表明我们这是一条delete语句
3)、定位需要恢复的位点
事件表格中的第二列是事件的位点信息,可以看到位点是从154到395。
4)、通过位点查看删除的sql
我们利用mysqlbinlog看一下154到395都有哪些信息。

-vv 表明把所有信息都解析出来,-vv后面是binlog文件的位置,后面就是binlog的位点信息
mysqlbinlog  -vv /var/lib/mysql/mysql-bin.000013 --start-position=154 --stop-position=395

在这里插入图片描述
通过mysqlbinlog的返回信息可以看到,我们执行了一条DELETE语句,删除了id=5的一行。
但是这里有一个问题,生产上,我们误执行了一条语句后,同时会有很多的其他语句也在执行,我们会看到很多的事件信息,此时不可能通过人工去筛选出来我们执行的误操作语句,我们只能知道,大概5分钟以前或者10分钟以前,误执行了一条语句。那这个时候,我们可以指定时间,比如下面的语句:

//查看过去半小时的binlog信息
mysqlbinlog -vv --start-datetime="$(date '+%F %T' -d 'now - 30 minutes')" --database=user_like --table=t /var/lib/mysql/mysql-bin.000013

6、通过mysqlbinlog查看闪回数据

通过mysqlbinlog,我们能够看到我们应该执行的恢复语句。如下:

//在末尾添加了--flashback参数,这个参数是闪回的关键
mysqlbinlog -vv --start-datetime="$(date '+%F %T' -d 'now - 30 minutes')" --database=user_like --table=t /var/lib/mysql/mysql-bin.000013 --flashback

在这里插入图片描述
如果是update语句,闪回会将set和where中的数据颠倒,输出一条update语句,比如:我们的一张表中有两个字段(f1,f2),其中有一行数据(2,2),假设我们误执行了
UPDATE a SET f2 = 10000 WHERE f1 = 2,然后再使用上面的闪回语功能查看闪回语句,就可以看到闪回语句是:
在这里插入图片描述
可以看到上述语句就是将我们的条件和更新数翻转了一下再执行

7、将闪回数据导出成binlog

mysqlbinlog --start-datetime="$(date '+%F %T' -d 'now - 2 hour')" --database=user_like --table=t /var/lib/mysql/mysql-bin.000013 --flashback > /usr/flashback.binlog

8、通过闪回的binlog恢复被误操作的数据

mysql -uroot -p111111 --init-command='SET sql_log_bin=0' user_like < /usr/local/flashback.binlog

我们需要另外弄一个mysql的实例,然后再创建一个user_like库,一张表 t,然后再执行上面的恢复操作,执行完后,检查无问题,可以导出执行sql到主库上执行。

9、如何按表恢复

在用备份恢复出临时实例之后,将这个临时实例设置成线上备库的从库,这样:在 start slave 之前,先通过执行change replication filter replicate_do_table = (tbl_name) 命令,就可以让临时库只同步误操作的表;这样做也可以用上并行复制技术,来加速整个数据恢复过程。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot里 运用 easyexcel 导出

引入pom <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version> </dependency>运用 import com.alibaba.excel.EasyExcel; import org.springframework.stereotype.Contr…

YOLOv7-tracker 目标追踪 输入视频帧

参考项目&#xff1a;https://github.com/JackWoo0831/Yolov7-tracker/tree/master github链接&#xff1a;https://github.com/Whiffe/Yolov7-tracker 码云链接&#xff1a;https://gitee.com/YFwinston/Yolov7-tracker 1 项目安装 1.1 环境搭建 平台&#xff1a;AutoDL 选…

Linux TCP协议——三次握手,四次挥手

一、TCP协议介绍 TCP协议是可靠的、面向连接的、基于字节流的传输层通信协议。 TCP的头部结构&#xff1a; 源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去;&#xff08;tcp是传输层的协议&#xff0c;端与端之间的数据传输&#xff0c;在TCP和UDP协议当中不会体现出I…

【Linux】一张图了解系统文件

首先先认识磁盘结构 系统文件分布图 文件查找 文件删除 文件的增删改查都是围绕inode来完成的&#xff0c;所以当我们要进行文件删除的时候&#xff0c;只需要通过inode来获取到它对应的block bitmap和inode bitmap数据块容器和保存文件属性的位置置为 0即可 &#xff0c;如果想…

【boost网络库从青铜到王者】第六篇:asio网络编程中的socket异步读(接收)写(发送)

文章目录 1、简介2、异步写 void AsyncWriteSomeToSocketErr(const std::string& buffer)3、异步写void AsyncWriteSomeToSocket(const std::string& buffer)4、异步写void AsyncSendToSocket(const std::string& buffer)5、异步读void AsyncReadSomeToSocket(cons…

一文看懂 iova、IOMMU、DMA

目录 一、概念解释 二、深入浅出 三、应用 四、常见问题 一、概念解释 IOVA&#xff08;IO Virtual Address&#xff0c;输入/输出虚拟地址&#xff09; IOMMU&#xff08;I/O Memory Management Unit&#xff09;&#xff1a;IOMMU是一种硬件单元&#xff0c;用于管理设备…

springboot sl4j2 写入日志到mysql

问题描述 springboot初始化的时候&#xff0c;会先初始化日志然后再加载数据源如果用配置文件进行初始化&#xff0c;那么会出现数据源没有加载成功&#xff0c;导致空指针异常 报错排查如下&#xff1a; 搜索报错信息&#xff0c;OBjects.invoke is Null打断点发现。dataso…

前端基础踩坑记录

前言&#xff1a;在做vue项目时&#xff0c;有时代码没有报错&#xff0c;但运行时却各种问题&#xff0c;没有报错排查起来就很费劲&#xff0c;本人感悟&#xff1a;写前端&#xff0c;需要好的眼神&#xff01;&#xff01;&#xff01;谨以此博客记录下自己的踩坑点。 一、…

【Maven教程】(三)基础使用篇:入门使用指南——POM编写、业务代码、测试代码、打包与运行、使用Archetype生成项目骨架~

Maven基础使用篇 1️⃣ 编写 POM2️⃣ 编写业务代码3️⃣ 编写测试代码4️⃣ 打包和运行5️⃣ 使用 Archetype生成项目骨架 1️⃣ 编写 POM 到目前为止&#xff0c;已经大概了解并安装好了Maven环境, 现在&#xff0c;我们开始创建一个最简单的 Hello World 项目。如果你是初次…

IDEA下SpringBoot指定环境、配置文件启动

1、idea下的SpringBoot启动&#xff1a;指定配置文件 Springboot项目有如下配置文件 主配置文件application.yml&#xff0c; 测试环境&#xff1a;application-test.yml 生产环境&#xff1a;application-pro.yml 开发环境&#xff1a;application-dev.yml 1.1.配置文件…

【FreeRTOS】【STM32】中断详细介绍

文章目录 一、三种优先级的概念辨析1. 先理清楚两个概念&#xff1a;CPU 和 MPU2. Cortex-M3 内核与 STM32F1XX 控制器有什么关系3. 优先级的概念辨析① Cortex-M3 内核和 STM32F1XX 的中断优先级② FreeRTOS 的任务的优先级 二、 Cortex-M3 内核的中断优先级1. 中断编号2. 优先…

Android 系统桌面 App —— Launcher 开发(1)

Android 系统桌面 App —— Launcher 开发&#xff08;1&#xff09; Launcher简介 Launcher就是Android系统的桌面&#xff0c;俗称“HomeScreen”也就是我们开机后看到的第一个App。launcher其实就是一个app&#xff0c;它的作用是显示和管理手机上其他App。目前市场上有很…

VIT Swin Transformer

VIT&#xff1a;https://blog.csdn.net/qq_37541097/article/details/118242600 Swin Transform&#xff1a;https://blog.csdn.net/qq_37541097/article/details/121119988 一、VIT 模型由三个模块组成&#xff1a; Linear Projection of Flattened Patches(Embedding层) Tran…

星际争霸之小霸王之小蜜蜂(六)--让子弹飞

目录 前言 一、添加子弹设置 二、创建子弹 三、创建绘制和移动子弹函数 四、让子弹飞 五、效果 总结 前言 小蜜蜂的基本操作已经完成了&#xff0c;现在开始编写子弹的代码了。 一、添加子弹设置 在我的预想里&#xff0c;我们的小蜜蜂既然是一只猫&#xff0c;那么放出的子弹…

微信小程序开发教学系列(1)- 开发入门

第一章&#xff1a;微信小程序简介与入门 1.1 简介 微信小程序是一种基于微信平台的应用程序&#xff0c;可以在微信内直接使用&#xff0c;无需下载和安装。它具有小巧、高效、便捷的特点&#xff0c;可以满足用户在微信中获取信息、使用服务的需求。 微信小程序采用前端技…

自定义WEB框架结合Jenkins实现全自动测试

自定义WEB框架结合Jenkins实现全自动测试 allure生成 allure生成 1.allure–纯命令运行 -固定的–稍微记住对应的单词即可。2 安装&#xff0c;2个步骤: 1.下载allure包&#xff0c;然后配置环境变量。 https://github.com/allure-framework/allure2/releases/tag/2.22.4 2.在…

mysql 、sql server 临时表、表变量、

sql server 临时表 、表变量 mysql 临时表 创建临时表 create temporary table 表名 select 字段 [&#xff0c;字段2…&#xff0c;字段n] from 表

[JavaWeb]【十】web后端开发-SpringBootWeb案例(配置文件)

目录 一、参数配置化 1.1 问题分析 1.2 问题解决&#xff08;application.properties&#xff09; 1.2.1 application.properties 1.2.2 AliOSSUtils 1.2.3 启动服务-测试 二、yml配置文件 2.1 配置格式 2.1.1 新增 application.yml 2.1.2 启动服务 2.2 XML与prope…

LeetCode438.找到字符串中所有字母异位词

因为之前写过一道找字母异位词分组的题&#xff0c;所以这道题做起来还是比较得心应手。我像做之前那道字母异位词分组一样&#xff0c;先把模板p排序&#xff0c;然后拿滑动窗口去s中从头到尾滑动&#xff0c;窗口中的这段字串也给他排序&#xff0c;然后拿这两个排完序的stri…

GEE/PIE 遥感大数据处理与典型案例

查看原文>>>【399三天】GEE/PIE遥感大数据处理与典型案例实践 随着航空、航天、近地空间等多个遥感平台的不断发展&#xff0c;近年来遥感技术突飞猛进。由此&#xff0c;遥感数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量也大幅增长&#xff0c;使其越来…