当前位置: 首页 > news >正文

Linux 下删库跑路的正确姿势?别怕,教你数据恢复全流程

前段时间有朋友半夜给我打电话,声音都抖了:“我把生产库删了,怎么办?” 我问他有没有备份,他说有,但最近一次是三天前。我叹了口气,说你先别跑路,也别重启服务器,咱想想办法。

其实在 Linux 下,文件被删了不一定就彻底没了,尤其是在 ext3/ext4 这类日志文件系统上,只要你手快、步骤对,大概率能捞回一部分数据。今天就跟大家聊聊我平时处理这类“删库”事故的思路,顺便分享一个我一直在维护的小脚本,它集成了从确认文件状态到恢复数据的全流程。

先别急,我假设你现在就是那个不小心执行了 rm -rf /data/mysql/* 的倒霉蛋。第一步,立刻停止对这个分区的所有写操作。如果能卸挂,最好直接 umount,或者至少 mount -o remount,ro 挂成只读。这一步做不到的话,后面的恢复基本白搭。

接下来,你得找到被删文件在磁盘上的 inode 和位置。很多人知道 extundelete 这个工具,但它对 XFS、btrfs 这类现代文件系统无效。而且万一你的分区已经被部分覆写,恢复出来的文件可能损坏。所以这个脚本里我用的是 testdisk + ext4magic 的组合,外加针对 MySQL 的 ibd 文件恢复逻辑。

先从脚本的头开始看,它能自动帮你把分区挂成只读,然后扫描丢失的 inode:

#!/bin/bash
# recover.sh - 用于恢复误删的文件,重点适配 MySQL 数据目录MOUNT_POINT="/data"
DISK=$(df "$MOUNT_POINT" | tail -1 | awk '{print $1}')
BACKUP_DIR="/restore"# 1. 立即只读挂载,防止进一步覆写
echo "[*] 将 $MOUNT_POINT 重新挂载为只读..."
mount -o remount,ro "$MOUNT_POINT" || {echo "[-] 无法只读挂载,请手动 umount"exit 1
}

这里用 df 反向查出实际磁盘设备,省得你还要手动去查。如果自动挂载失败,脚本会提醒你手动 umount,毕竟在硬件 RAID 或者 LVM 下面,设备名可能不是你想的那样。

弄好只读之后,我会先用 ext4magic 去扫描被删文件。这工具比 extundelete 强在它可以按时间范围恢复,还能恢复目录结构。比如你昨天删的库,可以这么指定:

# 2. 使用 ext4magic 恢复最近24小时内被删的文件
echo "[*] 扫描 $DISK 上过去 1440 分钟内的删除记录..."
mkdir -p "$BACKUP_DIR/data"
ext4magic "$DISK" -a $(date -d '24 hours ago' +%s) -d "$BACKUP_DIR/data" -l

-a 后面跟的是 Unix 时间戳,-d 是指定输出目录,-l 会列出所有可恢复的文件,方便你确认到底删了啥。这步跑完,如果你运气好,能在 $BACKUP_DIR/data 下面看到一个和原来一模一样的目录树,里面就是恢复回来的文件。

但这是理想情况。很多时候你的文件系统已经被 MySQL 进程或者磁盘缓存搞乱了,.ibd 文件恢复出来可能不完整。这时候就得动用 MySQL 自带的 ibd_recover 工具(如果你用的是 InnoDB)。脚本里我加了一段专门处理这种烂文件的逻辑:

# 3. 如果恢复的 .ibd 文件损坏,尝试用 MySQL 工具重建
echo "[*] 检查并修复 .ibd 文件..."
find "$BACKUP_DIR/data" -name "*.ibd" | while read ibd; do# 检查文件是否完整(极简方式,看文件头魔法数字)if ! xxd -l 4 "$ibd" | grep -q "67de"; thenecho "[-] $ibd 文件头损坏,尝试修复..."# 使用 percona 的 ibdconnect 或自行通过表结构重建# 这里省略具体表的 ddl 提取,通常需要从其他备份拿建表语句mysql -e "CREATE TABLE ..."# 然后通过 import tablespace 强行导入,此处不展开fi
done

那一句 xxd -l 4 | grep "67de" 纯粹是经验之谈,InnoDB 的 .ibd 文件头两位一般是 0x67de,如果对不上,文件基本就残了。遇到这种情况,你只能找个旧的备份先把表结构建出来,然后把能读的页强行导进去。脚本里我不会帮你自动搞这步,因为风险太大,但至少给你留了个检查入口。

最后一步,如果你用的是 XFS 文件系统,ext4magic 就不管用了,得换 xfs_repair -n 检查,再用 xfs_undelete 这类工具。为了通用性,我加了文件系统类型判断:

# 4. 根据文件系统类型选择恢复策略
FSTYPE=$(df -T "$MOUNT_POINT" | tail -1 | awk '{print $2}')
echo "[*] 检测到文件系统类型: $FSTYPE"
case $FSTYPE inext3|ext4)# 已经在上面处理过了;;xfs)echo "[-] XFS 恢复需要 xfs_undelete 等工具,当前版本不支持自动恢复,请手动操作。";;*)echo "[-] 未知文件系统,脚本退出。"exit 1;;
esac

说白了,这个脚本就是个“删库急救包”,它并不能保证百分百恢复,但能让你在慌乱的时候按部就班走一遍,不至于越搞越糟。真正靠谱的方案永远是高可用+备份+延迟从库,别等到跑路才想起来。

整个脚本我一直在 GitHub 上维护,最近一次更新加了对 MySQL 8.0 新格式的兼容。如果你需要完整代码,可以去我置顶那篇文章里找下载链接(我会单独放出来,不然这篇文章没法过审)。希望你们永远用不上这个脚本,但万一用上了,记得先把分区只读,别手贱重启。

http://www.rkmt.cn/news/1482145.html

相关文章:

  • 2026国内最有名起名老师推荐.起名大师推荐. - 资讯纵览
  • 石家庄起名馆排名.石家庄起名老师推荐.石家庄起名大师推荐 - 资讯纵览
  • 深度解析Realtek RTW89无线网卡驱动:Linux系统下WiFi 6/7设备完整技术指南
  • 从零构建3D打印切片软件:BambuStudio开源贡献实战指南
  • 从LED到单片机:硬件焊接与编程实践全解析
  • 2026番禺搬家公司终极评测指南|口碑性价比双维度实测排行+本地避坑全攻略 - gzdjxd
  • 从诗词到词元:青年见证传统文化与数字文明的时代交融
  • Windows安卓应用安装器:3分钟实现电脑运行安卓应用
  • 092、编队飞行:一致性理论
  • 如何5分钟搞定Mac Boot Camp驱动自动化部署:Brigadier终极方案
  • 2026年国内区域优质深山天然饮用水厂家精选榜单 - 企业推荐师
  • 一文搞懂:Java与Web3交互实战——用Java构建区块链应用后端
  • Redis突然变慢了?你可能踩了这几个隐蔽的坑
  • 中通快递10斤要多少钱?2026最新寄件省钱攻略 - 快递物流资讯
  • 终极指南:如何让老款Mac重获新生——OpenCore Legacy Patcher完整教程
  • 东莞墙面刷新多少钱一平方?2026年报价明细+品牌对比+怎么选 - 优家闲谈
  • 为什么你的微服务改造总失败?谈谈领域驱动设计的落地痛点
  • “照得标”下载页面
  • 天津品牌小程序制作怎么选 2026 精选榜单参考 | 6月最新整理 - 软件测评师
  • CSDN AI数字营销企业采购必读:团购门槛、账号绑定规则、续费锁价机制(内部渠道限时开放中)
  • Prometheus + Grafana 云原生可观测性体系:从指标采集到告警闭环的完整实践
  • 从零到一:Happy Island Designer 终极实战指南 [特殊字符]️
  • 2026年济南驾校大揭秘:哪家学员数量最多?速来一探究竟! - 资讯纵览
  • 拯救你的代码规范:手把手教你配置STS的代码模板与实时检查(告别脏乱差)
  • Kubernetes 生产环境排障实录:典型故障案例与诊断方法论
  • 2026年杭州AI搜索优化公司深度GEO源头实力横评与选型避坑白皮书 - 品牌报告
  • 全平台B站客户端终极指南:wiliwili 10分钟快速上手教程
  • CSDN数字营销赔付实操手册:从内容预审→实时监测→违规拦截→费用返还,全流程6节点风控SOP(附自动化检测脚本)
  • 【分享】3.2 晕轮效应、确认偏见、相似性吸引——你的命运在前5分钟就定了?
  • BMI体脂率与基础代谢综合计算接口接入实践:健康评估数据的工程化处理