ITPub博客

首页 > 数据库 > Oracle > oracle数据坏块处理(二)-逻辑坏块重新格式化处理

oracle数据坏块处理(二)-逻辑坏块重新格式化处理

原创 Oracle 作者:lmxx2020 时间:2024-11-08 16:57:37 0 删除 编辑

1、 问题描述

在使用 duplicate搭建DG时报错

 

包括 rman copy,rman备份

2、 问题分析

由于数据文件逻辑坏块导致物理备份不能正常进行。

使用 rman检查数据文件47

 

SELECT tablespace_name, segment_type, owner, segment_name

FROM dba_extents

         WHERE file_id = 47

and 1378432 between block_id AND block_id + blocks - 1;

看到该坏块属于表

3、 问题解决

生成该块的 rowid  

select dbms_rowid.rowid_create(1,30426,47,1378432,level) from dual connect by level<=100;

DBMS_ROWID.ROWID_C

------------------

AAAHbaAAvAAFQiAAAB

AAAHbaAAvAAFQiAAAC

AAAHbaAAvAAFQiAAAD

AAAHbaAAvAAFQiAABk

。。。。 略 。。。。

 

函数解释:

DBMS_ROWID.ROWID_CREATE (

    rowid_type           IN NUMBER,

    object_number    IN NUMBER,

    relative_fno          IN NUMBER,

    block_number     IN NUMBER,

    row_number       IN NUMBER)

参数:

rowid_type:rowid类型(restricted或者extended)。设置rowid_type为0时,代表restricted ROWID(此时,将忽略参数object_number):设置rowid_type为1时,代表extended ROWID。

object_number:数据对象编号(仅restricted类型rowid可用)。

relative_fno:所在数据文件编号。

block_number:该数据文件中的数据块编号。

row_number:在该块中的行编号。

根据 rowid查询数据返回为空

select * from KTHIS5.EMR_CASE_HISTORY_DOCUMENT_DS where rowid in ();

判断该块为空 块

Move 该 表

Alter table KTHIS5.EMR_CASE_HISTORY_DOCUMENT_DS   move online;

查询该表的表空间为 KTHIS5 , 创建测试表

create table test (n number,c varchar2(4000)) nologging tablespace KTHIS5 ;

 

给该临时表分配空间

alter table test allocate extent (DATAFILE ' +DATA/ORCL/kthis5_3 ' SIZE 8192k);

直到坏块属于该临时表后停止

select segment_name, segment_type, owner

        from dba_extents

       where file_id = 47

         and 1378432 between block_id

             and block_id + blocks -1 ;

 

创建触发器 ,当该坏块被格式化时给出提示

CREATE OR REPLACE TRIGGER corrupt_trigger

   AFTER INSERT ON test

   REFERENCING OLD AS p_old NEW AS new_p

   FOR EACH ROW

DECLARE

   corrupt EXCEPTION;

BEGIN

   IF (dbms_rowid.rowid_block_number(:new_p.rowid)=&blocknumber)

  and (dbms_rowid.rowid_relative_fno(:new_p.rowid)=&filenumber) THEN

      RAISE corrupt;

   END IF;

EXCEPTION

   WHEN corrupt THEN

      RAISE_APPLICATION_ERROR(-20000, 'Corrupt block has been formatted');

END;

/

 

往临时表插入数据 直到报 'Corrupt block has been formatted'

 

BEGIN

FOR i IN 1..1000000000 LOOP

INSERT /*+ APPEND */ INTO test select i, lpad('REFORMAT',3092, 'R') from dual;

commit ;

END LOOP;

END;

 

然后删除该表

Drop table test


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22967847/viewspace-3048148/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2024-01-09

  • 博文量
    106
  • 访问量
    90384