用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/