Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL数据快速恢复的一些思考

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

作者头像
AsiaYe
发布于 2022-05-17 02:14:30
发布于 2022-05-17 02:14:30
65900
代码可运行
举报
文章被收录于专栏: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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一种基于时间点的快速恢复方案
之所以有这样一篇文章,是因为在前几天的一个晚上,要下班的时候,业务方忽然有一个需求,是需要恢复一个表里面的数据,当时问了下情况,大概是这样的:业务方不小心在一个表里面做了一个update的操作,可能是where条件没有写对,导致表里面的数据被写坏了,但是数据目前还没有落盘,只是在内存中的值修改了,现在要求恢复到之前的数据。万幸,这份数据是平台上某些商品的价格,基本上是有限个商品,然后价格值也都是固定的,之前有对这个价格表进行备份,于是给他直接重新导入了一份价格表的数据,这个问题也算是解决了。
AsiaYe
2019/11/06
6240
一种基于时间点的快速恢复方案
使用Xtrabackup对MySQL做主从复制
mysqldump对于导出10G以下的数据库或几个表,还是适用的,而且更快捷。一旦数据量达到100-500G,无论是对原库的压力还是导出的性能,mysqldump就力不从心了。Percona-Xtrabackup备份工具,是实现MySQL在线热备工作的不二选择,可进行全量、增量、单表备份和还原。(但当数据量更大时,可能需要考虑分库分表,或使用 LVM 快照来加快备份速度了)。 2.2版本xtrabackup能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份,innobackupex通过perl封装了一层xtrabackup,对MyISAM的备份通过加表读锁的方式实现。2.3版本xtrabackup命令直接支持MyISAM引擎。
阿dai学长
2019/04/03
2.4K0
MySQL备份与主备配置
例如:如果使用 Navicat、PHPMyAdmin 之类的可视化工具,可以直接点击转储 SQL 文件,或者导出 SQL 文件之类的功能。
凝神长老
2020/04/17
2.1K0
MySQL备份与主备配置
MySQL5.7下面,误操作导致的drop table db1.tb1; 的恢复方法:
MySQL5.7下面,误操作导致的drop table db1.tb1; 的恢复方法:
保持热爱奔赴山海
2019/09/17
6320
MySQL备份与主备配置
例如:如果使用 Navicat、PHPMyAdmin 之类的可视化工具,可以直接点击转储 SQL 文件,或者导出 SQL 文件之类的功能。
凝神长老
2020/04/15
1.8K0
揭秘MySQL主从数据不一致
目前MySQL数据库最常用的是主从架构,大多数高可用架构也是通过主从架构演变而来。但是主从架构运行时间长久后容易出现数据不一致的情况,比如因从库可写造成的误操作或者复制bug等,本篇文章将会详细探究出现主从不一致及如何解决这种问题。
MySQL技术
2019/09/29
2.1K0
删库不跑路:论MySQL数据恢复
日常工作中,总会有因手抖、写错条件、写错表名、错连生产库造成的误删库表和数据的事情发生,那么,如果连数据都恢复不了,还要什么 DBA。
JavaFish
2020/07/21
1.7K0
删库不跑路!我含泪写下了 MySQL 数据恢复大法…
点击关注公众号,Java干货及时送达 作者:程淇铭 来源:segmentfault.com/a/1190000020116271 日常工作中,总会有因手抖、写错条件、写错表名、错连生产库造成的误删库表和数据的事情发生,那么,如果连数据都恢复不了,还要什么 DBA。 相关文章 MySQL备份策略:https://segmentfault.com/a/1190000019955399 MySQL数据恢复:https://segmentfault.com/a/1190000020116271 1 前言 数据恢
Java技术栈
2022/03/18
7030
企业实战(9)Mysql数据库实现主从同步,看这一篇就够了!
当master服务器上的数据发生改变时(增、删、改),则将其改变写入二进制binlog日志中;slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开启一个I/O 线程请求master二进制事件,同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从库本地的中继日志中,从库(从节点)将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后IO线程和SQL线程将进入睡眠状态,等待下一次被唤醒。
非著名运维
2022/06/22
1.6K0
企业实战(9)Mysql数据库实现主从同步,看这一篇就够了!
恢复误操作的方法
前一段时间接二连三的出现开发人员在测试环境和生产误操作导致数据库误删除/更新,对DBA而言,回滚数据着实是一件头疼的事情,凡涉及到恢复线上数据必然对应用带来一定的影响。大多数情况是开发误操作delete数据,update多数行,根据之前的操作经验,本文介绍常用的恢复方法。
用户1278550
2018/08/09
8620
MySQL实战第三十一讲- 误删数据后除了跑路,还能怎么办?
在前面几篇文章中,我们介绍了 MySQL 的高可用架构。当然,传统的高可用架构是不能预防误删数据的,因为主库的一个 drop table 命令,会通过 binlog 传给所有从库和级联从库,进而导致整个集群的实例都会执行这个命令。
越陌度阡
2022/05/06
6720
MySQL实战第三十一讲- 误删数据后除了跑路,还能怎么办?
MySQL单表恢复步骤详解
午休正酣,一个电话打散了睡意。电话那头的第一句话便是“开发童鞋写update SQL的时候忘了加where条件了!”相信每一名DBA,听到这个消息,心里都会有一种想骂街的冲动!万幸的是,只是单表写花了,而不是哪位大神在DB里面玩drop table。虽然已经很久没进行单表恢复了,但大致步骤都还在脑海中,没花多久就搞定了~
田维常
2020/04/14
2.5K0
MySQL复制性能优化和常见问题分析
二进制日志文件并不是每次写的时候都会同步到磁盘,当发生宕机的时候,可能会有最后一部分数据没有写入到binlog中,这给恢复和复制带来了问题。当sync_binlog=1表示每写缓冲一次就同步到磁盘,表示同步写磁盘的方式来写binlog。也就是说每当向MySQL提交一次事务,MySQL将进行一次fsync之类的磁盘同步命令来将binlog_cache的数据强制刷到磁盘中sync_binlog的值默认为0,sync_binlog=0时表示采用操作系统机制进行缓冲数据同步。采用sync_binlog=1时,会增加磁盘IO的次数,会影响写入性能。sync_binlog=1时,并不是100%安全,会存在相应的问题。比如说使用Innodb引擎时,在一个事务发出commit前,会将binlog立即刷到磁盘中。如果这时候已经写入到binlog中,但是还没有提交就已经挂了,那么MySQL重启时,会将通过Redo log、Undo log将这个事务回滚掉,但是binlog已经记入了该事务信息,不能回滚掉。所以我们需要设置innodb_support_xa=1确保MySQL服务层的binlog和MySQL存储引擎层的Redo log、Undo log之间的数据一致性。
用户2032165
2018/12/07
1.3K0
MySQL复制性能优化和常见问题分析
mysql 中的备份恢复、分区分表、主从复制、读写分离
✨ mysql 的备份和恢复 创建备份管理员 创建备份管理员,并授予管理员相应的权限 备份所需权限:select,reload,lock tables,replication client,show view,event,process # 创建管理员 create user 'backup'@'localhost' identified by '123456'; # 给管理员授权 grant select,reload,lock tables,replication client,show view,
江户川码农
2022/08/16
3.5K2
mysql 中的备份恢复、分区分表、主从复制、读写分离
4-MYSQL容备与入坑
1.容灾备份恢复必备条件 MySQL 数据库开启了log-bin参数记录binlog日志功能,且主库于备份的从库都要开启binlo功能。
全栈工程师修炼指南
2022/09/28
2K0
4-MYSQL容备与入坑
MySQL主从复制详解
在MySQL中,主从架构应该是最基础、最常用的一种架构了。后续的读写分离、多活高可用架构等大多都依赖于主从复制。主从复制也是我们学习MySQL过程中必不可少的一部分,关于主从复制的文章有很多,笔者也来凑凑热闹,写写这方面的内容吧,同时分享下自己的经验和方法。
MySQL技术
2020/07/28
4510
MySQL主从复制详解
MySQL 主从复制原理与问题
MySQL 主从复制(Master-Slave Replication)是一种常见的数据库复制技术,它在数据库管理中发挥着重要的作用,有以下几个主要用途:
恋喵大鲤鱼
2024/05/24
2900
MySQL 主从复制原理与问题
MySQL主从复制虽好,能完美解决数据库单点问题吗?
2、从库的IO线程在指定位置读取主库binlog内容存储到本地的中继日志(Relay Log)中
lyb-geek
2019/03/07
2.4K0
MySQL主从复制虽好,能完美解决数据库单点问题吗?
MYSQL主从同步(DBA)配置.md
Q:为啥要引入主从同步机制? A:防止业务数据库突然宕掉,不能快速的恢复业务正常运行,有利于数据库架构的健壮性,提升访问速度,方便运维保证的数据物理安全(容灾备份);
全栈工程师修炼指南
2022/09/28
1.1K0
MYSQL主从同步(DBA)配置.md
31 | 误删数据
如果是使用 delete 语句误删了数据行,可以用 Flashback 工具通过闪回把数据恢复回来。 Flashback 恢复数据的原理,是修改 binlog 的内容,拿回原库重放。而能够使用这个方案的前提是,需要确保 binlog_format=row 和 binlog_row_image=FULL。
HaC
2020/12/30
7040
相关推荐
一种基于时间点的快速恢复方案
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验