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…

ffmpeg将rtsp流转成mp4

命令行版本 ffmpeg -y -i "rtsp://你的rtsp地址" -vcodec copy -f mp4 d:/1.mp4中间的rtsp网址一定要加上双引号&#xff0c;避免出现url有特殊字符的问题 java代码版本 如果不支持tcp协议&#xff0c;去掉下面两个参数即可,加上这两个参数是因为ffmpeg默认使用ud…

一文看懂 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;谨以此博客记录下自己的踩坑点。 一、…

使用 OpenTelemetry 构建可观测性 03 - 导出

上一个博文中&#xff0c;我提到如何使用 OpenTelemery 的特定语言 API 来收集遥测数据&#xff0c;包含手动和自动的埋点技术&#xff0c;这很重要&#xff01;但是&#xff0c;收集遥测数据只是解决方案的第一步。 你需要把遥测数据路由转发到其他地方&#xff0c;同时添加额…

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

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

git svn:使用 git 命令来管理 svn 仓库

git-svn 使用教程 参考以下&#xff1a; https://cloud.tencent.com/developer/article/1415892 # 在SVN仓库上使用Git 源 https://blog.csdn.net/jiejie11080/article/details/106917116 # git svn clone速度慢的解决办法 http://blog.chinaunix.net/uid-11639156-id-30774…

LeetCode二叉树的最大深度

给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;root [1,null,2] …

【Vue】动态设置元素类以及样式

Vue2 动态设置元素类以及样式 1.动态设置类 class 1.1 字符串语法 通过v-bind绑定元素的class属性&#xff0c;为其指定一个字符串&#xff1a; <div v-bind:class"className">class动态绑定</div> <script> export default {data() {return {…

C/C++数据库编程

文章目录 0. Mysql安装与开发环境配置1. win10 Navicat 连接虚拟机的MySQL需要关闭防火墙2. 由于找不到libmysql.dIl, 无法继续执行代码。重新安装程序可能会解决此问题。3. 测试连接数据库&#xff0c;并插入数据4. C封装MySQL增删改查操作 0. Mysql安装与开发环境配置 MySQL…

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。目前市场上有很…

.NET CORE Api 上传excel解析并生成错误excel下载

写在前面的话&#xff1a; 【对外承接app API开发、网站建设、系统开发&#xff0c;有偿提供帮助&#xff0c;联系方式于文章最下方 】 因业务调整&#xff0c;不再需要生成错误无excel下载&#xff0c;所以先保存代码&#xff0c;回头再重新编辑 #region Excel校验部分if (f…

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…