您的位置:首页 > 大数据 > 人工智能

实验进阶OCP #3 DBMS _REPAIR修复块损坏

2011-05-17 16:25 281 查看
使用DBMS_PEPAIR进行块修复
一、Repair包所含的过程
1,ADMIN_TABLES  提供管理函数来修复关键表
2,CHECK_OBJECT  检测块损坏
3,DUMP_ORPHAN_KEY 修复损坏行的索引
4,FIX_CORRUPT_BLOCK 标记检测出的坏块位置
5,REBUILD_FREELISTS 重建可用列表
6,SEGMENT_FIX_STATUS 检测段损坏(自动段管理时可用)
7,SKIP_CORRUPT_BLOCKS     设置跳过坏块
使用限制
包含LOB类型,不支持check过程的集群环境,索引管理表和LOB索引
二、模拟坏块环境
1,创建表空间

CREATE TABLESPACE USER_DATA DATAFILE   '/u01/user_data.dbf'  size 5M;


CREATE TABLESPACE USER_INDEX DATAFILE  '/u01/user_index.dbf' SIZE 5M;


2,建表插入测试记录

增量插入

create table SCOTT.test tablespace USER_DATA as select * from all_tables;


insert into scott.test select * from scott.test;


 



3,创建索引

CREATE INDEX scott.test_idx ON scott.test(TABLE_NAME)


tablespace 'USER_INDEX' ;


 

4 shutdown后,将user_data.dbf传到本地,使用ultraedit进行修改,传回到服务器上。注意一定要shutdown后再传文件,虽然没有读写操作,但是scn号会变化,影响控制文件造成version问题

找到连续的数据段,进行修改





5 dbv检查

dbv检查可以发现坏块:

dbv file=/u01/user_data.dbf blocksize=8192


如果是针对段,可以先通过段的检查,查出段ID

SELECT TABLESPACE_ID, HEADER_FILE, HEADER_BLOCK

FROM SYS_DBA_SEGS

WHERE SEGMENT_NAME = 'TEST';

dbv USERID=scott/oracle SEGMENT_ID=8.7.11(账户需要只需具有create session权限)





三、DBMS_REPAIR使用范例

1,建立修复表

BEGIN


DBMS_REPAIR.ADMIN_TABLES (


TABLE_NAME => 'REPAIR_TABLE',


TABLE_TYPE => dbms_repair.repair_table,


ACTION     => dbms_repair.create_action,


TABLESPACE => 'USERS');


END;


2,检测

SER SERVEROUTPUT ON


DECLARE num_corrupt INT;


BEGIN


num_corrupt := 0;


DBMS_REPAIR.CHECK_OBJECT(


SCHEMA_NAME => 'SCOTT',


OBJECT_NAME => 'TEST',


REPAIR_TABLE_NAME => 'REPAIR_TABLE',


CORRUPT_COUNT => num_corrupt);


DBMS_OUTPUT.PUT_LINE('number corrupt :  '|| TO_CHAR(num_corrupt));


END;


查询信息

DESC REPAIR_TABLE;

......

3,标记坏块

SER SERVEROUTPUT ON


DECLARE num_fix INT;


BEGIN


num_fix := 0;


DBMS_REPAIR.FIX_CORRUPT_BLOCKS(


SCHEMA_NAME => 'SCOTT',


OBJECT_NAME => 'TEST',


REPAIR_TABLE_NAME => 'REPAIR_TABLE',


FIX_COUNT => num_fix);


DBMS_OUTPUT.PUT_LINE('number fix :  '|| TO_CHAR(num_fix));


END;


这时可以在repair表中再查询下marked状态,确认所有坏块已经被标记



 

5,设置跳过坏块

BEGIN


DBMS_REPAIR.SKIP_CORRUPT_BLOCKS(


SCHEMA_NAME => 'SCOTT',


OBJECT_NAME => 'TEST',


OBJECT_TYPE => dbms_repair.table_object,


FLAGS => dbms_repair.skip_flag);


END;


可以查询DBA_TABLES中的skip,指定下用户和表名





6,处理无效键值 dump_orphan_keys

SET SERVEROUTPUT ON


DECLARE num_orphans INT;


BEGIN


num_orphans := 0;


DBMS_REPAIR.DUMP_ORPHAN_KEYS (


SCHEMA_NAME => 'SCOTT', 


OBJECT_NAME => 'scott.test_idx',


OBJECT_TYPE => dbms_repair.index_object,


REPAIR_TABLE_NAME => 'REPAIR_TABLE', 


ORPHAN_TABLE_NAME=> 'ORPHAN_KEY_TABLE',


KEY_COUNT => num_orphans);


DBMS_OUTPUT.PUT_LINE('orphan key count: ' || TO_CHAR   (num_orphans));


END; 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息