适用于:
Oracle Database - Enterprise Edition - 版本 7.0.16.0 到 11.2.0.2.0 [发行版 7.0 到 11.2]
本文档所含信息适用于所有平台
用途
处理 Oracle7/8/8i/9i/10g/11g/12c 中的 Oracle 块损坏
详细信息
文档内容
Options for various Segment Types:
简介
本文章讨论如何处理 Oracle 数据文件中的一个或多个坏块,并介绍了处理这些坏块的主要方法。在采取任何措施之前,请先阅读完整篇文章。
本文档未介绍内存坏块问题(通常为 ORA-600 [17xxx] 类型错误)。
注意:如果在启动时出现 ORA-1578 问题,请与当地支持中心联系,以获得参考建议。
本文章介绍了许多类型的错误,很多其他地方也可能引用到本文章。重要的是,您需要知道关于每个坏块的以下信息:
包含坏块的文件的绝对文件编号 (FILE NUMBER)。
本文中称为“&AFN”。
包含坏块的文件的名称。
本文中称为“&FILENAME”。
如果您知道文件编号,但不知道文件名,则可以使用 V$DATAFILE 来获取文件名:
SELECT name FROM v$datafile WHERE file#=&AFN;
如果文件号未显示在 Oracle8i 的 V$DATAFILE 中,且 &AFN 大于 DB_FILES 参数值,则该文件可能是临时文件。在这种情况下,可以使用以下查询找到文件名:
SELECT name FROM v$tempfile WHERE file#=(&AFN - &DB_FILES_value);
文件中坏块的块编号。
本文中称为“&BL”。
包含受影响块的表空间编号和名称。
本文中称为“&TSN”(表空间编号)和“&TABLESPACE_NAME”。
如果您不知道这些信息,请使用以下查询找到它们:
SELECT ts# "TSN" FROM v$datafile WHERE file#=&AFN;
SELECT tablespace_name FROM dba_data_files WHERE file_id=&AFN;
表空间中的坏块大小。
本文中称为“&TS_BLOCK_SIZE”。
SELECT block_size FROM dba_tablespaces
WHERE tablespace_name =
(SELECT tablespace_name FROM dba_data_files WHERE file_id=&AFN);
对于 Oracle 7、8.0 和 8.1,数据库中所有表空间使用相同的块大小。
对于这些版本,使用命令"SHOW PARAMETER DB_BLOCK_SIZE" 返回的值作为 “ &TS_BLOCK_SIZE”
例如:对于 ORA-1578 错误:
ORA-01578: ORACLE data block corrupted (file # 7, block # 12698)
ORA-01110: data file 22: '/oracle1/oradata/V816/oradata/V816/users01.dbf'
那么:
&AFN为 "22" (从错误 ORA-1110 部分获得)
&RFN为 "7" (从错误 ORA-1578 的"file #"部分获得)
&BL为 "12698" (从错误 ORA-1578 的"block #"部分获得)
&FILENAME为 '/oracle1/oradata/V816/oradata/V816/users01.dbf'
&TSN 及其他信息可以从上面提到的 SQL 语句获得
对于其他错误(ORA-600、ORA-1498 等),上述值应由 Oracle Support 提供给您,或从涵盖相关错误的文章中获取。
对于某些错误,如 ORA-1410“invalid ROWID(无效 ROWID)”、ORA-12899“value too large for column(列值过大)”等,未给出损坏的文件/块的详细信息。对于此类情况, Note:869305.1 可以帮助您定位损坏的行。
概述处理坏块的步骤
有多种原因可能导致坏块,包括:
坏的 IO 硬件/固件
OS 问题
Oracle 问题
对于执行过“UNRECOVERABLE”或“NOLOGGING”操作的数据库进行恢复
(在这种情况下可能产生 ORA-1578 错误 - 如下方所示)
产生 Oracle 错误的时间点可能要比最初发生任何块损坏的时间点晚得多。
在遇到坏块时,我们通常无从了解根本原因,并且在大多数情况下,当下最迫切的需求是重新启动数据库并使其运行起来,正因如此,本文将介绍用于解决坏块问题的步骤,如下所列:
确定坏块问题的范围,并确定这些问题是持久性问题还是暂时性问题。
如果问题涉及范围很大,或错误不稳定,则关键在于先识别原因(检查硬件等)。这点很重要,因为如果是底层硬件出现错误,恢复系统便毫无意义。
更换或拆下任何有问题的或可疑的硬件。
确定哪些数据库对象受到影响。
选择最合适的数据库恢复/数据抢救选项。
对于上述所有步骤,最好应收集证据并详细记录所采取的措施。本文中的“证据>>”标签列出了应收集的信息,以帮助您识别问题的根本原因。
由于 NOLOGGING 或 UNRECOVERABLE 操作导致的坏块
如果对某个对象执行了 NOLOGGING(或 UNRECOVERABLE)操作,随后又恢复了包含该对象的数据文件,则受到 NOLOGGING 操作影响的数据块将被标记为“坏块”,当您访问该数据块时将显示 ORA-1578 错误。
从Oracle8i开始报错ORA-26040("ORA-26040:
Data block was loaded using the NOLOGGING
option"),此时原因一目了然,而较早版本中则没有附件这条错误消息。如果坏块是由于对执行过 NOLOGGING
操作的数据文件进行恢复而产生的,则可以使用本文中从 Section 3 "Information to Record for Each Corruption" 开始之后介绍的内容,但请注意以下问题:
恢复操作无法找回受 NOLOGGING 操作影响的数据
块内的数据无法抢救
(1) 确定坏块问题的范围
请参考Note 836658.1查找坏块的范围。使用 RMAN或者DBVERIFY 扫描受影响的文件(以及一切重要的文件)也是不错的办法,这样可以检查是否有其他坏块,从而确定问题的范围。有关使用 DBVERIFY 的详细信息,请参阅
每次发生坏块错误时,都应记下完整的错误消息,并查看该实例的告警日志和跟踪文件,以了解任何相关的错误。首先进行这些步骤非常重要,这可以评估该损坏是单个块,还是由于 UNRECOVERABLE 操作产生的错误,抑或是更严重的问题。
一旦确定了损坏的文件/块组合列表,即可使用以下步骤来帮助确定应采取何种措施。
证据:
完整记录初始错误,以及发生错误的应用程序的详细信息。
及时地保存从告警日志中首次 (FIRST) 记录到问题前数小时到当前时间点所提取的内容。
保存告警日志中提到的任何跟踪文件。
记录最近遇到的任何 OS 问题。
记录是否正在使用任何特殊功能,例如:ASYNC IO、快速写入磁盘选项等。
记录当前的备份位置(日期、类型等)
记录数据库是否处于 ARCHIVELOG 模式,
例如:在SQL*Plus(或 Server Manager)中运行“ARCHIVE LOG LIST”
(2) 更换或拆下可疑硬件
大多数坏块问题是由故障硬件导致的。
如果出现硬件错误或可疑组件,最好进行修复,或者在执行恢复操作之前,确保在单独的磁盘子系统上有足够的可用空间用于恢复。
您可以使用以下步骤移动数据文件:
确保要迁移的文件已离线或数据库实例处于 MOUNT 状态(未打开)
将该数据文件物理还原(或复制)到新位置
例如:/newlocation/myfile.dbf
将该文件的新位置告知 Oracle。
例如:ALTER DATABASE RENAME FILE '/oldlocation/myfile.dbf' TO '/newlocation/myfile.dbf';
(请注意,您不能对临时文件进行重命名,而应删除临时文件并在新位置重新创建)
重要信息: 如果存在多个错误(不是由于 NOLOGGING操作导致的)
或 受影响文件所在的 OS 层面出现错误
或 错误是暂时性的且游离不定,
那么,如果不解决底层问题或准备另外的磁盘空间,那么进行任何操作都是毫无意义的。
与硬件供应商联系,以全面检查系统,并联系 Oracle Support,告知所有错误详情。
请注意: 如果硬件检查失败,即表明存在硬件问题,但硬件检查成功通过却并不能证明没有硬件相关问题 — 硬件测试报告成功但确实存在底层错误,这种情况也是经常发生。
如果使用了任何特殊 IO 选项,例如 direct IO、async IO 或类似的选项,最好将其禁用,以消除这些选项成为潜在问题原因的可能性。
(3) 每次坏块需记录的信息
在决定如何恢复之前,最好先确定哪些对象受到了影响,因为坏块可能发生在那些容易被重新创建的对象中。
例如:对于只有 5 行数据的表中发生的坏块,删除并重新创建表可能要比执行恢复快得多。
对于每个坏块,请收集下表中的信息。
进行此操作的步骤如下所述。
针对每次坏块需记录的信息
初始错误
绝对文件号
&AFN
相关文件号
&RFN
块编号
&BL
表空间
段类型
段
所有者.名称
相关对象
恢复选项
下列说明将有助于您针对每个坏块填写此表。
"初始错误"最初报告的错误。例如:ORA-1578/ORA-1110、ORA-600 和所有参数等。
"绝对文件号", "相关文件号"和"块号"文件号和块号应该已在错误中显示,或由 Oracle Support 提供,或在指引您参考本文章的其他文章的步骤中提供。
在 Oracle8/8i/9i/10g 中:绝对文件号和相关文件号通常是一样的,但也可能不同(尤其是在数据库是由 Oracle7 迁移而来的情况下)。请务必获得正确的 &AFN 和 &RFN 编号,否则您可能最终抢救的是错误的