zfs销毁后恢复数据

Ole*_*nko 10 zfs data-recovery zfsonlinux

在 Debian 8.7 上,我有一个 zfs 池。(显然在 Linux 上使用 ZFS,而不是 Oracle 或 Solaris zfs)

需要将 ZFS 池从 2 个磁盘上的镜像扩展到 4 个磁盘上的 raidz。我做了备份(一份数据副本 - 这是我的第一个错误)

我认为zpool destroy在我删除所有数据集(卷)之前这不会起作用,所以我做到了zfs destroy(这是我的第二个错误)。

之后我发出'zpool destroy',重新分区所有4个磁盘,发现备份已损坏。

所以我开始了我的恢复冒险:ZFS 的第一个好处是它能够导入被破坏的池。之后zpool destroy yourPoolName您可以调用zpool import -D以查看已销毁池的列表。然后,您可以使用 imoprt 它,zpool import -D yourPoolName或者如果您销毁了多个具有相同名称的池,那么您可以通过 id 导入它,由zpool import -D.

zpool import -D需要在其原始位置进行分区。它必须精确到部门。我曾经用fdisk确切的开始和结束扇区号创建分区。我曾经cfdisk设置分区类型(因为它对用户更友好:))然后您应该调用partprobe以确保操作系统知道更改的分区。

zpool import -D像魅力一样工作,我的游泳池再次处于完美健康状态!.. 但后果是zfs destroy- 所有数据都丢失了。

ZFS 在事务中存储对文件和文件系统的更改,这些更改以事务组 (TXG) 的形式保存到磁盘。我的进一步研究表明,我必须回滚最后一个事务组。

有两种回滚 ZFS 事务组的方法

  1. 使用特殊的zpool import-T选项
  2. 使用 zfs_revert-0.1.py

首先你需要找到最后一个好的TXG。 zpool history -il帮助过我。

根据第一种方式,您应该调用类似的东西:(zpool import -o readonly=on -D -f -T <LAST-GOOD-TXG> poolName如果您喜欢-F,可以使用附加参数:-m,,-R)不幸的是,此命令仅适用于实际的 TXG。甚至回溯到上一个 TXG 之前都不起作用,并显示“设备不可用”之类的错误消息。看起来此功能仅在 Solaris 上有效(或已经有效)。遗憾。

我已经分析了 的代码zfs_revert-0.1.py,它看起来很清晰,很有前途。我用过这个工具,但看起来我需要删除太多的TXG。之后zpool import -D就无法再检测到池了。

目前我已经恢复了一个较旧的备份,我有dd2 个磁盘的转储,它们被镜像但在zfs destroy和之后zpool destroy。看起来我们只会使用旧备份中的数据并停止进一步的恢复过程。尽管如此,如果有人会建议在这种情况下该怎么做,我会很高兴尝试恢复数据。

进一步的恢复将在 VMWare Workstation 中完成,所以我需要找到一种方法如何在 VM 中导入 zpool(磁盘 ID 可能会改变)

问题 接下来我可以尝试什么?

经验教训

  1. 始终保留至少 2 份数据副本。当您操作主存储时,您需要备份备份。
  2. zfs destroy如果您zpool destroy无论如何都要做,则不需要并且非常危险。

评论:很明显,在恢复期间您应该完全停止向存储损坏数据的磁盘写入。

有用的命令: zpool import -D zpool import -o readonly=on -D -f originalPoolName newPoolName zpool status tank

zpool online dozer c2t11d0
zpool scrub tank

zpool history -il

zpool export tank

zpool import dozer zeepool
Run Code Online (Sandbox Code Playgroud)

链接

  1. 工具

  2. 有关损坏的 ZFS 的信息

  3. ZFS 导入