当前位置: 首页 > article >正文

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

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


http://www.kler.cn/a/387203.html

相关文章:

  • 第一个 Flutter 项目(1)共46节
  • java八股-jvm入门-程序计数器,堆,元空间,虚拟机栈,本地方法栈,类加载器,双亲委派,类加载执行过程
  • Java面向对象编程进阶之包装类
  • Nuxt 版本 2 和 版本 3 的区别
  • 边缘计算在智能交通系统中的应用
  • ArcGIS Pro属性表乱码与字段名3个汉字解决方案大总结
  • CUDA系统学习之一软件堆栈架构
  • 初试Lisp语言
  • 【大数据学习 | HBASE】hbase shell基础实操
  • Go语言面向对象编程
  • 【GESP】C++一级真题练习(202312)luogu-B3921,小杨的考试
  • mysql的高级进阶
  • 前端刺客系列----Vue 3 入门介绍
  • 数据挖掘(十)
  • Elasticsearch与Redis的Netty冲突
  • CentOS 9 Stream 上安装 PostgreSQL 16
  • C++builder中的人工智能(18):神经网络中的SoftMax函数
  • el-tab使用
  • 新手如何快速搭建一个Springboot项目
  • 代码随想录刷题记录(二十五)——54. 替换数字
  • 【信号处理】绘制IQ信号时域图、星座图、功率谱
  • 吾店云介绍 – 中国人的WordPress独立站和商城系统平台
  • docker进行SRS直播服务器搭建
  • WPS 默认模板修改
  • 关于qiskit版本>1.0.0,execute函数被替换
  • Java基于微信小程序的美食推荐系统(附源码,文档)