Oracle DBMS_REPAIR 脚本

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

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

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

 

适用于:

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)。

Posted

in

by

Tags:

Comments

Leave a Reply

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