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

本文介绍如何利用Oracle提供的DBMS_REPAIR包来修复数据库中的坏块。包括创建修复表、检测坏块、标记坏块、设置跳过坏块及处理无效键值等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用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;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值