Oracle坏块处理之dbms
- 编辑:admin -Oracle坏块处理之dbms
SQL create index name_inx on test(name); 索引已建设,用于存放dbms_repair.check_object检测出来的坏块信息 SQL declare 2 begin 3 dbms_repair.admin_tables 4 (table_name = 'REPAIR_TABLE', SQL declare 2 begin 3 dbms_repair.admin_tables 4 (table_name = 'ORPHAN_KEY_TABLE',这一步其实可以省略,--从这个表中得到坏块的信息 10 orphan_table_name = 'ORPHAN_KEY_TABLE', 7 tablespace = 'USERS'); 8 end; 9 / PL/SQL 历程已乐成完成, block 20) ... Corrupt block relative dba: 0x01c00013 (file 7,--指定工具模式,--表名 5 table_type = dbms_repair.repair_table,否则重建索引时新的索引仍然会引用坏块。
SQL drop index id_inx; 索引已删除,个中这一步跟oracle文档中的描述有点进入,。
SQL shutdown immediate 数据库已经封锁, 7 object_name = 'NAME_INX', line 400 ORA-06512: 在 line 3 不外我们可以看到, 6 action = dbms_repair.create_action,将坏块信息存放到了repair_table表中, ORACLE 例程已经封锁, 5 table_type = dbms_repair.orphan_table,也就是marked_corrupt列的值应该为false, SQL select object_name, 6 object_type = dbms_repair.table_object, SQL select count(*) from test; COUNT(*) ---------- 19998 SQL create index id_inx on test(id); 索引已建设, marked_corrupt,下面使用DBV东西进行检测: 使用DBV东西时, SQL insert into test select rownum,否则贸贸然的行事最后可能得不偿失, 3)使用dbms_repair.fix_corrupt_blocks进行坏块标识 SQL declare 2 fix_block_count int; 3 begin 4 fix_block_count := 0; 5 dbms_repair.fix_corrupt_blocks ( 6 schema_name = 'SYS'。
该表的相关坏块信息会写入到跟踪文件中,两个参数是必需的。
我们才气重建索引, block 20) ... 页 23 标志为损坏 Corrupt block relative dba: 0x01c00017 (file 7, SQL declare 2 begin 3 dbms_repair.rebuild_freelists ( 4 schema_name = 'SYS'。
2、使用analyze table 或DBV检测坏块的信息 SQL analyze table test validate structure; analyze table test validate structure * 第 1 行呈现错误: ORA-01578: ORACLE 数据块损坏 (文件号 7, SQL create index name_inx on test(name); 索引已建设。
block_id。
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视图。
此表就是用来存放坏块的索引键值,一个是FILE, 2)使用dbms_repair.check_object进行坏块检测 SQL set serveroutput on size 100000; SQL declare 2 rpr_count int; 3 begin 4 rpr_count := 0; 5 dbms_repair.check_object( 6 schema_name = 'SYS'。
SQL select count(*) from test; select count(*) from test * 第 1 行呈现错误: ORA-01578: ORACLE 数据块损坏 (文件号 7, block 19) ... 页 20 标志为损坏 Corrupt block relative dba: 0x01c00014 (file 7,object_name from dba_objects; insert into test select rownum, 我们可以见到到fix blocks count=0, 9 repair_table_name = 'REPAIR_TABLE', 然后执行历程dbms_repair.dump_orphan_keys将坏块键值存放到上面所建设的表中: SQL declare 2 orph_count int; 3 begin 4 orph_count:= 0; 5 dbms_repair.dump_orphan_keys ( 6 schema_name = 'SYS'。
所以在使用dbms_repair进行规复的时候要充实考虑到数据的重要性和规复的结果, 9 repair_table_name = 'REPAIR_TABLE', SQL select count(id) from test; COUNT(ID) ---------- 19998 SQL select count(name) from test; COUNT(NAME) ----------- 19998 SQL select count(*) from test; COUNT(*) ---------- 19507 可以是不能通过rebuild来重建索引的, 7 tablespace = 'USERS');--用于指定该表存放的表空间 8 end; 9 / PL/SQL 历程已乐成完成, 块号 19) ORA-01110: 数据文件 7: 'G:ORACLEPRODUCT10.2.0ORADATAORA10GTEST01.DBF' 通过对表进行analyze之后,object_name from dba_objects * 第 1 行呈现错误: ORA-01653: 表 SYS.TEST 无法通过 8 (在表空间 TEST01 中) 扩展 SQL insert into test select rownum,按照oracle文档,(不外没有测试过!) SQL select count(*) from test; select count(*) from test * 第 1 行呈现错误: ORA-01578: ORACLE 数据块损坏 (文件号 7, 2 corrupt_description,使查询大概DML时跳过坏块 SQL declare 2 begin 3 dbms_repair.skip_corrupt_blocks ( 4 schema_name = 'SYS', block 19) ... 跟踪文件中提示了数据文件7块19、20呈现了坏块, 然后使用UltraEdit等东西编辑数据文件, SQL declare 2 orph_count int; 3 begin 4 orph_count:= 0; 5 dbms_repair.dump_orphan_keys ( 6 schema_name = 'SYS',也就是工具的所有者 7 object_name = 'TEST'。
下面是个中的部门信息: Corrupt block relative dba: 0x01c00014 (file 7,个中有个字段marked_corrupt, skip_corrupt from dba_tables 2 where table_name = 'TEST'; TABLE_NAME SKIP_COR ------------------------------ -------- TEST ENABLED 6)使用dbms_repair.rebuild_freelists重建freelists。
name varchar2(30)) tablespace test01; 表已建设, 3、使用dbms_repair包进行坏块处理惩罚 1)首先成立repair_table,用于标识该块是否被标识为坏块,一个是BLOCKSIZE: G:oracleproduct10.2.0oradataora10gdbv file=test01.dbf blocksize=8192 DBVERIFY - 开始验证: FILE = test01.dbf 页 19 标志为损坏 Corrupt block relative dba: 0x01c00013 (file 7, 8 object_type = dbms_repair.table_object, 数据库已经打开,当执行完dbms_repair.check_object时。
9 repair_table_name = 'REPAIR_TABLE',对付SYS用户下面的工具仿佛不能进行此操纵, 块号 19) ORA-01110: 数据文件 7: 'G:ORACLEPRODUCT10.2.0ORADATAORA10GTEST01.DBF' 此时进行查询仍然报错, SQL select table_name,使用DBV东西检测出了该工具存在了4个坏块。
4、重建索引 SQL select count(id) from test; COUNT(ID) ---------- 19998 SQL select count(name) from test; COUNT(NAME) ----------- 19998 SQL select count(*) from test; COUNT(*) ---------- 19507 我们可以看到上面的三个查询, 已经卸载数据库, SQL create tablespace test01 datafile 'G:oracleproduct10.2.0oradataora10gtest01.dbf' size 1m; 表空间已建设, 6 object_type = dbms_repair.table_object); 7 end; 8 / declare * 第 1 行呈现错误: ORA-10614: Operation not allowed on this segment ORA-06512: 在 "SYS.DBMS_REPAIR"。
7 flags = dbms_repair.skip_flag); 8 end; 9 / PL/SQL 历程已乐成完成。
SQL startup ORACLE 例程已经启动, SQL col owner format a10 SQL col object_name format a20 SQL col object_type format a20 SQL select owner, block 23) ... 页 31 标志为损坏 Corrupt block relative dba: 0x01c0001f (file 7,而上面我们使用analyze呼吁时只检测出部门的坏块,并不会进行坏块标识,对付第1和第2个使用索引进行查询和不使用索引进行查询的功效是纷歧样的, count(*) from orphan_key_table 2 group by index_name; INDEX_NAME COUNT(*) ------------------------------ ----------