如何从损坏的 ext3 分区恢复数据?

Get*_*ree 6 linux partition ext3 mount data-recovery

我的一台服务器出现某种驱动器故障,导致操作系统(CentOS 5)崩溃并停止工作(它拒绝启动)。

因此,我们放置了另一个具有工作操作系统的驱动器,然后我们尝试在旧驱动器中安装分区。

大多数分区都安装得很好,除了一个:/var我的 MySQL 表所在的分区。
当我尝试安装那个时,我看到以下错误dmesg

sd 0:0:1:0:未处理的检测代码
sd 0:0:1:0:SCSI 错误:返回代码 = 0x08100002
结果:hostbyte=invalid driverbyte=DRIVER_SENSE,SUGGEST_OK
sdb:当前:sense key:中错误
添加。意义:未恢复的读取错误

信息 fld=0x4a47e JBD
:无法读取偏移量 9863 处的块JBD
:恢复失败
EXT3-fs:错误加载日志。

有没有办法恢复那个分区中的数据?


编辑:
根据要求,输出tune2fs -l /dev/sdb2为:

tune2fs 1.39 (29-May-2006)
Filesystem volume name:   /var1
Last mounted on:          <not available>
Filesystem UUID:          d84f5181-24f3-40ce-9eaa-601ae5ae33bd
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              26214400
Block count:              26214063
Reserved block count:     1310703
Free blocks:              25127226
Free inodes:              26213665
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      1017
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         32768
Inode blocks per group:   1024
Filesystem created:       Thu May 13 18:14:28 2010
Last mount time:          Thu Nov 29 12:52:00 2012
Last write time:          Wed Mar 27 20:29:28 2013
Mount count:              15
Maximum mount count:      -1
Last checked:             Thu May 13 18:14:28 2010
Check interval:           0 (<none>)
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               128
Journal inode:            8
Default directory hash:   tea
Directory Hash Seed:      35f38c48-3933-4c99-bde2-63b0eccf200d
Journal backup:           inode blocks
Run Code Online (Sandbox Code Playgroud)

编辑 2:
正如@Hartmut 所建议的,我运行fsck.ext3 /dev/sdb2的结果如下:

e2fsck 1.39 (29-May-2006)
/var1: recovering journal
/var1: Attempt to read block from filesystem resulted in short read while reading block 11931

JBD: Failed to read block at offset 9863
fsck.ext3: No such device or address while trying to re-open /var1
e2fsck: io manager magic bad!
Run Code Online (Sandbox Code Playgroud)

Mic*_*ton 7

您的硬盘驱动器似乎发生了物理故障,并且影响了包含 ext3 日志的块。

您将需要第二个空白硬盘驱动器,至少与故障驱动器分区一样大,以对该磁盘执行任何类型的恢复。您还需要一个目标来将恢复的文件复制到其中,因此我们将其称为第三个空白硬盘驱动器、网络文件共享等。

一般的恢复过程将是:

  1. 使用dd conv=noerror或更好的方法将失败的分区复制到新驱动器dd_rescue。这可能要花点时间。

  2. 执行我假设你复制的拷贝这里,所有进一步的操作/dev/sdb2/dev/sdc2和你将文件恢复到/dev/sdd2

  3. 由于日志已损坏,我们将其删除:

    tune2fs -O ^has_journal /dev/sdc2
    
    Run Code Online (Sandbox Code Playgroud)
  4. 现在完成设备的 fsck。这可能要花点时间。

    e2fsck /dev/sdc2
    
    Run Code Online (Sandbox Code Playgroud)
  5. 以只读方式挂载文件系统并尝试恢复文件。

    mount -o ro /dev/sdc2 /mnt/baddrive
    mount /dev/sdd2 /mnt/recoveredfiles
    cp -av /mnt/baddrive/* /mnt/recoveredfiles
    
    Run Code Online (Sandbox Code Playgroud)
  6. 在任何情况下,您都不应再次使用原始磁盘。更换它(在保修期内,如果它仍在保修期内)。


小智 2

您是否尝试将其安装为 ext2 文件系统mount -t ext2 ...?ext3 向后兼容 ext2,因此它应该忽略似乎已损坏的日志。这不是一个理想的解决方案,但如果幸运的话,它可能会让您访问一些数据!