1、模拟坏块
SQL> create tablespace test01 datafile 'G:oracleproduct10.2.0oradataora10gtest01.dbf' size 1m;
表空间已创建。
SQL> create table test(id number,name varchar2(30)) tablespace test01;
表已创建。
SQL> insert into test select rownum,object_name from dba_objects;
insert into test select rownum,object_name from dba_objects
*
第 1 行出现错误:
ORA-01653: 表 SYS.TEST 无法通过 8 (在表空间 TEST01 中) 扩展
SQL> insert into test select rownum,object_name from dba_objects where rownum<10000;
已创建9999行。
SQL> commit;
提交完成。
SQL> insert into test select rownum,object_name from dba_objects where rownum<10000;
已创建9999行。
SQL> commit;
提交完成。
SQL> select count(*) from test;
COUNT(*)
----------
19998
SQL> create index id_inx on test(id);
索引已创建。
SQL> create index name_inx on test(name);
索引已创建。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
然后使用UltraEdit等工具编辑数据文件,修改里面的部分内容。
SQL> startup
ORACLE 例程已经启动。
数据库装载完毕。
数据库已经打开。
SQL> select count(*) from test;
select count(*) from test
*
第 1 行出现错误:
ORA-01578: ORACLE 数据块损坏 (文件号 7, 块号 19)
ORA-01110: 数据文件 7: 'G:ORACLEPRODUCT10.2.0ORADATAORA10GTEST01.DBF'
可见我们已经模拟出坏块的情景。
2、使用analyze table 或DBV检测坏块的信息
SQL> analyze table test validate structure;
analyze table test validate structure
*
第 1 行出现错误:
ORA-01578: ORACLE 数据块损坏 (文件号 7, 块号 19)
ORA-01110: 数据文件 7: 'G:ORACLEPRODUCT10.2.0ORADATAORA10GTEST01.DBF'
通过对表进行analyze之后,该表的相关坏块信息会写入到跟踪文件中,我们可以通过脚本获得此跟踪文件:
SQL> @G:oracleget_trace.sql;
TRACE_FILE
--------------------------------------------------------------------
G:ORACLEPRODUCT10.2.0ADMINORA10GUDUMPora10g_ora_3528.trc
查看ora10g_ora_3528.trc,下面是其中的部分信息:
Corrupt block relative dba: 0x01c00014 (file 7, block 20)
...
Corrupt block relative dba: 0x01c00013 (file 7, block 19)
...
跟踪文件中提示了数据文件7块19、20出现了坏块,下面使用DBV工具进行检测:
使用DBV工具时,两个参数是必须的,一个是FILE,一个是BLOCKSIZE:
G:oracleproduct10.2.0oradataora10g>dbv file=test01.dbf blocksize=8192
DBVERIFY - 开始验证: FILE = test01.dbf
页 19 标记为损坏
Corrupt block relative dba: 0x01c00013 (file 7, block 19)
...
页 20 标记为损坏
Corrupt block relative dba: 0x01c00014 (file 7, block 20)
...
页 23 标记为损坏
Corrupt block relative dba: 0x01c00017 (file 7, block 23)
...
页 31 标记为损坏
Corrupt block relative dba: 0x01c0001f (file 7, block 31)
...
DBVERIFY - 验证完成
检查的页总数: 128
处理的页总数 (数据): 106
失败的页总数 (数据): 0
处理的页总数 (索引): 0
失败的页总数 (索引): 0
处理的页总数 (其它): 18
处理的总页数 (段) : 0
失败的总页数 (段) : 0
空的页总数: 0
标记为损坏的总页数: 4
流入的页总数: 0
最高块 SCN : 1286361 (0.1286361)
我们可以见到,使用DBV工具检测出了该对象存在了4个坏块,而上面我们使用analyze命令时只检测出部分的坏块。
3、使用dbms_repair包进行坏块处理
1)首先建立repair_table,用于存放dbms_repair.check_object检测出来的坏块信息
SQL> declare
2 begin
3 dbms_repair.admin_tables
4 (table_name => 'REPAIR_TABLE',--表名
5 table_type => dbms_repair.repair_table,
6 action => dbms_repair.create_action,
7 tablespace => 'USERS');--用于指定该表存放的表空间
8 end;
9 /
PL/SQL 过程已成功完成。
SQL> col owner format a10
SQL> col object_name format a20
SQL> col object_type format a20
SQL> select owner, object_name, object_type
2 from dba_objects
3 where object_name like '%REPAIR_TABLE';
OWNER OBJECT_NAME OBJECT_TYPE
---------- -------------------- --------------------
SYS REPAIR_TABLE TABLE
SYS DBA_REPAIR_TABLE VIEW
Oracle自动创建了一个DBA_REPAIR_TABLE视图。
| 广告合作:400-664-0084 全国热线:400-664-0084 Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号 珠峰网 版权所有 All Rights Reserved
|