十年难得一遇!从数据误删到全量恢复的惊险记录

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 线上的数据库服务我们有完善的备份策略和恢复预案,数据即使被误删除了也是能够恢复的,误删除的数据量恢复只是时间问题。但各位同学自己部署的测试环境或者是在自己电脑中的开发环境的数据库就没有同级别的资源保障了。如果恰好你又把一些不能丢失的数据放到了这种环境中,那么建议要做定期备份,有备才能无患。

云栖号资讯:【点击查看更多行业资讯
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!

引言

线上的数据库服务我们有完善的备份策略和恢复预案,数据即使被误删除了也是能够恢复的,误删除的数据量恢复只是时间问题。但各位同学自己部署的测试环境或者是在自己电脑中的开发环境的数据库就没有同级别的资源保障了。如果恰好你又把一些不能丢失的数据放到了这种环境中,那么建议要做定期备份,有备才能无患。

今天给大家分享的案例便是这种在线下自搭建环境的一次数据误删除事件。数据不幸被删除和万幸能被全量恢复可谓十年一遇。

事件背景

测试环境中的一台服务器准备做迁移替换,小 A 同学接到了这个光(危)荣(险)的任务。小 A 选择了直接 rm -rf /mysql 删除这台机器上挂载的数据分区来清理磁盘空间。

不到两分钟,还在挑灯夜战的某位同学就发现一个常用的测试环境无法正常使用了。这时候的小 A 定是心如止(死)水(灰),还是找 DBA 帮忙看看吧。

值班 DBA 小 D 被电话叫起紧急支援,但小 D 登录到服务器上一看也淡(傻)定(眼)了,数据、日志、软件环境统统都被删除了,唯一的一次备份是一年前升级测试环境数据库时做的备份。给 DBA 老 A 打电话吧,问问他的建议。

恢复经历

一旦发生了误删数据先不要慌,停止所有操作,第一时间寻求帮助。即使您是老司机,这时候也要找一位同学帮忙一起观察后续的操作,避免手抖出现再次误操作。

另外要强调的是,在出现数据误删除的服务器上同时只能有一个人操作,其他人应通过桌面共享软件或站在操作人身后观察,避免多人交叉操作出现二次故障。

1、找回数据文件
老 A 在得知数据、日志和软件环境都被删除后,先使用了 ps 命令查看 mysqld 进程是否还存活。

fa8b66992eac4922fc24cf299a74017c

进程还在,这就有戏了,不幸中的万幸。抓紧到 /proc/${pid}/fd 目录看看有没有还未关闭的表可以抢救。

f0dbd59d28b29bae1fb730f9e8e72b17

真是太幸运了,这个测试环境里面的表比较少,所有表的数据文件还都是打开状态。数据被找回的概率就很大了。接下来就是如何把这些显示为 deleted 的文件从文件系统中找回了。

在介绍如何找回被删除的文件前,先来介绍一个运维经常会遇到的删除了文件,但磁盘空间不释放的问题。下图是一个模拟的例子,当 test.txt 文件被 tail -f 命令使用时,rm test.txt 并不会释放空间,当将 tail -f 命令 ctrl+c 中止后,磁盘空间才释放。

910bccfe7a4cd1a359b636376f121d1b

一个文件在文件系统中的存放分为两个部分:数据部分和指针部分,指针位于文件系统的 meta-data 中,数据被删除后,这个指针就从 meta-data 中清除了,而数据部分存储在磁盘中,数据对应的指针从 meta-data 中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容,之所以出现删除 test.txt 文件后,空间还没释放,就是因为 tail -f 进程还在一直打开这个文件句柄,文件对应的指针部分由于进程锁定,并未从 meta-data 中清除。由于指针并未被删除,那么系统内核就认为文件并未被删除,因此通过 df 命令查询空间并未释放。

有了之前遇到的类似经验我们知道,MySQL 被删除的数据由于句柄还在打开状态,因此还未完成删除,是可以被找回的,已经关闭的表就无法找回了。找回的方法也比较简单,直接 cat 对应的文件句柄,再通过管道(pipe)或输出重定向的方式即可找回原来的数据文件了。但要注意的是为了保证原来的磁盘不要再被写入新的数据,不要在原分区下做磁盘写操作。这次的环境是部署在云服务器上的,再挂载一块新的云盘到这台服务器上就能把数据文件找回了,找回方式如下图所示:

f0dbd59d28b29bae1fb730f9e8e72b17

如果读者使用的是自己的笔记本,可以插一块 U 盘或移动硬盘,将数据拷贝到 U 盘或移动硬盘;如果使用的是物理机可以考虑使用管道给 netcat 命令把数据文件传输到另外一台服务器。如下图所示:

3b95de7be6ff1e0aac2418bad18bf85e

表比较多的话建议写个脚本进行批量修复,注意提前分好目录结构,把对应句柄的文件直接恢复到指定的目录,便于后续处理。数据文件找回来啦!!!

2、恢复数据文件
数据文件已经找回了,已经算是完成了一半,至少业务的数据都在这些文件里面,但独立的 ibd 文件是无法被 MySQL 识别的,需要配合表结构定义文件(MySQL 5.7 之前为 frm 文件)才可使用。老 A 咨询了业务同学,他们使用的是开源的服务,可以在其他环境上再部署一套,这样就顺利的拿到了这个服务的建表语句。

MySQL 5.6 以上版本支持通过 ALTER TABLE xxx DISCARD TABLESPACE 和 ALTER TABLE xxx IMPORT TABLESPACE 的方式来删除和导入表空间文件(ibd 数据文件)。而我们这次的测试环境刚好是 5.7 的版本,支持这种语法,真是太幸运了。抓紧找个别的临时环境来建表导入数据就好了。操作方式如下:

94454ce34240d1f12dcf4f99bc821dad

笔者在操作的时候使用的账号不是 MySQL 账号,导致第 4 步在引入表空间的时候提示表空间不存在,修改文件属主再重新导入就可以了。提醒大家还是要沉着,不要忙中出错。

3、重建环境
完成了上一步千万不要开心太早,由于原来的表空间是未正常关闭的,这种方式恢复的表不可直接使用,数据有无损坏还需要进一步验证。这里老 A 建议把数据使用 mysqldump 出来,然后再恢复到准备迁移的新环境中。精力所限 MySQL 数据逻辑备份和恢复的方案这里就不再讲解了,读者可以自行搜索学习。

备份出来的数据表被导入到新环境后,老 A 请开发同学验证了里面的数据,故障前最新的数据都还在,服务修改配置重新启动功能正常,这时业务终于长出一口气。

总结

老话说“有备无患”,线上数据库服务我们有每天的定时全量备份 ,还有基于 binlog 的实时增量备份。对于自已部署的环境也要加强备份意识。笔记本上的代码要及时提交 git,产品文档要及时上传公司的云盘持久存储。线上数据修改要提前备份修改前的内容,删除数据建议先标记删除再物理删除。

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/zhibo

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-04-23
本文作者:dbaplus社群
本文来自:“InfoQ”,了解相关信息可以关注“InfoQ

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
算法 Shell
数据魔术师:如何在ClkLog中恢复丢失数据并实现数据更新
​ 在数字化的世界里,数据就是企业的血液,是推动业务发展的关键动力。想象一下,你正在运行你的业务,依赖ClkLog为你提供的数据,突然,由于网络波动或其他原因,定时脚本未能执行,页面上的数据缺失了。或者你刚刚优化了你的算法,但你需要重新计算以前的数据以便与新的算法保持一致。这种情况下,数据的完整性和稳定性就显得尤为重要,它们不仅影响业务的正常运行,而且直接关系到业务决策的准确性和及时性。
数据魔术师:如何在ClkLog中恢复丢失数据并实现数据更新
|
3月前
|
SQL Oracle 关系型数据库
"揭秘!一键解锁Oracle日志清理魔法,让海量归档日志无处遁形,守护数据库健康,告别磁盘空间告急噩梦!"
【8月更文挑战第9天】随着Oracle数据库在企业应用中的普及,归档日志管理对保持数据库健康至关重要。归档日志记录所有更改,对数据恢复极为重要,但也可能迅速占用大量磁盘空间影响性能。利用Oracle提供的RMAN工具,可通过编写Shell脚本来自动清理归档日志。脚本包括设置环境变量、连接数据库、检查和删除指定时间前的日志,并记录执行情况。通过Cron作业定时运行脚本,可有效管理日志文件,确保数据库稳定运行。
102 7
|
3月前
|
安全 API 数据库
OceanBase数据库clog日志,删前请三思!一不小心可能引发数据灾难,快来了解正确的日志管理之道!
【8月更文挑战第7天】ModelScope(魔搭)作为开放的模型即服务平台,提供丰富的预训练模型。访问令牌在此类平台中至关重要,用于验证用户身份并授权访问特定模型或服务。本文介绍访问令牌的概念、获取方法及使用示例,强调安全性与有效期内的使用,并简述刷新令牌机制。掌握这些知识可帮助用户安全高效地利用ModelScope的资源。
52 0
|
6月前
|
存储 数据挖掘 索引
NetApp数据恢复—NetApp存储误删除数据的数据恢复案例
某公司NetApp存储设备,人为误操作导致NetApp存储内部分重要数据被删除,该NetApp存储采用WAFL文件系统,底层是由多块硬盘组成的raid阵列。
NetApp数据恢复—NetApp存储误删除数据的数据恢复案例
|
SQL 数据可视化 数据库
新司机的致胜法宝,使用ApexSql Log2018快速恢复数据库被删除的数据
新司机的致胜法宝,使用ApexSql Log2018快速恢复数据库被删除的数据
|
运维 前端开发 JavaScript
删库跑路后的现场还原
遭遇删库跑路怎么办?可观测性是研发质量和产品的试金石,是企业城墙的基石,这里拿删库跑路举一个栗子,说明可观测性的重要程度,用好可观测性,能更了解系统,扩宽业务。
202 0
|
SQL 存储 Oracle
删库跑路?别怕!PolarDB-X 轻松拯救误删数据的你
本文主要围绕数据误删中的行级误删情况,介绍了 PolarDB-X 的 SQL 闪回是如何帮助用户恢复数据的。相对于现有的数据恢复方案,SQL 闪回的 SQL 级的回滚能力以及易于上手的操作界面能够帮助用户更加精准、更加快速地恢复误删数据。
766 0
删库跑路?别怕!PolarDB-X 轻松拯救误删数据的你
|
运维 分布式计算 Hadoop
误删文件的经验之谈
一、引言   曾经在运维hadoop集群的时候,出过这么一回事:当时集群因为需要维修机器所以进行停机维护,但是当启动集群的时候发现集群怎么也起不了,在没有问别的同事的情况下,自己百度了一下问题,发现format操作能解决问题,当时的我对于format是一知半解,后来执行format以后集群是起来了,但是数据没有了。追悔莫及已经没有用了,只能对自己说吃一见长一智;这明显就是误操作导致数据被删。今天就来聊一下怎么能防止误删文件! 二、防止误删数据技巧:   1、修改或删除数据前请务必备份,最好有异机备份,修改配置等先提交版本管理系统在发布到线上环境。   2、可以使用mv命令替代rm命令,
135 0
|
存储 SQL Oracle
回到过去,找回遗失的珍宝 - TiDB 的历史读功能
数据作为业务的核心,关系着整个业务的生死,所以对于数据库来说,数据的安全性是放在首位的,从宏观角度来看,安全性不仅仅在于的数据库本身足够稳定不会主动的丢失数据,有的时候更是对业务本身甚至人为失误造成损失是否有足够且便捷的应对方案,例如在游戏行业中经常遇到的反作弊(作弊玩家回档)问题,对于金融业务的审计需求等等,如果在数据库层面上提供相关机制,会让业务开发的工作量和复杂度减少很多。 传统的方案会定期备份数据,几天一次,甚至一天一次,把数据全量备份。当意外发生的时候,可以用来还原。但是用备份数据还原,代价还是非常大的,所有备份时间点后的数据都会丢失,你绝对不希望走到这一步。另外全量备份带来的存储
331 0
|
存储 容灾 安全
一行命令导致的数据丢失,阿里工程师是如何恢复的?
阿里妹导读:数据安全性被提到了前所未有的高度,数据保护的话题越来越成为敏感。因为,业务的中断时间对用户造成的影响愈来愈大。阿里技术专家凡钧从数据安全的形势与发展,面临的挑战,问题的定义,传统的解决方案,当前云厂商的解决方案,去阐述什么是连续数据保护并提出了弹性的可验证的连续数据保护方案(Elastic Assured Continuous Data Protection)。
18783 0