一次dg搭建坏块处理

来源:这里教程网 时间:2026-03-03 21:38:37 作者:

dg搭建坏块处理

1、 问题描述

在使用 duplicate搭建 A DG 时报错 ORA-06510、ORA-19660、ORA-19661   包括 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  

4、 总结建议 

数据库坏块处理方式有多重方式,我们可以根据坏块存放的对象,正对性处理: 1、有rman备份,可以进行 blockrecover 恢复; 2、索引坏块,可以rebuild重建索引进行恢复; 3、设置event 10231重建表或者导出导入恢复; 4、可以把对象正常数据抽取出来,插入到新表里。

相关推荐