利用DBMS_REPAIR包检查以及COPY处理坏块:

用UE随便修改了几个字符:

SQL> select distinct ename from emp3;
select distinct ename from emp3
                           *
第 1 行出现错误:
ORA-01578: ORACLE 数据块损坏 (文件号 6, 块号 201)
ORA-01110: 数据文件 6: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST.DBF'


DBV检查数据文件,发现有1坏块:

D:\>dbv file='D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST.DBF' blocksize=8192

DBVERIFY: Release 10.2.0.4.0 - Production on 星期一 5月 5 14:13:13 2008

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

DBVERIFY - 开始验证: FILE = D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST.DBF
页 201 标记为损坏
Corrupt block relative dba: 0x018000c9 (file 6, block 201)
Bad check value found during dbv:
Data in bad block:
 type: 6 format: 2 rdba: 0x018000c9
 last change scn: 0x0000.000b0e50 seq: 0x1 flg: 0x06
 spare1: 0x0 spare2: 0x0 spare3: 0x0
 consistency value in tail: 0x0e500601
 check value in block header: 0x2969
 computed block checksum: 0x3939

 

DBVERIFY - 验证完成

检查的页总数: 638
处理的页总数 (数据): 495
失败的页总数 (数据): 0
处理的页总数 (索引): 0
失败的页总数 (索引): 0
处理的页总数 (其它): 24
处理的总页数 (段)  : 0
失败的总页数 (段)  : 0
空的页总数: 118
标记为损坏的总页数: 1
流入的页总数: 0
最高块 SCN            : 725123 (0.725123)

D:\>

创建修复的表,存储坏块的信息:

SQL> begin
  2  dbms_repair.admin_tables(
  3  table_name=>'REPAIR_TABLE',
  4  TABLE_TYPE=>DBMS_REPAIR.REPAIR_TABLE,
  5  ACTION=>DBMS_REPAIR.CREATE_ACTION,TABLESPACE=>'TEST');
  6  END;
  7  /

PL/SQL 过程已成功完成。

SQL> SHOW USER
USER 为 "SYS"
SQL> select owner,tablespace_name from dba_tables where table_name='REPAIR_TABLE';

OWNER                          TABLESPACE_NAME
------------------------------ ------------------------------
SYS                            TEST

 

SQL> set serveroutput on
SQL> declare  num_corrupt int;
  2  begin
  3  num_corrupt :=0;
  4  dbms_repair.check_object(schema_name=>'SCOTT',object_name=>'EMP3',
  5  repair_table_name=>'REPAIR_TABLE',corrupt_count=>num_corrupt);
  6  end;
  7  /

PL/SQL 过程已成功完成。

 


SQL> select OBJECT_ID,TABLESPACE_ID,RELATIVE_FILE_ID,BLOCK_ID,SCHEMA_NAME,OBJECT_NAME,
  2      REPAIR_DESCRIPTION,MARKED_CORRUPT  from repair_table;

 OBJECT_ID TABLESPACE_ID RELATIVE_FILE_ID   BLOCK_ID SCHEMA_N OBJECT_ REPAIR_DESCRIPTION             MARKED
---------- ------------- ---------------- ---------- -------- ------- ------------------------------ ------
     53322             7                6        201 SCOTT    EMP3    mark block software corrupt    TRUE

 

SQL> DECLARE NUM_FIX INT;
  2  BEGIN
  3  NUM_FIX :=0;
  4  DBMS_REPAIR.FIX_CORRUPT_BLOCKS(SCHEMA_NAME=>'SCOTT',
  5  OBJECT_NAME=>'EMP3',
  6  OBJECT_TYPE=>DBMS_REPAIR.TABLE_OBJECT,
  7  REPAIR_TABLE_NAME=>'REPAIR_TABLE',
  8  FIX_COUNT=>NUM_FIX);
  9  END;
 10  /

PL/SQL 过程已成功完成。


发现REPAIR_TABLE又插入了一条:

SQL> select OBJECT_ID,TABLESPACE_ID,RELATIVE_FILE_ID,BLOCK_ID,SCHEMA_NAME,OBJECT_NAME,
  2  REPAIR_DESCRIPTION,MARKED_CORRUPT  from repair_table;

 OBJECT_ID TABLESPACE_ID RELATIVE_FILE_ID   BLOCK_ID SCHEMA_N OBJECT_ REPAIR_DESCRIPTION            MARKED
---------- ------------- ---------------- ---------- -------- ------- ----------------------------- ------
     53322             7                6        201 SCOTT    EMP3    mark block software corrupt    TRUE
     53322             7                6        201 SCOTT    EMP3    mark block software corrupt    TRUE


SQL> conn scott/tiger
已连接。
SQL> select distinct ename from emp3;
select distinct ename from emp3
*
第 1 行出现错误:
ORA-01578: ORACLE 数据块损坏 (文件号 6, 块号 201)
ORA-01110: 数据文件 6: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST.DBF'


SQL>select SKIP_CORRUPT from user_tables where table_name='EMP3';

SKIP_CORRUPT
--------------------
DISABLED


利用过程SKIP_CORRUPT_BLOCKS进行跳过坏块:

SQL> BEGIN
  2  DBMS_REPAIR.SKIP_CORRUPT_BLOCKS (
  3  SCHEMA_NAME => 'SCOTT',
  4  OBJECT_NAME => 'EMP3',
  5  OBJECT_TYPE => dbms_repair.table_object,
  6  FLAGS => dbms_repair.skip_flag);
  7  END;
  8  /

PL/SQL 过程已成功完成。

 


SQL> select SKIP_CORRUPT from dba_tables where table_name='EMP3';

SKIP_CORRUPT
--------------------
ENABLED


SQL> conn scott/tiger
已连接。
SQL> select distinct ename from emp3;

ENAME
----------
ALLEN
JONES
FORD
CLARK
MILLER
DD
SMITH
WARD
MARTIN
SCOTT
TURNER

ENAME
----------
ADAMS
BLAKE
KING
JAMES

已选择15行。

 

 

测试:DBSM_REPAIR跳过坏块是否通过REPAIR_TABLE表呢?

SQL> show user
USER 为 "SCOTT"
SQL> conn / as sysdba
已连接。
SQL> create table repair_table_bak as select * from repair_table;

表已创建。

SQL> delete from  repair_table;

已删除2行。

SQL> commit;

提交完成。

SQL> conn scott/tiger
已连接。
SQL> select distinct ename from emp3;

ENAME
----------
ALLEN
JONES
FORD
CLARK
MILLER
DD
SMITH
WARD
MARTIN
SCOTT
TURNER

ENAME
----------
ADAMS
BLAKE
KING
JAMES

已选择15行。

SQL>

 

 

D:\>rman target / nocatalog

恢复管理器: Release 10.2.0.4.0 - Production on 星期一 5月 5 15:28:01 2008

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

连接到目标数据库: DEVDB (DBID=557726576)
使用目标数据库控制文件替代恢复目录

RMAN> report schema;

数据库方案报表

永久数据文件列表
===========================
文件大小 (MB) 表空间           回退段数据文件名称
---- -------- -------------------- ------- ------------------------
1    490      SYSTEM               ***     +DISK_GROUP1/devdb/datafile/system.260.652996483
2    35       UNDOTBS1             ***     +DISK_GROUP1/devdb/datafile/undotbs1.292.652996483
3    270      SYSAUX               ***     +DISK_GROUP1/devdb/datafile/sysaux.293.652996483
4    5        USERS                ***     +DISK_GROUP1/devdb/datafile/users.291.652996483
5    104      EXAMPLE              ***     +DISK_GROUP1/devdb/datafile/example.256.652996665
6    10       TEST                 ***     D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST.DBF

临时文件列表
=======================
文件大小 (MB) 表空间           最大大小 (MB) 临时文件名称
---- -------- -------------------- ----------- --------------------
1    20       TEMP                 32767       +DISK_GROUP1/devdb/tempfile/temp.257.652996649

RMAN> list backup of datafile 6;


RMAN> list copy of datafile 6;


RMAN>


虽然没有启动catalog,但是仍然可以在rman中注册手工COPY的备份.这个COPY是5M,现在数据文件是10m,
用最旧的COPY进行恢复,保证数据不丢失.

RMAN> catalog datafilecopy 'D:\oracle\product\10.2.0\oradata\TEST.DBF1';

已将数据文件副本列入目录
数据文件副本 filename=D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST.DBF1 recid=3 stamp=653931136


RMAN> list copy of datafile 6;


数据文件副本列表
关键字     文件 S 完成时间            Ckp SCN    Ckp 时间            名称
------- ---- - ------------------- ---------- ------------------- ----
3       6    A 2008-05-05 15:32:16 725421     2008-05-05 14:07:38 D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST.DBF1

RMAN> blockrecover datafile 6 block 201;

启动 blockrecover 于 2008-05-05 15:44:10
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=138 devtype=DISK

通道 ORA_DISK_1: 正在从数据文件副本 D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST.DBF1 还原块

正在开始介质的恢复
介质恢复完成, 用时: 00:00:07

完成 blockrecover 于 2008-05-05 15:44:19

 


D:\>dbv file='D:\oracle\product\10.2.0\oradata\TEST.DBF' blocksize=8192

DBVERIFY: Release 10.2.0.4.0 - Production on 星期一 5月 5 15:46:05 2008

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

DBVERIFY - 开始验证: FILE = D:\oracle\product\10.2.0\oradata\TEST.DBF


DBVERIFY - 验证完成

检查的页总数: 1280
处理的页总数 (数据): 501
失败的页总数 (数据): 0
处理的页总数 (索引): 0
失败的页总数 (索引): 0
处理的页总数 (其它): 30
处理的总页数 (段)  : 0
失败的总页数 (段)  : 0
空的页总数: 749
标记为损坏的总页数: 0
流入的页总数: 0
最高块 SCN            : 727930 (0.727930)

D:\>


已经没有坏块.


 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/175005/viewspace-260371/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/175005/viewspace-260371/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值