因为误操作,rm -rf 删掉了盘里的全部文件, 使用 ext4magic /dev/sdb1 -M -d /backup 恢复文件。

wget ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/robi-1/CentOS_CentOS-6/x86_64/ext4magic-0.3.1-1.2.x86_64.rpm
rpm -ivh ext4magic-0.3.1-1.2.x86_64.rpm
wget https://downloads.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
tar -xjf extundelete-0.2.4.tar.bz2 && cd extundelete*
./configure
make && make install

有个ssdb 数据库,恢复后启动提示 259 file missed. 同时提示了文件名, touch 建立这样一个空文件,按照提示,建立了200多个空文件,结果ssdb能启动了,可以get hget hscan,但是数据会不完全,赶紧把数据到走。

ext4magic 的恢复效果比 extundelete 能恢复出更多文件。ext4magic 除了按照原目录结构恢复出来了,还恢复出来了100多个 32M 的未知文件名的文件,从大小看,应该是 leveldb的一个 sst 文件。

花了大量时间研究leveldb的文件数据结构,试图自己写程序能够导出单个sst里面的数据。后来找到 https://antimatter15.com/2015/12/recovering-deleted-data-from-leveldb/

按照 http://blog.csdn.net/gold2008/article/details/69948892 安装 go 语言环境

go get github.com/golang/leveldb
cd /root/go/src/github.com/golang/leveldb/cmd/ldbdump
go build -o ldbdump main.go
cp ldbdump /usr/bin/

然后 ldbdump xxxxxx.ldb > raw.file 可以发现 raw.file 里面是明文字符了,但是如果原来的数据含有中文或者二进制内容,那么导出文件不好用php处理,于是对 main.go 进行了一点修改:

package mainimport ("bytes""flag""fmt""os"
"encoding/base64""github.com/golang/leveldb/db""github.com/golang/leveldb/table"
)var (verifyChecksums = flag.Bool("c", false, "Verify checksums.")truncate        = flag.Bool("t", false, "Truncate long keys and values.")kBuf, vBuf bytes.Buffer
)func main() {flag.Parse()bad := falsefor i, arg := range flag.Args() {if i != 0 {fmt.Println()}//fmt.Printf("filename: %q\n", arg)if err := dump(arg); err != nil {fmt.Printf("error: %q\n", err)bad = true}}if bad {os.Exit(1)}
}
func byteString(p []byte) string {for i := 0; i < len(p); i++ {if p[i] == 0 {return string(p[0:i])}}return string(p)
}func dump(filename string) error {f, err := os.Open(filename)if err != nil {return err}// No need to "defer f.Close()", as closing r will close f.r := table.NewReader(f, &db.Options{VerifyChecksums: *verifyChecksums,})defer r.Close()t := r.Find(nil, nil)for t.Next() {k, v := t.Key(), t.Value()if *truncate {k = trunc(&kBuf, k)v = trunc(&vBuf, v)}
enc := base64.StdEncoding.EncodeToString([]byte(v))fmt.Printf("%q\t%v\n", k, enc)}return t.Close()
}func trunc(dst *bytes.Buffer, b []byte) []byte {if len(b) < 64 {return b}dst.Reset()fmt.Fprintf(dst, "%s...(%d bytes)...%s", b[:20], len(b)-40, b[len(b)-20:])return dst.Bytes()
}

这样导出文件里面就是一行行的了,value 是 base64 编码的,用php可以直接处理。 ssdb 把hash 存入leveldb的时候,key是按照 h\thash=key\x 这样的格式存的,可以很容易提取出 hash 名和 key。这样又恢复 了一部分数据。整个过程花费了大量时间,以后都要在另一台电脑搞备份了,免得再有这样的灾难。

ssdb leveldb ldb文件恢复 ext4magic extundelete相关推荐

  1. 【转】文件恢复神器extundelete

    参考博文: 1.Linux中VMware虚拟机增加磁盘空间的扩容操作 http://www.net130.com/CMS/Pub/special/special_virtual/special_vir ...

  2. suse linux系统误删除文件恢复,Linux系统下部署文件恢复神器extundelete恢复误删的文件...

    Linux系统下部署文件恢复神器extundelete恢复误删的文件 最近看到群里提到如何恢复LINUX下ext4误删的文件,之前听说过ext3分区恢复工具ext3grep,恢复ext4刚是用extu ...

  3. rm -rf误删文件的恢复(extundelete工具的使用)

    实战:extundelete恢复数据的过程 在数据被误删除后,第一时间要做的是卸载被删除数据所在的磁盘或磁盘分区,如果是系统根分区的数据遭到误删除,就需要将系统进入单用户,并且将根分区以只读模式挂载. ...

  4. Linux杂项(001) - ext4magic文件恢复

    转载自https://www.o2oxy.cn/956.html,本文仅作为笔记备份 我看了下文件系统.ext4 文件系统.就想到了一个软件,ext4magic 那么就安装吧.百度一波.编译的时候 c ...

  5. Linux文件恢复利器 ext3grep与extundelete

    Linux文件恢复利器 ext3grep与extundelete extundelete-0.2.4.tar.bz2 ext3grep-0.10.2.tar.gz https://www.cnblog ...

  6. linux集群中删除的文件去哪里找回,恢复Linux误删除文件系列之extundelete工具

    下载安装 extundelete 之前要安装两个软件包 e2fsprogs 和 e2fsprogs-libs 安装顺序:e2fsprogs --> e2fsprogs-libs --> e ...

  7. Caffe:图像数据转换成ldb(leveldb/lmdb)文件

    转载自:denny的学习专栏(前半部分)和 深度学习文档 在深度学习的实际应用中,我们经常用到的原始数据是图片文件,如jpg,jpeg,png,tif等格式的,而且有可能图片的大小还不一致.而在caf ...

  8. 介绍一下Linux 误删文件恢复命令及方法

    无论在哪个系统中,删除文件都是必须谨慎的操作.因为如果不小心删除了重要文件,就会导致个人或公司出现重大的损失.类似于windows系统误删了文件,可以使用一些软件进行恢复操作.Linux也是有几款软件 ...

  9. linux各种误删文件恢复方法(经典强推)

    linux不像windows有个回收站,使用rm -rf *基本上文件是找不回来的. 那么问题来了: 对于linux下误删的文件,我们是否真的无法通过软件进行恢复呢? 答案当然是否定的,对于误删的文件 ...

最新文章

  1. 使用appium做自动化测试时,send_keyss只能输入字母数字,无法输入中文
  2. 收藏 | 常见的神经网络求导总结!
  3. 获取打印机分辨率_喵喵机P2S热敏打印机,升级屏幕带来了哪些体验??
  4. boost::make_ready_future相关的测试程序
  5. jsf集成spring_Spring和JSF集成:分页
  6. PAT(Basic Level)--个位数统计
  7. 错误代码: 1005 Can't create table 'hibernate.bill' (errno: 150)
  8. iOS 开发之 GCD 不同场景使用
  9. Laravel文档梳理10、请求生命的周期
  10. 关于ip、pv、uv的概念
  11. 最优化:拟牛顿法、最速下降法、共轭梯度法、信赖域法、协同优
  12. 13-新手小白如何选购笔记本电脑?
  13. 最简单代码画的五角星
  14. 《基础会计学》期末模拟试题及答案
  15. HttpClient解析服务器返回的response出现乱码
  16. NumPy入门讲座(3):操作数组
  17. 程序人生(一) 初生牛犊
  18. bzoj-4433 小凸玩矩阵(二分图,二分+匈牙利)
  19. 【解决】正在连接 raw.githubusercontent.com 失败:拒绝连接
  20. 计算机丢失MSVCR120.dll是什么意思,电脑找不到MSVCR120.dll如何修复?

热门文章

  1. python 绘制q-q图代码
  2. HTML5常用的文本标签及css字体样式属性
  3. 英语词根词缀记忆法(全集)_语言学习 | 英语词根词缀学习参考
  4. 数据挖掘-朴素贝叶斯算法的R实现
  5. 前淘宝工程师:12306几乎是一个奇迹
  6. civil 3d 计算机配置,Civil 3D技巧:如果做到设计文件的高效出图?
  7. 干货来袭!!!3天0基础Python实战项目快速学会人工智能必学数学基础全套(含源码)(第1天)线性代数篇:矩阵、向量及python实战
  8. Kettle连接MySQL数据库报错:Driver class ‘org.gjt.mm.mysql.Driver‘ could not be found
  9. IDE/SATA/SCSI接口
  10. SQL AlawaysOn 之四:故障转移集群