处理 Oracle7/8/8i/9i/10g/11g/12c 中的 Oracle 块损坏
由于 NOLOGGING 或 UNRECOVERABLE 操作导致的坏块
Options for various Segment Types:
CACHE CLUSTER INDEX PARTITION INDEX LOBINDEX LOBSEGMENT ROLLBACK
TABLE PARTITION TABLE TEMPORARY IOT(索引组织表) TYPE2 UNDO 其他一些段类型 No Segment
块级恢复 ,
数据文件恢复 ,
数据库恢复 ,
本文章讨论如何处理 Oracle 数据文件中的一个或多个坏块,并介绍了处理这些坏块的主要方法。在采取任何措施之前,请先阅读完整篇文章。
本文档未介绍内存坏块问题(通常为 ORA-600 [17xxx] 类型错误)。
注意: 如果在启动时出现 ORA-1578 问题,请与当地支持中心联系,以获得参考建议。
本文章介绍了许多类型的错误,很多其他地方也可能引用到本文章。重要的是,您需要知道关于每个坏块的以下信息:
对于 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'
那么:
对于其他错误(ORA-600、ORA-1498 等),上述值应由 Oracle Support 提供给您,或从涵盖相关错误的文章中获取。
对于某些错误,如 ORA-1410“invalid ROWID(无效 ROWID)”、ORA-12899“value too large for column(列值过大)”等,未给出损坏的文件/块的详细信息。对于此类情况, Note:869305.1 可以帮助您定位损坏的行。
有多种原因可能导致坏块,包括:
产生 Oracle 错误的时间点可能要比最初发生任何块损坏的时间点晚得多。
在遇到坏块时,我们通常无从了解根本原因,并且在大多数情况下,当下最迫切的需求是重新启动数据库并使其运行起来,正因如此,本文将介绍用于解决坏块问题的步骤,如下所列:
对于上述所有步骤,最好应收集证据并详细记录所采取的措施。本文中的“证据>>”标签列出了应收集的信息,以帮助您识别问题的根本原因。
如果对某个对象执行了 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" 开始之后介绍的内容,但请注意以下问题:
请参考Note 836658.1查找坏块的范围。使用 RMAN或者DBVERIFY 扫描受影响的文件(以及一切重要的文件)也是不错的办法,这样可以检查是否有其他坏块,从而确定问题的范围。有关使用 DBVERIFY 的详细信息,请参阅 Note:35512.1
每次发生坏块错误时,都应记下完整的错误消息,并查看该实例的告警日志和跟踪文件,以了解任何相关的错误。首先进行这些步骤非常重要,这可以评估该损坏是单个块,还是由于 UNRECOVERABLE 操作产生的错误,抑或是更严重的问题。
一旦确定了损坏的文件/块组合列表,即可使用以下步骤来帮助确定应采取何种措施。
大多数坏块问题是由故障硬件导致的。
如果出现硬件错误或可疑组件,最好进行修复,或者在执行恢复操作之前,确保在单独的磁盘子系统上有足够的可用空间用于恢复。
您可以使用以下步骤移动数据文件:
如果使用了任何特殊 IO 选项,例如 direct IO、async IO 或类似的选项,最好将其禁用,以消除这些选项成为潜在问题原因的可能性。
在决定如何恢复之前,最好先确定哪些对象受到了影响,因为坏块可能发生在那些容易被重新创建的对象中。
例如:对于只有 5 行数据的表中发生的坏块,删除并重新创建表可能要比执行恢复快得多。
对于每个坏块,请收集下表中的信息。
进行此操作的步骤如下所述。
| 针对每次坏块需记录的信息 | ||||||||
|---|---|---|---|---|---|---|---|---|
| 初始错误 |
绝对文件号 &AFN |
相关文件号 &RFN |
块编号 &BL |
表空间 | 段类型 |
段 所有者.名称 |
相关对象 | 恢复选项 |
下列说明将有助于您针对每个坏块填写此表。
相关对象和能够使用的恢复选项取决于 SEGMENT_TYPE。对于各种最常见的段类型,其他查询和可能的恢复选项如下所列。
CACHE
CLUSTER
INDEX PARTITION
INDEX
LOBINDEX
LOBSEGMENT
ROLLBACK
TABLE PARTITION
TABLE
TEMPORARY
IOT
TYPE2 UNDO
Some other Segment Type
"no rows" from the query
如果段类型为 CACHE,请再次检查您是否输入了正确的 SQL语句和参数。
解决方法:修复数据块采用块级恢复方法
{Continue} {Back to Segment List}
如果段类型为 CLUSTER,则应确定它包含哪些表。
解决方法:
修复数据块采用块级恢复方法
{Collect TABLE information} {Back to Segment List}
如果段类型为 INDEX PARTITION,请记录名称和所有者,然后确定哪些分区受到影响:
解决方法:
或者
使用下列语句可以重建索引分区:
ALTER INDEX xxx REBUILD PARTITION ppp;
(请注意下方“重建索引”中所述的 REBUILD 选项)
{Continue} {Back to Segment List}
确定索引位于哪个表中:
CONSTRAINT_TYPE 的可能值包括:
- P 索引支持主键约束。
- U 索引支持唯一约束。
如果索引支持主键约束(类型“P”),则确认主键是否被任何外键约束引用:
解决方法:
修复数据块采用块级恢复方法
或 重建索引(任何相关联的约束会随之禁用/启用)
(请注意下方"重建索引"中所述的 REBUILD 选项)。如果对象owner是sys用户,那么请联系oracle技术支持。
{Continue} {Back to Segment List}
如果段类型为 ROLLBACK,请联系 Oracle Support,因为 ROLLBACK 段坏块需要特殊处理。
解决方法:
修复数据块采用块级恢复方法
{Continue} {Back to Segment List}
TYPE2 UNDO 是系统管理的 undo 段,它是 rollback 段的一种特殊形式。这些段的坏块需要特殊处理。
解决方法:
修复数据块采用块级恢复方法
{Continue} {Back to Segment List}
如果段类型为 TABLE PARTITION,请记录名称和所有者,然后确定哪些分区受到影响:
然后按照处理 TABLE 段的步骤继续下面的操作。
解决方法:
或者
如果所有坏块均位于同一个分区,则此时可以采取的一个做法是用一个空表 EXCHANGE 坏块所在的分区,这可以让应用程序继续运行(无法访问坏块所在的分区中的数据),然后可以从之前的空表中提取任何未损坏的数据。
有关其他选项,请参见下面的 TABLE 选项。
{Continue} {Back to Segment List}
如果所有者为“SYS”,则联系 Oracle Support 并上传所有详细信息。
可能需要恢复数据库。
对于非字典 TABLE 或 TABLE PARTITION,确定表中存在哪些索引:
并确定表中是否存在任何主键:
如果存在主键,则确认它是否被任何外键约束引用:
解决方法:
修复数据块采用块级恢复方法
或者
如果所有者为“SYS”,则联系 Oracle Support 并上传所有详细信息。
对于非字典表,可能的选项包括:
恢复
或 抢救表(或分区)中的数据
然后 重新创建表(或分区)
或 忽略坏块
(例如:使用 DBMS_REPAIR 标记需要跳过的问题块)
{Continue} {Back to Segment List}
IOT 表中的坏块应按照表或分区表中的处理方式来处理。
唯一的例外是如果 PK 损坏。
IOT 表的 PK 就是表本身,它不能被删除和重新创建。
解决方法:
修复数据块采用块级恢复方法
或者
如果所有者为“SYS”,则联系 Oracle Support 并上传所有详细信息。
对于非字典表,可能的选项包括:
恢复
或 抢救表(或分区)中的数据
然后 重新创建表(或分区)
或 忽略坏块
(DBMS_REPAIR 不适用于 IOT)
{Continue} {Back to Segment List}
确定 LOB 属于哪个表:
SELECT table_name, column_name
fROM dba_lobs
wHERE owner='&OWNER'
AND index_name='&SEGMENT_NAME';
不可以重建 LOB 索引,因此您必须将该问题作为受影响的表中 LOB 列上的坏块来处理。
使用 ”TABLE“ 部分中的 SQL 语句获取包含损坏的 LOB 索引的表的索引和约束信息,然后返回此处。
解决方法:
或者
移动LOG 段
如果所有者为“SYS”,则联系 Oracle Support 并上传所有详细信息。
{Continue} {Back to Segment List}
确定 LOB 属于哪个表:
例如:
SELECT table_name, column_name
FROM dba_lobs
WHERE owner='&OWNER'
AND segment_name='&SEGMENT_NAME';
对于非字典表 ...
使用 ”TABLE“ 部分中的 SQL 语句获取包含坏块的 LOB 数据的表的索引和约束信息,然后返回此处查找具体受影响的行的详细信息。
要查找引用损坏的 LOB 块的具体行可能比较困难,因为报告的错误中不会显示表中的哪一行数据包含损坏的 LOB 数据。
Typically one can refer to application logs or any SQL_TRACE or 10046 trace of a session hitting the error (if available) or see if having
set in the session helps identify the current SQL/binds/row.
然后等待应用程序触发该错误,并查找跟踪文件。
如果没有任何线索,您可以构建 PLSQL 块,逐行扫描问题表以提取 LOB 列数据,扫描将一直循环进行,直至发生错误。此方法可能需要一段时间,但它应该可以找到引用了损坏的 LOB 块的数据行的主键或 ROWID。
例如:
set serverout on
exec dbms_output.enable(100000);
declare
error_1578 exception;
pragma exception_init(error_1578,-1578);
n number;
cnt number:=0;
badcnt number:=0;
begin
for cursor_lob in
(select rowid r, &LOB_COLUMN_NAME L from &OWNER..&TABLE_NAME)
loop
begin
n:=dbms_lob.instr(cursor_lob.L,hextoraw('AA25889911'),1,999999) ;
exception
when error_1578 then
dbms_output.put_line('Got ORA-1578 reading LOB at '||cursor_lob.R);
badcnt:=badcnt+1;
end;
cnt:=cnt+1;
end loop;
dbms_output.put_line('Scanned '||cnt||' rows - saw '||badcnt||' errors');
end;
/
another script more generic:
解决方法:
可能需要恢复数据库,如果所有者为“SYS”,则联系 Oracle Support 并上传所有详细信息。
对于非字典表,可能的选项包括:
恢复
或者用empty_clob/empty_blob更新lob列,避免在出现ORA-1578;这样可以清理表里面的lob列:
将损坏的lob设置为empty lob后,之前的数据块还会放回这个lob的freelist。这些空间以后可能会被重用,
当这些数据块再次被使用时,会出现ORA-1578 错误,因此在empty lob后,再将lob 段移动到新的段:
或 抢救表(及其 LOB 列)中的数据
然后 重新创建表
或 忽略坏块
(不可以在 LOB 段上使用 DBMS_REPAIR)
{Continue} {Back to Segment List}
如果段类型为 TEMPORARY,则坏块不会影响永久对象。检查发生问题的表空间是否正在被用作 TEMPORARY 表空间:
解决方法:
通常情况下,不需要进行任何还原,但如果磁盘可能有问题,且表空间包含有用数据,则最好对数据库中受影响的文件进行恢复。
{Continue} {Back to Segment List}
如果返回的段类型未包含在上述类型中,则请联系 Oracle Support 并提供迄今为止收集的所有信息,以获得相关建议。
{Continue} {Back to Segment List}
如果没有包含坏块的 extent,则首先再次检查查询中使用的参数。如果您确定文件号和块编号是正确的,且不属于 DBA_EXTENTS 中的某个对象,则执行以下操作:
选项:
未使用的 Oracle 块上的错误可以忽略,因为如果需要使用该块,Oracle 会创建新的块映像(格式化),因此,该块上的任何问题将永不会被读取。
如果您怀疑该块可能是空间管理块,则可以使用 DBMS_SPACE_ADMIN 包来帮助您进行检查:
以上命令会将不一致写入跟踪文件,但如果遇到致命的坏块,它将报告如下错误:
{Continue} {Back to Segment List}
证据
对于每个坏块,如果需要尝试并确定实际坏块原因,则收集如下物理证据也是一个比较好的方法:
{Continue} {Back to Segment List}
现在,最佳的恢复选项取决于受影响的对象。前面第 (3) 部分中的说明应该已经重点介绍了针对每个受影响对象的主要可用选项。选择的实际恢复方法可能包含以下一种或多种混合方法:
是否需要进行任何恢复操作?
表空间中,或位于不再属于任何数据库对象的块中,则无需进行任何操作,尽管将问题表空间重定位到其他存储设备中可能较为明智。
请参阅警告
可以使用完全恢复吗?
要选用完全恢复,必须满足如下条件:
(“ARCHIVE LOG LIST”命令显示 Archivelog 模式)
拥有受影响文件的完好备份。请注意,在某些情况下,坏块可能已经存在,但在很长一段时间内未被发现。如果最近的数据文件备份仍包含坏块,那么只要您拥有所 有必需的归档日志,就可以尝试使用更早的备份。
(通常可以使用 DBV START= / END= 选项来检查位于某个备份文件的恢复副本中的特定块是否损坏)
从备份时间开始到当前时间点的所有归档日志均可用
当前的在线日志均可用且完好无缺
错误不是由运行 NOLOGGING 操作之后执行的恢复所导致的
如果满足上述条件,完全恢复通常是首选方法
*但请注意*
如果执行数据库恢复后坏块仍然存在,则表示所有备份都包含坏块,底层错误仍存在,或问题通过 redo 重现。在这些情况下,需要选择其他一些恢复选项。
请参阅 "(4A) 完全恢复" ,以了解完全恢复步骤。
如果不需要从对象本身提取任何数据,能否删除或重新创建该对象?
您可以删除对象或从脚本/最近导出的副本重新创建对象。一旦删除一个对象后,该对象中的块将被标记为“空闲”,并且该块在被分配到新对象时将被重新格式化。明智的做法是,对表进行重命名,而不是删除,除非您完全确定不再需要其中的数据。
对于表分区,只需要删除受影响的分区。
如果坏块影响到分区段头,或者包含分区头的文件处于离线状态,则 DROP PARTITION 可能会失败。在这种情况下,首先将其更换为具有相同定义的表,之后仍然可以删除该分区。
最常见的可重建对象为索引。始终在处理表中的索引问题之前处理表坏块。
有关详细信息,请参阅"(4B) 重建索引" 。
对于任何段,如果您拥有坏块的绝对文件号和块号,则可使用以下快速提取对象 DDL 的方法:
set long 64000
select dbms_metadata.get_ddl(segment_type, segment_name, owner)
FROM dba_extents
WHERE file_id=&AFN
AND &BL BETWEEN block_id AND block_id + blocks -1;
是否需要在重新创建对象之前抢救数据?
如果问题位于定期更新的关键应用表上,则可能需要尽可能多地抢救表中数据,然后重新创建该表。
有关详细信息,请参阅"(5C) 抢救表中数据" 。
当前忽略坏块是否可取?
在某些情况下,最直接的选项可能就是忽略坏块,并阻止应用程序对它进行访问。
有关详细信息,请参阅 "(5D) 忽略坏块"。
最后的选项
下列选项是否可行?
将数据库或表空间恢复到较早的时间点(通过时间点恢复)
或还原出现坏块前的冷备份
或使用现有导出文件
有关详细信息,请参阅"(5E) 最后的选项"。
如果数据库处于 ARCHIVELOG 模式下,且您拥有受影响文件的完好备份,则恢复通常为首选方法。
这不保证可以解决问题,但的确可以有效的解决大部分坏块问题。如果恢复再次引发问题,则返回到以上选项列表并选择其他方法。
如果使用的是 Oracle9i(或更高版本),则可以使用 RMAN BLOCKRECOVER 命令执行块级恢复。
如果使用的是较早版本的 Oracle,则可以执行数据文件恢复(数据库其他部分可以继续运行),或数据库恢复(需要关闭数据库)。
如果使用的是 Oracle 11g(或更高版本),则可以使用“Data Recovery Advisor(数据恢复指导)”.
自 Oracle9i 版本起,RMAN 允许恢复单个块,同时数据库的其他部分(包括数据文件中的其他块)仍可以进行正常访问。请注意,块级恢复只能将块完全恢复到当前时间点。
例如:
实际情况是,文件 6 的块 30 上发生 ORA-1578 错误,可能是由于介质问题导致的坏块,且您拥有该文件的完好冷备份映像,并已还原到“.../RESTORE/filename.dbf”。
假设所有归档日志均存在(位于默认位置),则可以通过 RMAN 使用以下命令序列执行块级恢复:
rman nocatalog
connect target
catalog datafilecopy '.../RESTORE/filename.dbf';
run {blockrecover datafile 6 block 30;}
此操作将使用注册的数据文件备份映像和任何需要的归档日志来执行块恢复,仅将有问题的块恢复到当前时间点。
有关 RMAN BLOCKRECOVER 命令和限制的所有详细信息,请参阅文档 Note 144911.1。
数据文件恢复包括下列步骤。如果有多个文件,则针对每个文件重复执行这些步骤,或参阅下面的“数据库恢复”。当数据库处于 OPEN 或 MOUNTED 状态时,均可使用这些步骤。
使受影响的数据文件离线
将文件复制到安全位置(以防备份损坏)
将文件的最新备份还原到完好的磁盘上
使用 DBVERIFY 检查还原的文件是否有坏块
有关使用 DBVERIFY 的详细信息,请参阅 Note:35512.1
假设还原的文件完好,则将数据文件重命名并保存到新位置(如果不是原来的位置)
恢复数据文件
使数据文件上线
数据库恢复通常包含以下步骤:
将待恢复的所有文件的当前副本复制到安全位置
将备份文件还原到完好的磁盘上
请勿还原控制文件或在线 REDO 日志文件
使用 DBVERIFY 检查还原的文件。有关使用 DBVERIFY 的详细信息,请参阅 Note:35512.1
对任何需要重新定位的数据文件进行重命名
确保所有必需的文件在线
恢复数据库
打开数据库
例如: ALTER DATABASE OPEN;
一旦执行了完全恢复,最好在允许使用之前先检查数据库:
针对每个问题对象运行:
检查表/索引是否存在不匹配。
如果有任何 undo 操作曾被放弃,此命令可能会显示不匹配,此时需要重建索引。
在应用程序级别检查表中数据的逻辑完整性。
损坏对象为用户索引时,如果底层表没有损坏,则可以删除并重建该索引。
如果底层表也已经损坏,则应在重建任何索引之前先解决该表的坏块。
如果收集的信息表示索引有从属外键约束,则需要执行以下操作:
对于索引分区,可以执行以下命令:
注意:
如果损坏的对象为 TABLE 或 CLUSTER 或 LOBSEGMENT,则您必须明白,坏块内的数据已经丢失。
部分数据可能可以从块的 HEX 转储中,或从索引涵盖的列中抢救回来。
从包含坏块的表中提取数据有多种方法。选择最恰当的方法,详细信息如下所述。这些方法的目的是从可访问的表块中提取尽可能多的数据。通常,将损坏的表重命名是一个比较好的方法,这样就可以使用正确的名称创建新对象。
- 使用 DBMS_REPAIR.ADMIN_TABLES 创建管理表
- 使用 DBMS_REPAIR.CHECK_OBJECT 找到问题块
- 在损坏问题块之前将其中所有完好的数据导出。
- 使用 DBMS_REPAIR.FIX_CORRUPT_BLOCKS 将找到的问题块标记为“坏块”,然后它们就会显示 ORA-1578
- 如果需要,使用 DBMS_REPAIR.SKIP_CORRUPT_BLOCKS 跳过表中的坏块。
在 LOB 段上不可以使用 DBMS_REPAIR。
如果坏块 LOB 块未被表中的任何行引用,则应该可以使用 CREATE TABLE as SELECT (CTAS) 来按选择创建表,或按原样导出/删除/导入该表。
如果坏块 LOB 块被某个行引用,则应该可以使用不包括问题行的 WHERE 谓词进行选择或导出。
警告:
可以将问题行的 LOB 列值更新为 NULL,从而使 SELECT 操作不再返回ORA-1578 错误 *但是*
坏块将等待被重新使用,随着对行中的 LOB 列进行 INSERT 或 UPDATE
操作,当有问题的块被重新使用时,最后还是会报ORA-1578错误,那时的情况比已知行出现坏块更糟糕。
因此,只有您打算立刻重新创建表,才应该将 LOB 列设为 NULL。
由于坏块本身已经“损坏”,则从该块中提取的任何数据都应被视为可疑数据。从坏块本身获取数据行的主要方法包括:
对于 TABLE 的块,Oracle Support 可以使用一款尝试解释块内容的工具。
"Convert HEX or BLOCKDUMP to Readable form" Note:47419.1
使用表中现有索引,利用落在坏块内的ROWID 来提取索引所涵盖的列数据,上文提到的 ROWID 范围扫描文章在接近结束时对此内容有所介绍:
对于 Oracle8/8i,请参阅 Note:61685.1
对于 Oracle7,请参阅 Note:34371.1
在 redo 流上可以使用 LogMiner 来查找向问题块加载数据的初始插入/更新操作。此处的主要因素是数据实际被放入问题块的时间。
例如,行 2 可能在昨天已插入,而行 1 可能在 5 年前已插入。
出错时可以忽略坏块并接受报告的错误,或在应用程序级别阻止对出问题的块行进行访问。
例如:如果问题块/行位于子表中,则可以在应用程序级别阻止对父表中对应行的访问,从而子行就永不会被访问。(但要注意级联类约束)
这样做可能不利于批量访问数据的报告和其他任务,因此,为了阻止块在被访问时报错,前面
4C 中所述的 DBMS_REPAIR
选项也不失为一个可取的方法。使用这种方法标记并跳过坏块提供了一种短期的解决方案,从而在计划停机时可以尝试进行完全数据抢救和/或恢复,或留出更多时
间在第二个(克隆)数据库上尝试其他恢复选项。但请注意,使用 DBMS_REPAIR.FIX_CORRUPT_BLOCKS 标记块坏块将导致标记的块在恢复后还是“坏块”。
忽略坏块对于快速老化且即将被清除的数据而言是比较好的选择(例如,在按日期分区的表中,较老的分区将在某时间点被删除)。
在应用程序级别,可以忽略损坏的 LOB 列,直到可以重新构建该表。
确保不出现上述“警告”中的情形的一种方法是,确保应用程序只能通过表上的包含WHERE 谓词的视图来访分表中的数据。
例如:假设表 MYTAB(a number primary key,b clob)有一行或多行指向损坏的 LOB 数据。
ALTER TABLE MYTAB ADD ( BAD VARCHAR2(1) );
CREATE VIEW MYVIEW AS SELECT a,b FROM MYTAB WHERE BAD is null;
对任何问题行设置 BAD='Y'
如果只通过 MYVIEW 访问 MYTAB,该行将永不可见,因此也无法更新,从而实现了坏块条目隔离,直到问题解决。
很明显,此示例更多的是一个设计时解决方案,但某些应用程序可能已有类似机制,且可能只通过某个视图(或通过 RLS 策略)访问数据,从而提供某些选项来隐藏问题行。
虽然可以忽略坏块,但需要注意的是,坏块在运行 DBVERIFY、RMAN 备份时仍然会以警告/错误等形式出现。
请务必仔细记录您将在这些工具中看到的任何坏块,尤其是您期望在使用 RMAN 时跳过的任何块(例如,设置了 MAX_CORRUPT),并确保在清除坏块后移除任何对错误的“接受”选项。
例如:假设坏块已处理为忽略坏块,并在应用程序级别跳过问题行。
RMAN 可能被配置为在备份时接受坏块。
然后在稍后的表重组期间重新创建表。
如果 RMAN 配置未及时更新以反映目前已无任何错误,则 RMAN 可能会忽略稍后出现的某些其他坏块。
此外,还有重要的一点需要注意,忽略 table 段中的坏块可能导致查询返回不一致的结果。
例如:设置了 SKIP_CORRUPT 的表可能出现不同的结果,具体取决于是使用了了索引扫描还是表访问。
其他报告可能只是报错。
请注意,如果忽略坏块但使用 DBMS_REPAIR.FIX_CORRUPT_BLOCKS 标记,系统会向坏块中写入 redo 信息,这可能会限制后续的恢复选项。
如果你有 standby 环境(物理或逻辑),请首先对其进行检查。
无论问题发生在何种类型的块上,均可使用一种可能的选项,即将数据库或问题表空间恢复到出现坏块之前的某个时间点。此选项的困难之处在于,并不总能知道问题首次出现的时间。
DBVERIFY 通常可用于检查还原的文件是否存在坏块。
有关使用 DBVERIFY 的详细信息,请参阅Note:35512.1 。尤其是,START= / END= DBV 选项可用于在还原的备份映像上快速进行首次测试,以检查问题块本身是否出错。
本部分列出了一些可用于进行恢复操作的最终选项。
如果您看到这里,则必定发生了以下一种或多种情况:
最后的机会:
请注意,如果您丢失了数据文件的所有副本,但仍具有自文件创建以来的全部归档日志,则仍有可能恢复该文件。
例如:
ALTER DATABASE CREATE DATAFILE '....' [as '...'] ;
RECOVER DATAFILE '....'
ALTER DATABASE DATAFILE '....' ONLINE;
如果您遇到这种情况,请在继续下面的操作之前先尝试使用这些步骤来恢复数据文件。
如果您到达这一步,就说明没有其他办法可以将文件恢复到当前时间点。此时最好关闭实例,并对当前数据库进行备份,以便在选用的措施失败后仍然能够回退到当前时间点。(例如:如果发现备份坏块)。
可用的一些选项概述如下:
恢复到早期的冷备份
- 例如:如果处于 NOARCHIVELOG 模式
从冷备份建立克隆数据库,并提取(导出)问题表,或传输问题表空间。
使用基于时间点的恢复将数据库恢复到一致的时间点
表空间基于时间点的恢复
- 可以仅对受影响的表空间执行基于时间点的恢复。许多文档均对表空间基于时间点的恢复做了介绍,如 Note:223543.1.
从逻辑导出/副本重新创建数据库
- 需要具有完好的数据库逻辑备份
- 注意:要使用此选项,必须重新创建数据库。
- 与其他选项一样,可以在克隆数据库中进行重新创建,只为获得问题表的完好映像。
如果已具有完好备份,使用 DB_BLOCK_CHECKING=TRUE 进行前滚将有助于找到首次出错的时间点。在调查恢复选项时,通常不需要关闭问题数据库。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31393455/viewspace-2130466/ ,如需转载,请注明出处,否则将追究法律责任。