2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

  • 2020-04-23
  • 本文字数:2411 字

    阅读完需:约 8 分钟

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

本文由 dbaplus 社群授权转载。

引言

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


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

事件背景

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


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


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


恢复经历

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


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

1、找回数据文件

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



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



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


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



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


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



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



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


2、恢复数据文件

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


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



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

3、重建环境

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


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

总结

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



作者介绍


贝壳找房 DBA 团队,负责支撑起贝壳找房平台的数据库运维及数据库产品的开发工作,努力提供高效、稳定、安全的数据库服务。


原文链接


https://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEwNg==&mid=2650787420&idx=1&sn=0af559f651cdc55577d020e2a7b42048&chksm=f3f97bc9c48ef2df6db31046b70d8c08b811d64c7d77a5204ffec27e46e10703038779e319bb&scene=27#wechat_redirect


2020-04-23 10:052630

评论

发布
暂无评论
发现更多内容

小手哆嗦一下,就能用 Python Django 实现一个微型博客系统

梦想橡皮擦

8月日更

c++ 构造函数详解

若尘

c++ 构造函数 8月日更

从0开始的TypeScriptの四:接口Interfaces · 上

空城机

JavaScript typescript 大前端 8月日更

【Flutter 专题】72 图解极简自定义跑马灯 ACEMarquee

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 8月日更

贡献数字力量 浪潮云洲赋能广州箱包皮具产业集群

工业互联网

【Vue2.x 源码学习】第三十二篇 - diff算法-乱序比对

Brave

源码 vue2 8月日更

信创产业已成现象级新风口,快来加入争做“弄潮儿”

华为云开发者联盟

开源 信创 opengauss openEuler 鲲鹏

跨链治理之入门三问 :WHO WHAT HOW

趣链科技

区块链 治理机制

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

Java~~~

Java 架构 面试 微服务 多线程

HashMap面试中的12个点

4ye

Java 面试 后端 hashmap 8月日更

Vue进阶(二十五):<component>实现动态组件

No Silver Bullet

Vue 动态组件 8月日更

netty系列之:使用POJO替代buf

程序那些事

Java Netty nio 程序那些事

为构建大型复杂系统而生的微服务框架 Erda Infra

尔达Erda

开源 程序员 微服务 云原生 运维开发

Go 学习笔记之 Channels

架构精进之路

Go 语言 8月日更

Compose 可组合项的生命周期

Changing Lin

8月日更

测试开发之系统篇-Docker容器安装

禅道项目管理

Docker 测试开发

prometheus 语法

Rubble

Prometheus 8月日更

VSCode July 2021 (version 1.59) 更新

IT蜗壳-Tango

8月日更

某离散制造行业龙头客户“主数据管理平台”建设分享

用友BIP

主数据管理

数据中台为什么要建标签体系,分类它不香吗?

用友BIP

数据中台 标签体系

Regan Yue带你一起学习微软AZ-900认证的有关知识「 第Ⅱ章」

Regan Yue

云计算 微软 后端 8月日更

uni-app技术分享| 怎么用uni-app实现呼叫邀请

anyRTC开发者

uni-app 音视频 呼叫邀请 点对点呼叫

【插画】一文看懂容器k8s

恒生LIGHT云社区

Docker 容器 k8s

【LeetCode】第一个只出现一次的字符Java题解

Albert

算法 LeetCode 8月日更

云小课 | 到底什么是区块链?

华为云开发者联盟

区块链 华为云 区块链的定义 区块链的解决方案 区块链的发展

AIMA:如何通过质量指标提高QA的绩效(译)

BY林子

软件测试 绩效 QA

零代码上线小布对话技能:技能平台的实践与思考

OPPO小布助手

人工智能 自然语言处理 算法 零代码 语义理解

云计算运维与传统运维工作有啥不同?需要什么资质?

行云管家

云计算 服务器 IT运维 云计算运维

Vue进阶(二十六):详解 router.push()

No Silver Bullet

Vue router 8月日更

手撸二叉树之数据流中的第 K 大元素

HelloWorld杰少

数据结构与算法 8月日更

感恩架构实战营学习的一路陪伴、不断进度!

arctec

十年难得一遇!从数据误删到全量恢复的惊险记录_开源_dbaplus社群_InfoQ精选文章