Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL数据被误删怎么办?

MySQL数据被误删怎么办?

原创
作者头像
王二蛋
发布于 2024-01-30 09:08:50
发布于 2024-01-30 09:08:50
6920
举报
文章被收录于专栏:MySQLMySQL

前言

很多年前,被公司外派到一家单位驻场开发一个OA项目,两个开发对接各部门的需求,需求还要及时生效(一边开发一边使用)。

有一次生产环境的一个bug本地没办法复现,由于没有测试人员,也就不存在测试环境,所以本地连了生产库去调试。不出意外的话要出意外了:在调试的过程中,我俩当作开发环境很自然的把数据给删了。

作为一名只会CRUD的小白怎么会恢复数据这么高级的操作,不过还好,经过我俩一小时的百度,在各种ctrl+c、ctrl+v的命令操作下,最终成功的把数据恢复了。

如果我当时了解数据备份恢复,也不至于这么手忙脚乱的,所以程序员掌握数据的备份恢复操作还是很重要的。最近正好在输出MySQL系列文章,所以在这里记录一下MySQL数据备份和恢复的方法及操作,希望可以帮助到跟我一样的小伙伴。

数据备份恢复工具

MySQL自带了一个数据备份的客户端mysqldump,使用mysqldump可以基于现状生成一组SQL语句(建表语句、insert语句),在数据丢失时可以通过执行这些SQL语句恢复到原始状态,从而达到备份恢复效果。但是,当数据量很大的时候,这种方式就不是很适合了,因为mysqldump是单线程执行,过多的SQL执行会使整个恢复过程过于缓慢。

所以,基于此痛点,就诞生了一款开源的多线程备份恢复工具 mydumper,其特点就是多线程、快, 具体可以前往博客进行了解,这篇博客介绍的非常的详细,这里就不多赘述。

以上两种工具都属于逻辑备份,何为逻辑备份?就是数据通过SQL语句的形式进行备份和恢复,总的来说执行速度会很慢。

还有一种物理备份方式,简单来说就是直接将表数据.ibd文件、binlog、redolog等物理文件直接copy备份,相对逻辑备份来讲物理备份速度会快很多,目前常用的物理备份工具有PXB(Percona XtraBackup) 以及MySQL8.0推出的新特性 Clone Plugin ,感兴趣的可以自行前往了解。

数据备份策略

为了避免误操作导致数据被删除,通常在生产环境中会制定数据备份策略,比如用什么工具,备份周期是一天一次还是一周一次,每次备份是全量还是增量等,这个取决于数据的重要性、数据的变动频率、备份成本等方面的需求。

下面将基于MySQL自带的mysqldump进行数据备份,并演示一下数据被误删后的恢复操作。

数据备份恢复演示

备份前先看一下当前的数据情况。

备份数据

在使用mysqldump的时候根据自己的备份需求加一堆参数,比如下面这条命令:

代码语言:shell
AI代码解释
复制
mysqldump -uroot -pLeYk2qwd -h 127.0.0.1 -P3306 -A -R  --triggers --master-data=2  --single-transaction  > /backup/full.sql
  • -u -p -h -P就不用说了,毕竟作为一个客户端,连接MySQL服务还是需要用户名密码验证的。
  • -A 是用来备份这个MySQL实例所有的库,如果要备份单个库,参数为 ‘-B db1 db2’
  • -R 是用来备份存储过程及函数。
  • --triggers 用来备份触发器。
  • --master-data=2 的作用是:在备份时记录binlog的状态信息,这个后面会用到。
  • --single-transaction 的作用是:直接备份可能会因为时间过长而导致锁等待问题。为了避免这种情况,该参数对InnoDB引擎的表数据进行快照备份,减少锁等待的同时也保证了数据一致性

更多的参数使用请参考官方文档

执行上面的命令后就会得到一份sql备份文件。

一般数据量级在100G左右,备份时间大约在30分钟左右,所以数据量很大的情况下建议物理备份。

模拟数据误删

执行备份命令成功后进行删库或删表操作,模拟误删场景

代码语言:sql
AI代码解释
复制
drop database test;

可以看到test库已经被删除。

恢复备份的数据

接下来就可以执行恢复数据命令,将刚才备份的/backup/full.sql进行恢复,命令如下:

代码语言:sql
AI代码解释
复制
set sql_log_bin=0;
source /backup/full.sql;

set sql_log_bin=0;是将binlog日志记录进行关闭,否则数据恢复时所执行的sql语句也会被记录到binlog中,binlog是不需要记录恢复的操作。

命令执行成功后,刚才被删的库以及表数据就被恢复了。

恢复未备份的数据

在实际应用中,恢复数据不是这么简单的,因为备份操作基本上不会是实时的,如果昨天备份数据,今天误删了数据,那么在这之间的数据如何恢复?

这个时候就体现出binlog的作用了,之前的文章介绍过,binlog会记录所有的增删改操作,所以,未备份的数据就可以通过binlog进行恢复。如何恢复呢?

上面说到,mysqldump命令中有一个参数:--master-data=2,加上这个参数后,会在备份的sql文件中记录此次备份的数据位于binlog的位置,如下图

MASTER_LOG_FILE 的意思是此次的备份已经到‘mysql-bin.000004’这个文件了,备份最末端的数据在文件中的偏移量为MASTER_LOG_POS=2548

基于这个信息,我们可以知道:<font color='red' size='4'> 未备份的数据位于binlog偏移量为MASTER_LOG_POS至误删操作的偏移量。 </font>

通过命令mysqlbinlog /data/mysql/mysql-bin.000004 或者 show binlog events in 'mysql-bin.000004'可以看到未备份数据的偏移量。如下图

为了演示“恢复未备份的数据”,我在account表中添加几条数据,然后再进行「删库->恢复备份的数据->恢复未备份的数据」的操作。备份状态如下图

再次执行恢复命令后,会发现新添加的这两条数据不存在。

此时,备份的数据和binlog的状态对应如下图

然后先执行以下命令将未备份的数据SQL语句导出来

代码语言:shell
AI代码解释
复制
mysqlbinlog --start-position=2770 --stop-position=3327 /data/mysql/mysql-bin.000004 >/backup/bin.sql 

再登录到mysql服务执行以下命令即可恢复到删库前的状态。

代码语言:sql
AI代码解释
复制
set sql_log_bin=0;
source /backup/bin.sql
set sql_log_bin=1;

至此,在误删操作后,数据就恢复成功了。

可能会有人问“binlog也被删除了呢?怎么恢复?”,这个就涉及到主从复制、高可用模式了。下篇文章会介绍,感兴趣的话点点关注吧。

在这要说明一下,MySQL5.7后默认开启了GTID(全局事务标识符)特性,用于简化 MySQL 主从复制和故障恢复,也可以应用到刚才的恢复未备份的数据中。跟基于偏移量导出binlog相比,执行基于gtid的sql可以保证唯一性、幂等性,功能更丰富。操作与偏移量相似,这里就不演示了,贴一个相关的命令作为参考

代码语言:shell
AI代码解释
复制
-- 导出gtid为1至10,不包括6和9的sql语句,
mysqlbinlog --skip-gtids --include-gtids='xxxxxxx-1xxxx-xxxx-0xxxxxx:1-10' --exclude-gtids='xxxxxxx5-axxxx-1xxx-8xxx-0xxxx:6','48xxxx5-axxx-1xxa-xxxxxx:9' mysql-bin.000004 >/backup/bin.sql 

总结

mysqldump只是进行了数据的备份,无法做到完全的恢复,在恢复数据时还要借助binlog对未及时备份的数据进行恢复。

虽然现在许多公司倾向于使用云端的高可用性集群数据库,忽略了对备份恢复操作的关注,但为了安全起见,仍需掌握数据备份与恢复的操作。这样可以在突发情况下,可以采取应对措施,减少事故带来的损失。

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL备份恢复
逻辑备份工具。文本形式保存备份,可读性较强。 备份逻辑: 将建库、建表、数据插入语句导出,包存至一个sql文件中。 比较适合于:数据量较小的场景,单表数据行千万级别以内。百G以内的小型数据库.跨版本、跨平台迁移。 可以本地、可以远程备份。 注意: 一般情况下,恢复需要耗费的时间是备份耗费时间的3-5倍。
云计算小黑
2022/12/28
13.8K0
mysql日志管理
log_bin binlog的开关和binlog的前缀
萧晚歌
2022/03/11
1.8K0
mysql数据库基本操作语句,模拟误删数据恢复
作为小站长,mysql数据库算是比较常用的了。作为运维,肯定遇到过数据被误删的情况。下面模拟数据库为误操作删除后的恢复过程。
IT不难
2022/04/23
2K0
mysql数据库基本操作语句,模拟误删数据恢复
MySQL主从复制原理与实践:从配置到故障监控
上文《MySQL数据被误删怎么办?》介绍了MySQL在故障或者误删数据后,可以通过备份+binlog的方式进行数据恢复。但是,当备份文件和binlog都丢失了呢?所以单节点是不可靠的,为了避免单节点故障带来的数据丢失以及MySQL服务的可用性,生产环境通常都是采用高可用或者集群模式。而在这背后则离不开主从复制技术,所以本文对主从复制的原理和操作展开介绍,从而全面了解这一技术。
王二蛋
2024/02/01
1.1K0
Mysql备份系列(1)--备份方案总结性梳理
mysql数据库备份有多么重要已不需过多赘述了,废话不多说!以下总结了mysql数据库的几种备份方案: 一、binlog二进制日志通常作为备份的重要资源,所以再说备份方案之前先总结一下binlog日志~~ 1.binlog日志内容 1)引起mysql服务器改变的任何操作。 2)复制功能依赖于此日志。 3)slave服务器通过复制master服务器的二进制日志完成主从复制,在执行之前保存于中继日志(relay log)中。 4)slave服务器通常可以关闭二进制日志以提升性能。 2.binlog日志文件的文
洗尽了浮华
2018/01/23
3.4K0
Mysql之binlog日志说明及利用binlog日志恢复数据操作记录
众所周知,binlog日志对于mysql数据库来说是十分重要的。在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 废话不多说,下面是梳理的binlog日志操作解说: 一、初步了解binlog MySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了所有的DDL和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。 ---------
洗尽了浮华
2018/01/22
3.1K0
4-MYSQL容备与入坑
1.容灾备份恢复必备条件 MySQL 数据库开启了log-bin参数记录binlog日志功能,且主库于备份的从库都要开启binlo功能。
全栈工程师修炼指南
2022/09/28
2K0
4-MYSQL容备与入坑
MySQL数据库备份实操
当前xtrabackup的8.0.13已经支持 mysql 8.0.20版本(8.0.20版本对innodb的数据文件模式进行了修改)
技术路漫漫
2020/07/20
1.1K0
mysql的备份及恢复
我们试着想一想, 在生产环境中什么最重要?如果我们服务器的硬件坏了可以维修或者换新, 软件问题可以修复或重新安装, 但是如果数据没了呢?这可能是最恐怖的事情了吧, 我感觉在生产环境中应该没有什么比数据跟更为重要. 那么我们该如何保证数据不丢失、或者丢失后可以快速恢复呢?
用户4877748
2020/07/22
6850
Mysql-12-mysql的备份和恢复
1.数据库的备份   备份=拷贝加管理,防止数据的丢失同时记录用户的操作记录。其中最有效的备份是对IT架构进行备份。 原则: (1)数据库要定期备份,备份的周期应当根据应用数据系统可承受的恢复时间,而且定期备份的时间应当在系统负荷最低的时候进行。对于重要的数据,要保证在极端情况下的损失都可以正常恢复。 (2)定期备份后,同样需要定期做恢复测试,了解备份的正确可靠性,确保备份的有意义的、可恢复的。 (3)根据系统需要来确定是否采用增量备份,增量备份只需要备份每天的增量数据,备份花费的时间少,对系统负载的压力也
用户1173509
2018/01/17
1.6K0
Mysql-12-mysql的备份和恢复
MySQL二进制日志截取和恢复
在打印出来的信息中可以看到event事件的开始和结束号码,它可以方便我们从日志中截取想要的日志事件
云计算小黑
2022/12/28
1.5K0
Mysql 备份的三种方式
备份的本质就是将数据集另存一个副本,但是原数据会不停的发生变化,所以利用备份只能恢复到数据变化之前的数据。那变化之后的呢?所以制定一个好的备份策略很重要。
全栈程序员站长
2022/07/02
1.3K0
mysql数据库备份方法_oracle数据库备份文件格式
2、备库执行 start slave 命令,备库启动两个线程:I/O thread 和 SQL thread
全栈程序员站长
2022/11/15
1.2K0
mysql数据库备份方法_oracle数据库备份文件格式
Mysql 备份恢复与xtrabackup备份
  备份是数据安全的最后一道防线,对于任何数据丢失的场景,备份虽然不一定能恢复百分之百的数据(取决于备份周期),但至少能将损失降到最低。衡量备份恢复有两个重要的指标:恢复点目标(RPO)和恢复时间目标(RTO),前者重点关注能恢复到什么程度,而后者则重点关注恢复需要多长时间。
惨绿少年
2019/05/24
16.5K0
DML 误操作?MySQL 闪回工具大盘点
作者:雷文霆,爱可生华东交付服务部 DBA 成员,主要负责 MySQL 故障处理及相关技术支持。爱好看书,电影。座右铭,每一个不曾起舞的日子,都是对生命的辜负。 ----
爱可生开源社区
2025/04/09
2430
DML 误操作?MySQL 闪回工具大盘点
mysql数据库误删除后的数据恢复操作说明
在日常运维工作中,对于mysql数据库的备份是至关重要的!数据库对于网站的重要性使得我们对mysql数据的管理不容有失! 然后,是人总难免会犯错误,说不定哪天大脑短路了来个误操作把数据库给删除了,怎么办??? 下面,就mysql数据库误删除后的恢复方案进行说明。 一、工作场景 (1)MySQL数据库每晚12:00自动完全备份。 (2)某天早上上班,9点的时候,一同事犯晕drop了一个数据库! (3)需要紧急恢复!可利用备份的数据文件以及增量的binlog文件进行数据恢复。 二、数据恢复思路 (1)利用全备的
洗尽了浮华
2018/01/22
5.1K0
03 . MysSQL权限和备份
恢复时间点之前首先将全量备份恢复之后,在此基础上回放增加的binlog直至指定的时间点
iginkgo18
2020/09/27
8540
高逼格企业级MySQL数据库备份方案,原来是这样....
很多人,这里说的是运维工程师们,一提到写某某方案,很是头疼。不是上某度一统搜索,就是同样一句话在N个群全部群发一遍:“有没有某某方案,可以共享一下的吗??求助,各位大佬们”,估计十有八九,全部石沉大海,杳无音讯。
数据和云
2019/05/29
1.6K0
从删库到恢复:MySQL Binlog实战手册
“删库跑路”曾是程序员圈子里经久不衰的段子,但现实中误删数据的后果可能是灾难性的——客户投诉、业务中断甚至更严重的后果。所幸,MySQL的Binlog为数据恢复提供了“后悔药”。本今天带大家结合实战案例,给大家分享如何利用mysqlbinlog工具实现精准数据回滚,感兴趣的朋友可以来了解一下!
小明互联网技术分享社区
2025/09/02
1920
从删库到恢复:MySQL Binlog实战手册
MySQL备份与主备配置
例如:如果使用 Navicat、PHPMyAdmin 之类的可视化工具,可以直接点击转储 SQL 文件,或者导出 SQL 文件之类的功能。
凝神长老
2020/04/17
2.2K0
MySQL备份与主备配置
相关推荐
MySQL备份恢复
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档