Oracle 什么是事件10231 ?

如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!

诗檀软件专业数据库修复团队

服务热线 : 13764045638 QQ号:47079569 邮箱:[email protected]

 

这个事件让Oracle跳过只进行全表扫描的某些类型的损坏块,因此允许输出或创建表作为选择类型的操作,以便从没有损坏块的表中检索行,损坏块中的数据丢失。

       Oracle 7.2以前的Oracle版本,该事件是受限的,因为它只允许跳过软损坏的块,大部分的1578错误是介质损坏造成的,在这种情况下,事件10231是不中用的。

       Oracle7.2起,该事件可以跳过多种形式的介质损坏块除了软损坏的块,因此是更为有用的,仍旧使用*NOT* 操作。

Note:28814.1 描述了当该事件失败时,可供选择的其他方法。

什么是SKIP_CORRUPT标志 ?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

        Oracle8i中起事件10231的功能 在PER-SEGMENT的基础上已被外在化,使得标记表有可能跳过损坏的块,使用DBMS_REPAIR包,该标志被设置或清除,DBA_TABLES有一个SKIP_CORRUPT列,用来表示对象的标志是否被设置。

        

设置该事件或标志

~~~~~~~~~~~~~~~~~~~~~~~~~

  该事件可以在会话中设置,或者在数据库实例级别中设置,如果你打算使用CREATE TABLE AS SELECT ALTER TABLE <> MOVE ,那么在会话中设置该事件就足够了,如果你想要输出表数据,最好在实例级别上设置该事件,如果在Oracle8i 或更高的版本中还可以设置SKIP_CORRUPT表属性。

  Oracle8i,9i,10g,11g

  ~~~~~~~~~~~~~~~~~~~

        连接为SYSDBA 用户,将表标记为需要跳过损坏块,于是:

             执行  DBMS_REPAIR.SKIP_CORRUPT_BLOCKS(”,”);

现在可以对损坏的表进行 TABLE AS SELECT / ALTER TABLE <> MOVE 操作以从未损坏的块中提取数据,或输出表。

例如:

CREATE TABLE salvage_emp

AS SELECT * FROM corrupt_emp;

        or

               ALTER TABLE <> MOVE

        要清除表使用属性:

          执行DBMS_REPAIR.SKIP_CORRUPT_BLOCKS(”,”,

                      flags=>dbms_repair.noskip_flag);

        请注意,当会话由于已设置的SKIP_CORRUPT跳过一个损坏块时,信息就会写入跟踪文件(而非警报日志)中,因为每个块都以以下形式跳过:

        

                 扫描表: segment: file# 6 block# 11

                    跳过损坏块 file# 6 block# 12

  会话中设置事件

  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  连接为Oracle用户,访问损坏表,执行命令:

ALTER SESSION SET EVENTS

‘10231 TRACE NAME CONTEXT FOREVER, LEVEL 10’;

现在可以对损坏表进行 CREATE TABLE AS SELECT 操作,以便从所有未损坏的块中提取数据,但是输出会失败,因为该事件仅仅在当前会话中设置。

例如:

CREATE TABLE salvage_emp

AS SELECT * FROM corrupt_emp;

        or

                ALTER TABLE <> MOVE

  在实例级别设置事件

  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

这要求事件被添加到用来启动该实例的初始化$ ORACLE_SID.ora文件中:

关闭数据库

编辑启动配置文件init.ora,并添加这样一行:

event=”10231 trace name context forever, level 10″

  确保它在init.ora文件中紧接着EVENT= lines出现。

                如果你正在使用的是二进制文件,请参考Note:160178.1

                如何在二进制文件中设置事件

启动

    如果实例启动检查事件参数的语法完全与以上匹配失败。要注意逗号,因为它是非常重要的。

显示参数事件

为检查事件已在正确的位置设置,应该观察init.ora文件文本的初始部分的行,如果没有检查哪个参数文件正被用于启动数据库,应该进行全表扫描操作从表中选出数据。

例如: 使用表级输出或创建表作为选择或ALTER TABLE <> MOVE

  输出提醒: 如果表很大,一些输出版本或许不能向输出文件写大于2Gb 的数据。想获取各种Oracle 版本2Gb 信息限制的一般信息,请看Note:62427.1

   

从损坏的块中挽救数据

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  SKIP_CORRUPT 和事件 10231 跳过损坏的块,从好块中提取数据,提取损坏的块中的信息,有三个主要的选择:

    从任何良好的索引选择列数据

        在下面两篇文章末尾加以讨论

           Oracle7 – 使用 ROWID 范围扫描    Note:34371.1

           Oracle8/8i – 使用ROWID范围扫描  Note:61685.1

    观察Oracle Support 能否从损坏块的HEX 转储中提取任何信息

    使用 Log Miner挽救一些数据也是可能的。

        

一旦提取了数据

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

一旦你所需要的数据提取到任何一个输出文件或到另一个表,在继续操作之前,确保有一个有效的数据库备份,进行备份是很重要的。

为重建对象和索引等,要再次检查是否已有SQL

        如果Oracle支持系统需要,我们要再次检查是否有任何诊断信息,进程中,要下探的对象会丢失某些信息,所以,现在捕捉是很重要的。

现在,你可以:

    如果 10231 被设置为实例级别:

  init.ora 文件中删除事件

  关闭和重启数据库

  显示参数事件

确保10231事件不在显示

重命名或丢弃问题表

如果有空间,建议重命名问题表,而不是在该阶段丢弃它。

重建表

例如: 通过输入.

    重建表时,尤其注意保证存储子句正确。

创建需要的任何索引、触发器等,要再次确认存储子句正确

再次授权对表进行任何访问。

一旦新表被测试,就可以丢弃已重命名的原表。


Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *