免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 922 | 回复: 0
打印 上一主题 下一主题

实验进阶OCP #3 DBMS _REPAIR修复块损坏 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-22 08:54 |只看该作者 |倒序浏览

使用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;

 image
3,创建索引

CREATE INDEX scott.test_idx ON scott.test(TABLE_NAME) tablespace 'USER_INDEX' ;

 

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

image

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权限)

image

三、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状态,确认所有坏块已经被标记

image 

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,指定下用户和表名

image

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; 
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP