oracle 恢复表违反主键_处理 Oracle 块损坏 (文档 ID 1526911.1)

本文档提供了处理 Oracle 数据库中坏块问题的详细步骤,包括确定坏块范围、硬件检查、记录错误信息、确定受影响对象及恢复选项。主要讨论了如何处理由于 NOLOGGING 操作导致的坏块,以及如何识别和恢复各种类型的段(如表、索引、回滚段等)。此外,还涵盖了数据抢救、忽略坏块和数据库恢复的策略,为数据库管理员提供了一套全面的故障排除和恢复指南。
摘要由CSDN通过智能技术生成

适用于:

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 编号,否则您可能最终抢救的是错误的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值