ZFS - 从备份中恢复或修复快照中的损坏文件?

ZFS - 从备份中恢复或修复快照中的损坏文件?

池中的文件数据遭受了永久性数据损坏,而这些文件数据是快照的一部分。如果文件数据是文件系统的一部分(而不是任何快照的一部分),我可以从合适的备份副本中恢复文件。如何从快照副本或池的(部分1)副本中恢复或修复快照中的文件(并清除 ZFS 报告的错误)?

1部分副本至少包含受影响的快照以及受影响池上的前一个快照。

例子

这是一个易于复制但极其不自然的例子:

从 (bash) shell 提示符:

cd
mkdir zfs-test
for i in {1..2}; do dd if=/dev/zero of=zfs-test/tank-file$i bs=1G count=1 &> /dev/null; done

sudo zpool create tank1 ~/zfs-test/tank-file1
sudo zpool create tank2 ~/zfs-test/tank-file2

sudo zfs snapshot tank1@snapshot1
sudo sh -c 'zfs send tank1@snapshot1 | zfs receive -F tank2'

创建文本文件/tank1/测试文本文件您可以在十六进制编辑器中轻松找到内容。以下是我使用的:

Lorem ipsum dolor sit amet,consectetuer adipiscing elit。埃内阿诺德·科莫多·利古拉(Eget Dolor)。埃涅阿斯大众。凭借天生的贵族和伟大的产妇,诞生了可笑的穆斯。 Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem。 Nulla consequat massa quis enim。 Donec pede justo,fringilla vel,aliquet nec,vulputate eget,arcu。只是为了,rhoncus ut,imperdiet a,venenatis vitae,只是为了。谚语说得好,猫和脚都很可爱。整数 tincidunt。 Cras dapibus。生命元素永远不存在。埃涅阿斯 vulputate eleifend tellus。 Aenean leo ligula,porttitor eu,consequat vitae,eleifend ac,enim。 Aliquam lorem ante,dapibus in,viverra quis,feugiat a,tellus。 Phasellus viverra nulla ut metus varius laoreet。真可惜。永恒的禁食。除非另有说明。 Curabitur ullamcorper ultricies nisi。沒有這樣。

再次从 shell 提示符开始:

sudo zfs snapshot tank1@snapshot2
sudo sh -c 'zfs send -i tank1@snapshot1 tank1@snapshot2 | zfs receive -F tank2'

现在你需要破坏文件数据。我用的是H T我搜索了“dui”并将其改为“duh”。

您可以确认数据已损坏:

sudo zpool scrub tank1; sudo zpool status -v tank1
  pool: tank1
 state: ONLINE
status: One or more devices has experienced an error resulting in data
        corruption.  Applications may be affected.
action: Restore the file in question if possible.  Otherwise restore the
        entire pool from backup.
   see: http://zfsonlinux.org/msg/ZFS-8000-8A
  scan: scrub repaired 0 in 0h0m with 1 errors on Sun Jan 11 20:16:30 2015
config:

        NAME                               STATE     READ WRITE CKSUM
        tank1                              ONLINE       0     0     1
          /home/kenny/zfs-test/tank-file1  ONLINE       0     0     2

errors: Permanent errors have been detected in the following files:

        tank1@snapshot2:/test-text-file

答案1

使用冗余池总是比使用非冗余池更好(尽管并非总是可行)。上述问题不太可能发生在冗余池上。克隆快照(从中获取文件)比在某处重新创建快照更快(当然,如果您对硬件故障没有抱怨的话)。

答案2

这是我的稍微概括的解决方案:

sudo cp /tank2/test-text-file /tank1/test-text-file
sudo zfs snapshot tank1@snapshot3
sudo sh -c 'zfs send -i tank1@snapshot2 tank1@snapshot3 | zfs receive -F tank2'
sudo zfs rollback -r tank1@snapshot1
sudo sh -c 'zfs send -i tank2@snapshot1 tank2@snapshot3 | zfs receive -F tank1'
sudo zpool scrub tank1; sudo zpool status -v tank1

假设没有报告其他错误:

sudo zpool clear tank1

我之所以创建它,snapshot3并不是因为我的(极其做作的)示例需要它,而是因为这可能是一个值得养成的好习惯(我最初想测试它是否能像我希望的那样工作)。如果有tank1此后有任何其他变化snapshot2,我理想情况下不想丢失它们以进行恢复test-text-file

答案3

相关内容