首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL数据快速恢复的一些思考

MySQL数据快速恢复的一些思考

作者头像
AsiaYe
发布于 2022-05-17 02:14:30
发布于 2022-05-17 02:14:30
63900
代码可运行
举报
文章被收录于专栏:DBA随笔DBA随笔
运行总次数:0
代码可运行

MySQL快速恢复数据的思考

这是很早时候写的一篇文章,今天翻看历史文章的时候发现的,觉得还是有收获,就分享出来了。以下是文章原文:

01

问题背景

前几天的一个晚上,要下班的时候,业务方忽然有一个需求,是需要恢复一个表里面的数据。

问了下误删除的具体情况,大概是这样的:业务方不小心在一个表里面做了一个update的操作,where条件没有写对,导致表里面的数据被写脏了,现在要求恢复到之前的数据。

听到这里,我先检查了下当前这个实例的备份,万幸,备份是存在的。这份数据是平台上某些商品的价格,基本上是有限个商品,然后价格值也都是固定的,之前有对这个价格表进行备份,于是给他直接重新导入了一份价格表的数据,这个问题也算是解决了。

02

数据恢复的思考

本次数据恢复,由于提前备份了这个价格表,所以直接导入就可以了,那么,如果没有备份价格表呢?或者说这个价格表是个动态变化的表,又该如何快速处理呢?现在想起来,其实有一些其他办法。

方法一:DML闪回

由于是DML的误操作,使用binlog2sql工具或者FlashBack工具,能够很好的解决这个问题。

方法二:传统方法(备份+binlog回放)

如果我们使用传统的备份+binlog回放的方法,确实在处理速度上不占优势,尤其是备份文件的时间比较久远的场景下,这种方法会花费大量时间。想要加速这个过程,可以通过调整buffer pool以及刷盘策略等参数。但是,这种方法终究还是逃脱不了binlog单线程回放的陷阱。

使用mysqlbinlog工具重放事务,这种方法会有一些陷阱:

1、只能每次运行一个mysqlbinlog命令,一次对一个binlog文件执行重放,无法并行多命令运行,因为在执行重放的时候会产生一个临时表,会有冲突,造成失败。

2、它是一个原子操作。如果它在运行到半途中间的时候失败,将很难知道它在哪失败,也很难基于先前的时间点重新开始。导致失败的理由会有很多:一些并发事务引起的Innodb lock wait timeout ,server和client设置的max_allowed_packet不同,以及查询过程中失去跟mysql server的连接,等等。

方法三:空间换时间,加速binlog回放

由于回放binlog有一些限制,于是翻了翻Percona的博客,找到一种方法,看了看精髓,就大概记录了下来,大体思路如下:

1、准备2台额外机器,这里简称A、B,A服务器用做备份数据的恢复,B服务器用于将原主的binlog拷贝至该服务器

2、在B服务器启动空实例,然后用原主库的binlog替换自动生成的binlog,模拟原主

3、然后服务器A与服务器B建立主从关系,A服务器是从库,B服务器是主库,修改B服务器的Server-id和原主库一致,然后在A服务器上change master to B服务器,位置点位从备份文件中取,分别取xtrabackup_binlog_info中的binlog和binlog pos

4、start slave开启主从复制,然后同步至误操作点停止,这里可以利用到MySQL的并行复制,binlog的应用就会有加速效果

5、将恢复的表,导出,然后恢复至生产原主。

附录:

Percona官网上给的具体的步骤翻译过来如下:

1、准备一台机器,用于将该实例的最新备份的结果数据,进行备份还原

2、准备另外一台机器了,新实例,将原master的binlog文件,拷贝至该实例的数据目录下, 启动一个空实例(server-id跟原主一致, --log_bin=master-bin binlog文件名保持跟原主一致;),然后停掉它,删除所有它自动创建的binlogs,解压缩并拷贝所有需要的binlogs(来自于原生产实例)到它的数据目录下,然后重新启动它。

最新备份数据的位置:

如果启动正常,则连接mysql,查看binlog相关信息:

3、建立同步关系,并同步到误操作动作的位置前停止

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CHANGE MASTER TO 
MASTER_HOST='127.0.0.1',
MASTER_PORT=3307,
MASTER_USER='root',
MASTER_PASSWORD='secret',
MASTER_LOG_FILE='master-bin.000007', MASTER_LOG_POS=1518932;

START SLAVE UNTIL 
MASTER_LOG_FILE = 'log_name', 
MASTER_LOG_POS = log_pos  
或者 
START SLAVE SQL_THREAD UNTIL
SQL_AFTER_GTIDS =3E11FA47-71CA-11E1-9E33-C80AA9429562:11-56

SHOW SLAVE STATUSG

总结:

整个过程中,相当于多用了2台服务器(其实这个可以缩减成1台),提高二进制日志的应用速率,提高二进制日志的应用的成功率。

按照文章中作者讲述的思想来看,是比单实例应用binlog的方法好,因为一旦发生了应用binlog过程中的错误,它能够快速确定是在那个点位发生的错误,有助于我们快速解决问题。

具体操作没有实践,有兴趣的同学可以实践一下

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
你问这谁会啊?ThreadLocal 父子线程之间该如何传递数据?
忘记之前是哪个公司面试的时候问到的,并不是一个常见的问题,我当时也没回答正确,就按照线程通信那一套比如什么 synchronized、Locks、volatile 啥的 XJB 说的,面试完找了些资料今天整理了下分享给大家~
飞天小牛肉
2023/01/16
5660
ThreadLocal的plus版--InheritableThreadLocal
我们知道ThreadLocal可以实现线程级别下的数据隔离,但是如果需要将当前线程的值传递给子线程,是需要自己去写逻辑实现的,会比较复杂。而InheritableThreadLocal帮助我们解决了这个问题。本篇文章就和大家一起聊聊InheritableThreadLocal。
Java进阶之路
2022/08/03
2870
ThreadLocal的plus版--InheritableThreadLocal
ThreadLocal全解析——你想要的这里都有
ThreadLocal,即线程变量,是一个以ThreadLocal对象为键,任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程可以通过ThreadLocal对象查询到绑定在这个线程上的一个值。
用户5325874
2021/12/07
5220
ThreadLocal全解析——你想要的这里都有
ThreadLocal父子线程数据传递方案(修正篇)
介绍InheritableThreadLocal之前,假设读者对 ThreadLocal 已经有了一定的理解,比如基本概念、原理等。在讲解之前我们先列举有关ThreadLocal的几个关键点。
Bug开发工程师
2018/07/23
6.6K0
ThreadLocal父子线程数据传递方案(修正篇)
ThreadLocal父子线程数据传递方案
介绍InheritableThreadLocal之前,假设对 ThreadLocal 已经有了一定的理解,比如基本概念、原理。在讲解之前我们先列举有关ThreadLocal的几个关键点。
Bug开发工程师
2018/07/23
1.7K1
ThreadLocal父子线程数据传递方案
探索JAVA并发 - ThreadLocal
SimpleDateFormat是我们常用的日期格式化工具,但熟悉的朋友都知道它是线程不安全的。
acupt
2019/08/26
4220
ThreadLocal (下) 继承性问题解决,以及具体实现原理
通过以上例子可以看到,同一个ThreadLocal变量在父线程中设置值后,在子线程是取不到的。根据上节的介绍,这应该是正常现象。因为子线程thread里面调用get方法时当前线程为thread线程,而这里调用set方法设置的变量时main线程,两者是不同线程,自然子线程访问时放回null。那么有没有办法让子线程能访问到父线程中的值,当然是有的哈哈哈!
YanL
2020/04/26
1.7K0
ThreadLocal (下) 继承性问题解决,以及具体实现原理
ThreadLocal与InheritableThreadLocal
InheritableThreadLocal继承自ThreadLocal , 也只重写了它里面的几个方法 , 实现的方式也是通过在线程创建的时候 , 会在Child线程构造函数中将Parent线程中的值复制到本线程的ThreadLocalMap中 , 所以在父子线程中访问同一个对象可以得到同一个值.
None_Ling
2020/08/11
1.5K0
InheritableThreadLocal源码阅读
在进行多线程编程时,我们经常需要线程池子线程和父线程进行ThreadLocal信息传递,实现一些业务处理。 先看一个例子 public class App { static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>(); public static void main(String[] args) { threadLocal.set(new Integer(123)); Thread
春哥大魔王
2018/04/17
6880
ThreadLocal的进化——InheritableThreadLocal
之前有介绍过 ThreadLocal,JDK 后来针对此做了一个升级版本 InheritableThreadLocal,今天就来好好介绍下。
健程之道
2019/12/18
3360
一文吃透ThreadLocal的前世与今生
ThreadLocal在日常工作中的使用频率还是很高的,但是大多使用场景比较单一,而且使用不当的情况下,会出现内存泄露的情况。
柏炎
2022/08/23
3680
一文吃透ThreadLocal的前世与今生
面试官再问你 ThreadLocal,就这样狠狠 “怼” 回去!
这个回答一定要足够自信:必须用过啊,无论是在平时的业务开发过程中会用到,其他很多三方框架中也都用到了 ThreadLocal。
猿天地
2021/03/26
6250
面试官再问你 ThreadLocal,就这样狠狠 “怼” 回去!
ThreadLocal和InheritableThreadLocal深入分析
  通过ThreadLocal和InheritableThreadLocal,我们能够很方便的设计出线程安全的类。JDK底层是如何做到的呢?ThreadLocal和InheritableThreadLocal有什么区别呢与联系呢?为什么有了ThreadLocal类还需要InheritableThreadLocal类,他们与Thread类是什么关系?带着这些问题我们来分析他们的源码。
良辰美景TT
2018/09/11
8730
ThreadLocal和InheritableThreadLocal深入分析
java(8)--线程ThreadLocal详解
在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 在JDK5.0以后,ThreadLocal已经支持泛型,ThreadLocal类的类名变为ThreadLocal<T>。从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思。
黄规速
2022/04/14
6.3K0
java(8)--线程ThreadLocal详解
InheritableThreadLocal类原理简介使用 父子线程传递数据详解 多线程中篇(十八)
在上面的测试代码中,主线程中创建了两个变量,类型分别为:ThreadLocal和InheritableThreadLocal
noteless
2019/03/15
8510
宇智波程序笔记8-【高并发】ThreadLocal学会了这些,你也能和面试官扯皮了!
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
不会飞的小鸟
2020/08/26
3090
每日一博 - ThreadLocal VS InheritableThreadLocal VS TransmittableThreadLocal
多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。
小小工匠
2021/08/17
8070
每日一博 - ThreadLocal VS InheritableThreadLocal VS TransmittableThreadLocal
ThreadLocal 类精讲
Context,上下文,其通常指能够提供环境、临时存储数据的实例。ThreadLocal 是一种上下文实例,Thread 可以通过调用其 set() 以及 get() 方法轻松地存取数据实例,如下代码案例所示:
Fisherman渔夫
2020/04/23
9870
ThreadLocal 类精讲
Java并发-ThreadLocal
每个线程内部都有一个ThreadLocalMap,每个ThreadLocalMap里面都有一个Entry[]数组,Entry对象由ThreadLocal和数据组成。
lpe234
2021/03/02
4600
TransmittableThreadLocal在使用线程池等会缓存线程的组件情况下传递ThreadLocal
TransmittableThreadLocal 是Alibaba开源的、用于解决 “在使用线程池等会缓存线程的组件情况下传递ThreadLocal” 问题的 InheritableThreadLocal 扩展。若希望 TransmittableThreadLocal 在线程池与主线程间传递,需配合 TtlRunnable 和 TtlCallable 使用。
chinotan
2019/06/16
1.7K0
推荐阅读
相关推荐
你问这谁会啊?ThreadLocal 父子线程之间该如何传递数据?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验