在Debian 8.7上我有一个zfs池。 (显然在Linux上使用ZFS,而不是Oracle或Solaris zfs)
需要将ZFS池从2个磁盘上的镜像扩展到4个磁盘上的RAID。 我做了备份(一份数据 – 这是我的第一个错误)
我以为zpool destroy将不会工作,直到我删除所有数据集(卷),所以我做了zfs destroy (这是我的第二个错误)。
之后,我发布了“zpool destroy”,重新分区了所有4个磁盘,发现备份已损坏。
所以我开始了我的恢复冒险:关于ZFS的第一件好事就是它能够导入被破坏的池。 在zpool destroy yourPoolName您可以调用zpool import -D来查看已销毁池的列表。 然后你可以使用zpool import -D yourPoolName来修改它,或者如果你已经销毁了几个同名的池,那么你可以通过由zpool import -D显示的id来导入它。
zpool import -D需要分区在原来的位置。 它必须精确到部门。 我已经使用fdisk创build了具有确切的开始和结束扇区号的分区。 我已经使用cfdisk来设置分区types(因为它更友好:))然后,你应该调用partprobe ,以确保操作系统知道更改分区。
zpool import -D工作就像一个魅力,我有我的池在线健康再次完美!..但由于zfs destroy全部后果 – 所有的数据丢失。
ZFS将事务中的文件和文件系统更改存储到事务组(TXG)中的磁盘上。我的进一步研究表明,我必须回滚最后一个事务组。
有两种方法可以回滚ZFS事务组 :
-T选项的特殊zpool import zfs_revert-0.1.py 首先你需要find最后一个好的TXG。 zpool history -il帮助了我。
根据第一种方法,你应该调用类似于: zpool import -o readonly=on -D -f -T <LAST-GOOD-TXG> poolName (带有附加参数,如果你喜欢: -F , -m , -R )不幸的这个命令只和实际的TXG一起工作。 甚至回到前一个TXG没有工作,并显示错误消息,如“设备不可用”。 它看起来像这个function只在Solaris上工作(或已经工作)。 可怜。
我已经分析了zfs_revert-0.1.py的代码,看起来很清楚,很有希望。 我已经使用这个工具,但它看起来像我需要删除太多的TXGs。 之后zpool import -D无法检测到池。
目前我已经恢复了一个较旧的备份,我有2个磁盘的dd转储,这是镜像,但zfs destroy后zfs destroy和zpool destroy 。 它看起来像我们只是住在旧备份的数据,并停止进一步的恢复过程。 不过,如果有人build议在这种情况下做什么,我会很乐意尝试恢复数据。
进一步恢复将在VMWare Workstation中完成,所以我将需要find一种方法来在虚拟机中导入zpool(磁盘ID可能会改变)
问题接下来我可以尝试什么?
经验教训 :
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
链接 :
工具
有关损坏的ZFS的信息
ZFS导入