zfs destroy 后恢复数据

zfs destroy 后恢复数据

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

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

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

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

所以我开始康复adventure:ZFS 的第一个优点是它能够导入已销毁的池。之后zpool destroy yourPoolName您可以调用zpool import -D查看已销毁池的列表。然后您可以使用导入它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,,)不幸的是,此命令仅适用于实际的 TXG。即使回到上次 TXG 之前,也没有用,并显示错误消息,如“设备不可用”。看起来此功能仅在 Solaris 上有效(或曾经有效)。真可惜。-m-R

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

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

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

问题 下一步我可以尝试什么?

得到教训

  1. 始终保留至少 2 份数据副本。操作主存储时,需要备份的备份。
  2. zfs destroy这是没有必要的,而且如果你要这么做的zpool destroy话,会非常危险。

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

有用的命令:zpool 导入-D zpool 导入-o readonly = on -D -f 原始池名称 新池名称 zpool 状态 罐

zpool online dozer c2t11d0
zpool scrub tank

zpool history -il

zpool export tank

zpool import dozer zeepool

链接

  1. 工具
  1. 有关损坏的 ZFS 的信息
  1. ZFS 导入

相关内容