在 Oracle® Solaris 11.2 中管理 ZFS 文件系统

退出打印视图

更新时间: 2014 年 12 月
 
 

修复损坏的文件或目录

如果文件或目录被损坏,则系统可能仍然正常工作,具体取决于损坏的类型。如果系统中存在完好的数据副本,则任何损坏实际上都是不可恢复的。如果数据具有价值,必须从备份中恢复受影响的数据。尽管这样,您也许能够从此损坏恢复而不必恢复整个池。

如果损坏出现在文件数据块中,则可以安全地删除该文件,从而清除系统中的错误。使用 zpool status –v 命令可以显示包含持久性错误的文件名列表。例如:

# zpool status tank -v
pool: tank
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://support.oracle.com/msg/ZFS-8000-8A
config:

NAME                     STATE     READ WRITE CKSUM
tank                     ONLINE       4     0     0
c0t5000C500335E106Bd0    ONLINE       0     0     0
c0t5000C500335FC3E7d0    ONLINE       4     0     0

errors: Permanent errors have been detected in the following files:
/tank/file.1
/tank/file.2

包含持久性错误的文件名列表可能描述如下:

  • 如果找到文件的全路径并且已挂载数据集,则会显示该文件的全路径。例如:

    /monkey/a.txt
  • 如果找到文件的全路径但未挂载数据集,则会显示不带前导斜杠 (/) 的数据集名称,后面是数据集中文件的路径。例如:

    monkey/ghost/e.txt
  • 如果由于错误或由于对象没有与之关联的实际文件路径而导致文件路径的对象编号无法成功转换(dnode_t 便是这种情况),则会显示数据集名称,后跟该对象的编号。例如:

    monkey/dnode:<0x0>
  • 如果元对象集 (Metaobject Set, MOS) 中的对象损坏,则会显示特殊标签 <metadata>,后跟该对象的编号。

您可以尝试通过多次清理池和清除池错误来解决不太严重的数据损坏。如果在首次清理和清除中没有解决损坏的文件,请重新运行。例如:

# zpool scrub tank
# zpool clear tank

如果损坏发生在目录或文件的元数据中,则唯一的选择是将文件移动到别处。可以安全地将任何文件或目录移动到不太方便的位置,以允许恢复原始对象。

修复具有多块引用的损坏数据

如果受损的文件系统包含具有多块引用的损坏数据(如快照),则 zpool status –v 命令无法显示所有损坏数据的路径。当前 zpool status 对损坏数据的报告受以下项的限制:元数据的损坏量以及执行 zpool status 命令后是否重用了任何块。删除了重复数据的块使得对所有损坏数据的报告更加复杂。

如果有数据损坏,并且 zpool status –v 命令确定有快照数据受影响,请考虑运行以下命令来确定进一步的损坏数据路径: