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

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

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

引言

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

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

事件背景

测试环境中的一台服务器准备做迁移替换,小 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

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
存储 数据挖掘 数据库
XSAN数据恢复-XSAN文件系统数据迁移过程中全部丢失的数据恢复案例
XSAN数据恢复环境: 昆腾存储+MAC OS操作系统,存储数据主要是视频类数据如MXF、MOV等格式文件。 该昆腾存储中有9个数据卷:1个META信息卷和8个DATA信息卷。 XSAN故障情况: 将存储空间从XSAN架构迁移到STORNEXT架构后,发现存储空间中数据全部丢失。
36 11
|
3月前
|
存储 关系型数据库 数据库
数据备份和恢复的常见技术
【10月更文挑战第28天】数据备份和恢复的常见技术
|
6月前
|
算法 Shell
数据魔术师:如何在ClkLog中恢复丢失数据并实现数据更新
​ 在数字化的世界里,数据就是企业的血液,是推动业务发展的关键动力。想象一下,你正在运行你的业务,依赖ClkLog为你提供的数据,突然,由于网络波动或其他原因,定时脚本未能执行,页面上的数据缺失了。或者你刚刚优化了你的算法,但你需要重新计算以前的数据以便与新的算法保持一致。这种情况下,数据的完整性和稳定性就显得尤为重要,它们不仅影响业务的正常运行,而且直接关系到业务决策的准确性和及时性。
数据魔术师:如何在ClkLog中恢复丢失数据并实现数据更新
|
7月前
|
存储 负载均衡 算法
服务器数据恢复—EVA存储介绍&常见故障和数据恢复
EVA存储常见故障: 1、RSS中多个磁盘掉线,超过冗余保护级别。 2、加入新磁盘,进行数据迁移时,新磁盘存在物理故障。 3、VDISK被删除或EVA初始化。 4、突发性主机与存储无法连接。无法discover存储。
服务器数据恢复—EVA存储介绍&常见故障和数据恢复
|
6月前
|
SQL Oracle 关系型数据库
"揭秘!一键解锁Oracle日志清理魔法,让海量归档日志无处遁形,守护数据库健康,告别磁盘空间告急噩梦!"
【8月更文挑战第9天】随着Oracle数据库在企业应用中的普及,归档日志管理对保持数据库健康至关重要。归档日志记录所有更改,对数据恢复极为重要,但也可能迅速占用大量磁盘空间影响性能。利用Oracle提供的RMAN工具,可通过编写Shell脚本来自动清理归档日志。脚本包括设置环境变量、连接数据库、检查和删除指定时间前的日志,并记录执行情况。通过Cron作业定时运行脚本,可有效管理日志文件,确保数据库稳定运行。
163 7
|
6月前
|
SQL 安全 测试技术
【数据守护者必备】SQL数据备份与恢复策略全解析:从全量到日志备份,手把手教你确保企业信息万无一失的实战技巧!
【8月更文挑战第31天】数据库是企业核心业务数据的基石,为防止硬件故障、软件错误或人为失误导致的数据丢失,制定可靠的备份与恢复策略至关重要。本文通过一个在线购物平台的案例,详细介绍了使用 SQL Server 进行全量备份、差异备份及事务日志备份的方法,并演示了如何利用 SQL Server Agent 实现自动化备份任务。此外,还提供了数据恢复的具体步骤和测试建议,确保数据安全与业务连续性。
327 0
|
9月前
|
关系型数据库 MySQL 数据库
数据库第四次作业 数据备份与还原
数据库第四次作业 数据备份与还原
68 0
数据库第四次作业 数据备份与还原
|
SQL 数据可视化 数据库
新司机的致胜法宝,使用ApexSql Log2018快速恢复数据库被删除的数据
新司机的致胜法宝,使用ApexSql Log2018快速恢复数据库被删除的数据
|
运维 前端开发 JavaScript
删库跑路后的现场还原
遭遇删库跑路怎么办?可观测性是研发质量和产品的试金石,是企业城墙的基石,这里拿删库跑路举一个栗子,说明可观测性的重要程度,用好可观测性,能更了解系统,扩宽业务。
221 0
|
SQL 存储 Oracle
删库跑路?别怕!PolarDB-X 轻松拯救误删数据的你
本文主要围绕数据误删中的行级误删情况,介绍了 PolarDB-X 的 SQL 闪回是如何帮助用户恢复数据的。相对于现有的数据恢复方案,SQL 闪回的 SQL 级的回滚能力以及易于上手的操作界面能够帮助用户更加精准、更加快速地恢复误删数据。
792 0
删库跑路?别怕!PolarDB-X 轻松拯救误删数据的你

热门文章

最新文章