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

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

服务热线 : 13764045638 QQ号:47079569 邮箱:service@parnassusdata.com

  适用于: Oracle Database - Enterprise Edition – 版本 8.1.5.0 到 12.1.0.2 [Release 8.1.5 to 12.1] 本文信息适用于任何平台。 11-Sep-2012检查相关性 21-Nov-2013检查相关性 26-Feb-2016检查相关性 目的 该脚本旨在提供一个简单,快捷的方式来运行DBMS_REPAIR以识别并跳过损坏块 要求 SQL*Plus 配置 以SYS用户运行sqlplus 指导 1.运行sqlplus。例如: sqlplus '/ as sysdba' 2.  从sqlplus运行脚本 CAUTION 此示例代码仅供教育目的,不受Oracle Support的支持。它经过内部测试,但是我们不保证它对你有用。请确保你在使用之前在测试环境中运行它。 脚本   REM 在给定表空间中创建repair 表: BEGIN DBMS_REPAIR.ADMIN_TABLES ( TABLE_NAME => 'REPAIR_TABLE', TABLE_TYPE => dbms_repair.repair_table, ACTION => dbms_repair.create_action, TABLESPACE => '&tablespace_name'); END; / REM 为schema.object 识别损坏块(这也能使用参数PARTITION_NAME在分区级别完成): set serveroutput on DECLARE num_corrupt INT; BEGIN num_corrupt := 0; DBMS_REPAIR.CHECK_OBJECT ( SCHEMA_NAME => '&schema_name', OBJECT_NAME => '&object_name', REPAIR_TABLE_NAME => 'REPAIR_TABLE', corrupt_count => num_corrupt); DBMS_OUTPUT.PUT_LINE('number corrupt: ' || TO_CHAR (num_corrupt)); END; / REM 可选地显示由check_object识别的任何损坏块: select BLOCK_ID, CORRUPT_TYPE, CORRUPT_DESCRIPTION from REPAIR_TABLE; REM 将被识别的块标记为corrupted(Soft Corrupt – 参考 Note 1496934.1 ) DECLARE num_fix INT; BEGIN num_fix := 0; DBMS_REPAIR.FIX_CORRUPT_BLOCKS ( SCHEMA_NAME => '&schema_name', OBJECT_NAME=> '&object_name', OBJECT_TYPE => dbms_repair.table_object, REPAIR_TABLE_NAME => 'REPAIR_TABLE', FIX_COUNT=> num_fix); DBMS_OUTPUT.PUT_LINE('num fix: ' || to_char(num_fix)); END; / REM 允许未来的DML 语句跳过损坏块: BEGIN DBMS_REPAIR.SKIP_CORRUPT_BLOCKS ( SCHEMA_NAME => '&schema_name', OBJECT_NAME => '&object_name', OBJECT_TYPE => dbms_repair.table_object, FLAGS => dbms_repair.SKIP_FLAG); END; /     注:
  • 在使用DBMS_REPAIR作为索引扫描后重建索引,如果访问到损坏块可能会产生错误。如果有一个唯一索引,则重新插入相同数据也可能会生成错误ORA-1。
  • Use the dbms_repair.NOSKIP_FLAG in the FLAGS value in procedure SKIP_CORRUPT_BLOCKS if it is needed to stop skipping corrupt blocks in the object after the dbms_repair.SKIP_FLAG was used. 如果需要的话在过程SKIP_CORRUPT_BLOCKS中使用FLAGS 值中的dbms_repair.SKIP_FLAG以在dbms_repair.SKIP_FLAG被使用后停止跳过对象中的损坏块。
  • 如果目标是为一个特定对象跳过损坏块,则只需要运行过程SKIP_CORRUPT_BLOCKS。在这种情况下仅生成ORA-1578的块将被跳过。如果生成了不同的错误,则需要运行这些额外的过程:ADMIN_TABLES,CHECK_OBJECT和FIX_CORRUPT_BLOCKS
  • 如果需要清理损坏的表,在使用过程SKIP_CORRUPT_BLOCKS后,该表可使用:"alter table <name> MOVE"被移动,而不是重建或truncate它。然后使用上述的dbms_repair.NOSKIP_FLAG。注意损坏块中的数据已丢失。
  • 过程CHECK_OBJECT 在阻止其他会话尝试执行DDL或获取另一个不兼容TM锁的段上获得MODE=3 Row-X (SX)的一个DML LOCK (TM) 。例如:在mode=2 row-S (SS) 或 3 Row-X (SX) 获得 TM锁的其他会话不被阻止。普通DML语句要求的锁TM 模式,如UPDATE/DELETE/INSERT 是3 Row-X (SX)。