跳过导航链接 | |
退出打印视图 | |
Oracle Solaris 11.1 管理:ZFS 文件系统 Oracle Solaris 11.1 Information Library (简体中文) |
1. Oracle Solaris ZFS 文件系统(介绍)
6. 使用 Oracle Solaris ZFS 快照和克隆
7. 使用 ACL 和属性保护 Oracle Solaris ZFS 文件
以下各节介绍如何确定数据损坏的类型以及如何修复数据(如有可能)。
ZFS 使用校验和、冗余和自我修复数据来最大限度地减少出现数据损坏的风险。但是,如果没有冗余池,如果将池降级时出现损坏,或者不大可能发生的一系列事件协同损坏数据段的多个副本,则可能会出现数据损坏。不管是什么原因,结果都是相同的: 数据被损坏,因此无法再进行访问。所执行的操作取决于被损坏数据的类型及其相对值。可能损坏以下两种基本类型的数据:
池元数据-ZFS 需要解析一定量的数据才能打开池和访问数据集。如果此数据被损坏,则整个池或部分数据集分层结构将变得不可用。
对象数据-在这种情况下,损坏发生在特定的文件或目录中。此问题可能会导致无法访问该文件或目录的一部分,或者此问题可能导致对象完全损坏。
数据是在常规操作期间和清理过程中验证的。有关如何验证池数据完整性的信息,请参见检查 ZFS 文件系统完整性。
缺省情况下,zpool status 命令仅说明已出现损坏,而不说明出现此损坏的位置。例如:
# zpool status tank 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: 2 data errors, use '-v' for a list
每个错误仅指示在给定时间点出现了错误。每个错误不一定仍存在于系统上。一般情况下是如此。某些临时故障可能会导致数据损坏,故障结束后会自动修复。完整的池清理可保证检查池中的每个活动块,因此每当清理完成后都会重置错误日志。如果确定错误不再存在,并且不希望等待清理完成,则使用 zpool online 命令重置池中的所有错误。
如果数据损坏位于池范围内的元数据中,则输出稍有不同。例如:
# zpool status -v morpheus pool: morpheus id: 13289416187275223932 state: UNAVAIL status: The pool metadata is corrupted. action: The pool cannot be imported due to damaged devices or data. see: http://support.oracle.com/msg/ZFS-8000-72 config: morpheus FAULTED corrupted data c1t10d0 ONLINE
如果出现池范围的损坏,池将被置于 FAULTED 状态,这是因为池无法提供所需的冗余级别。
如果文件或目录被损坏,则系统可能仍然正常工作,具体取决于损坏的类型。如果系统中存在完好的数据副本,则任何损坏实际上都是不可恢复的。如果数据具有价值,必须从备份中恢复受影响的数据。尽管这样,您也许能够从此损坏恢复而不必恢复整个池。
如果损坏出现在文件数据块中,则可以安全地删除该文件,从而清除系统中的错误。使用 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 status -v 命令不会显示所有损坏数据的路径。ZFS 清理算法遍历池并访问每个数据块一次。该算法只报告第一次出现的损坏。因此,只生成一个指向受影响文件的路径。请注意,这也适用于做了重复数据删除处理的损坏块。
如果有损坏的数据,并且 zpool status - v 命令识别出有快照数据受影响,请考虑搜索其他损坏数据路径。
# find mount-point -inum $inode -print # find mount-point/.zfs/snapshot -inum $inode -print
第一条命令搜索针对指定文件系统及其所有快照报告的损坏数据的 inode 编号。第二条命令搜索具有相同 inode 编号的快照。
如果池元数据发生损坏,并且该损坏导致池无法打开或导入,则可以使用以下选项:
可以尝试使用 zpool clear -F 命令或 zpool import - F 命令恢复池。这些命令尝试回滚最后几次池事务,使其回到运行状态。可以使用 zpool status 命令查看损坏的池和建议的恢复步骤。例如:
# zpool status pool: tpool state: UNAVAIL status: The pool metadata is corrupted and the pool cannot be opened. action: Recovery is possible, but will result in some data loss. Returning the pool to its state as of Fri Jun 29 17:22:49 2012 should correct the problem. Approximately 5 seconds of data must be discarded, irreversibly. Recovery can be attempted by executing 'zpool clear -F tpool'. A scrub of the pool is strongly recommended after recovery. see: http://support.oracle.com/msg/ZFS-8000-72 scrub: none requested config: NAME STATE READ WRITE CKSUM tpool UNAVAIL 0 0 1 corrupted data c1t1d0 ONLINE 0 0 2 c1t3d0 ONLINE 0 0 4
前面的输出中描述的恢复过程要使用以下命令:
# zpool clear -F tpool
如果您尝试导入损坏的存储池,将会看到类似如下的消息:
# zpool import tpool cannot import 'tpool': I/O error Recovery is possible, but will result in some data loss. Returning the pool to its state as of Fri Jun 29 17:22:49 2012 should correct the problem. Approximately 5 seconds of data must be discarded, irreversibly. Recovery can be attempted by executing 'zpool import -F tpool'. A scrub of the pool is strongly recommended after recovery.
前面的输出中描述的恢复过程要使用以下命令:
# zpool import -F tpool Pool tpool returned to its state as of Fri Jun 29 17:22:49 2012. Discarded approximately 5 seconds of transactions
如果损坏的池位于 zpool.cache 文件中,则系统引导时会发现该问题,并通过 zpool status 命令报告损坏的池。如果池不在 zpool.cache 文件中,将无法成功导入或打开它,当您尝试导入该池时,会看到池受损的消息。
您可以在只读模式下导入受损的池。此方法使您可以导入该池,从而可以访问数据。例如:
# zpool import -o readonly=on tpool
有关在只读模式下导入池的更多信息,请参见在只读模式下导入池。
您可以使用 zpool import -m 命令导入缺少日志设备的池。有关更多信息,请参见导入缺少日志设备的池。
如果无法使用上述池恢复方法恢复池,则必须从备份副本中恢复池及其所有数据。所用的机制通常随池配置和备份策略的不同而有很大差别。首先,保存 zpool status 命令所显示的配置,以便在销毁池后可以重新创建它。然后,使用 zpool destroy -f 命令销毁池。
此外,将描述数据集的布局和在本地设置的各种属性的文件保存在某个安全的位置(因为在使池无法访问后此信息将变得无法访问)。使用池配置和数据集布局,可以在销毁池后重新构造完整的配置。然后可以使用任何备份或恢复策略填充数据。