如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!
诗檀软件专业数据库修复团队
服务热线 : 13764045638 QQ号:47079569 邮箱:service@parnassusdata.com
这个事件让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事件不在显示
重命名或丢弃问题表
如果有空间,建议重命名问题表,而不是在该阶段丢弃它。
重建表
例如: 通过输入.
重建表时,尤其注意保证存储子句正确。
创建需要的任何索引、触发器等,要再次确认存储子句正确
再次授权对表进行任何访问。
一旦新表被测试,就可以丢弃已重命名的原表。
Comment