问题描述:

Caused by: java.sql.SQLException: ORA-01578: ORACLE 数据块损坏 (文件号 4, 块号 234413)
ORA-01110: 数据文件 4: 'D:\APP\ADMINISTRATOR\ORADATA\OA\USERS01.DBF'
ORA-26040: 数据块是使用 NOLOGGING 选项加载的

解决办法:

1、根据文件号和块号查出损坏的是对象,表还是LOB segment

select tablespace_name,segment_type,owner,segment_name from dba_extents where file_id=4 and 234413between block_id AND block_id + blocks - 1;

①、如果是对象,可以重建

alter index indexname rebuild

②、如果是表,可以使用10231事件忽略坏块,然后使用CTAS方式重建表最后rename table,别忘记rebuild index

alter session SET EVENTS '10231 trace name context forever,level 10';create table tab_new as select * from tab;rename tab to tab_bak;rename tab_new to new;alter index indexname rebuild;
alter session SET EVENTS '10231 trace name context off';

③如果损坏的是LOB segment,先找出segment信息

select tablespace_name,segment_type,owner,segment_name from dba_extents where file_id=4 and 234413between block_id AND block_id + blocks - 1;

输出如下

owner=EZOFFICE
segment_name=SYS_LOB0000119493C00006$$
segment_type=LOBSEGMENT

a.找到表明和LOB字段

select table_name, column_name from dba_lobs where segment_name = 'SYS_LOB0000119493C00006$$' and owner = 'EZOFFCIE';

输出如下

table_name = OA_MAILINTERIOR
column_name = MAILCONTENT

b.找到坏块的bad rowid,使用以下plsql脚本

create table bad_rows (row_id ROWID,oracle_error_code number);
set concat off
set serveroutput on

c.执行下面语句

declaren number;error_code number;bad_rows number := 0;ora1578 EXCEPTION;ora600 EXCEPTION;PRAGMA EXCEPTION_INIT(ora1578, -1578);PRAGMA EXCEPTION_INIT(ora600, -600);beginfor cursor_lob in (select rowid rid, &&lob_column from &&table_owner.&table_with_lob) loopbeginn:=dbms_lob.instr(cursor_lob.&&lob_column,hextoraw('889911')) ;exceptionwhen ora1578 thenbad_rows := bad_rows + 1;insert into bad_rows values(cursor_lob.rid,1578);commit;when ora600 thenbad_rows := bad_rows + 1;insert into bad_rows values(cursor_lob.rid,600);commit;when others thenerror_code:=SQLCODE;bad_rows := bad_rows + 1;insert into bad_rows values(cursor_lob.rid,error_code);commit;   end;end loop;dbms_output.put_line('Total Rows identified with errors in LOB column: '||bad_rows);end;/

d、提示输入信息

Enter value for lob_column: MAILCONTENT
Enter value for table_owner: EZOFFICE
Enter value for table_with_lob: OA_MAILINTERIOR

e.输入结果如下

old 11: for cursor_lob in (select rowid rid, &&lob_column from &&table_owner.&table_with_lob) loop
new 11: for cursor_lob in (select rowid rid, B from SYS.LOBDEMO) loop
old 13: n:=dbms_lob.instr(cursor_lob.&&lob_column,hextoraw('889911')) ;
new 13: n:=dbms_lob.instr(cursor_lob.B,hextoraw('889911')) ;
Total Rows identified with errors in LOB column: 1

PL/SQL procedure successfully completed.

f.可以查询bad rowid

select * from bad_rows;

输出结果:

ROW_ID             ORACLE_ERROR_CODE
------------------ -----------------
AAAVfyAABAAAXlJABG              1578

g.更新空LOB字段来避免ORA-1578,ORA-26040,如果是CLOB类型,将empty_blob()改为empty_clob()

set concat off
update EZOFFICE.OA_MAILINTERIOR set MAILCONTENT= empty_clob() where rowid in (select row_id from bad_rows);

将bad rowid lob块移到其他表空间

alter table EZOFFICE.OA_MAILINTERIOR move LOB (MAILCONTENT) store as (tablespace sysnux);

最后别忘记rebuild index

alter index 索引名称 rebuild;

否则会报错

ORA-01502: 索引或这类索引的分区处于不可用状态

转载于:https://www.cnblogs.com/xymBlog/p/10368669.html

oracle出现数据坏块ORA-01578 ORA-01110 ORA-26040解决办法。相关推荐

  1. oracle schema_Oracle数据库坏块检查与修复

    摘要:简述数据库坏块,发现并处理Oracle的物理坏块.逻辑坏块 以下摘自网络并规整: 一.数据库坏块介绍 数据库的数据块有固定的格式和结构,分三层:cache layer,transaction l ...

  2. ORA-19566 exceeded limit of 0 corrupt blocks数据坏块处理

    问题描述 RMAN备份失败,报错如下: channel ch1: starting piece 1 at 02-NOV-12 released channel: ch1 RMAN-00571: RMA ...

  3. oracle operation_type,案例:Oracle报错performing DML/DDL operation over object in bin解决办法

    天萃荷净 运维DBA在巡检时发现alert日志文件中出现Oracle报错performing DML/DDL operation over object in bin,分析原因为回收站中的对象执行了d ...

  4. oracle job enq tx,【学习笔记】Oracle等待事件 enq:TX–allocate ITL entry产生原因和解决办法...

    天萃荷净 运维DBA反映Oracle数据库出现enq:TX–allocate ITL entry等待事件,结合案例分析该等待事件产生原因和解决办法 今天在分析一份awr中发现了较为明显的enq: TX ...

  5. oracle 服务器硬盘满了,【案例】Oracle服务器diag进程占据了12g的磁盘空间分析解决办法...

    [案例]Oracle服务器diag进程占据了12g的磁盘空间分析解决办法 时间:2016-11-13 20:10   来源:Oracle研究中心   作者:网络   点击: 次 天萃荷净 Oracle ...

  6. oracle分区list,Oracle 分区表中存在range-list表分区时遇到问题及解决办法

    Oracle 分区表中存在range-list表分区时遇到问题及解决办法 我们遇到的通常是list分区这种居多,我就不介绍了. 以下解决的是 复合分区情况 表已存在,需要在范围分区中增加一个分区 我们 ...

  7. oracle锁mode,【案例】Oracle dml操作产生TM锁 lmode=6 分析原因和解决办法

    [案例]Oracle dml操作产生TM锁 lmode=6 分析原因和解决办法 时间:2016-12-04 20:22   来源:Oracle研究中心   作者:网络   点击: 次 天萃荷净 Ora ...

  8. 部分ABAQUS版本数据无法正常输出到Excel的一种解决办法

    ABAQUS学习笔记-部分ABAQUS版本数据无法正常输出到Excel的一种解决办法 ABAQUS输出的数据主要分为场输出与历史输出两种方式(根据空间与时间域区分),用户可以根据需要在Step中设置不 ...

  9. Oracle数据库文件坏块损坏的恢复方法

    故障描述 打开oracle数据库报错 "system01.dbf需要更多的恢复来保持一致性,数据库无法打开".经检测数据库文件发现sysaux01.dbf有坏块,sysaux01. ...

  10. oracle .dbf文件过大_学习这篇Oracle数据库文件坏块损坏的恢复方法,拓展你的知识面...

    一.Oracle数据库系统简介: ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结 ...

最新文章

  1. Linux15-SELinux
  2. 一个由跨平台产生的浮点数bug | 有你意想不到的结果
  3. 美团酒店Node全栈开发实践
  4. Stream 工具方法
  5. Java Web学习笔记10:Servlet基础
  6. C#中英文逗号之间的相互转化
  7. 怎么step into MFC Source code
  8. linux笔记8.0
  9. java——编程案例
  10. 局域网内ip冲突引起的怪异现象
  11. redis的hash与string区别
  12. Python对电影Top250并进行数据分析
  13. Android图文识别
  14. FOC电机ST系列处理器使用的基础知识
  15. 用canvas画七彩虹伞
  16. 蓝桥杯单片机串口通信学习提升笔记
  17. 图片上传回显,并以clob数据类型存入数据库
  18. 智慧全媒体 5G新视听,共探新时代广播电视!
  19. 2022年Redis最新面试题
  20. ORB_SLAM3的安装与测试

热门文章

  1. 分类算法学习(四)——决策树算法的原理及简单实现
  2. python批量运行py文件
  3. 2021-07-05 页面的生命周期
  4. 计算机英语演讲主题ppt模板,英文演讲主题PPT模板
  5. java bigInteger +1 加常数
  6. C++ 在线IDE 编译器
  7. chainmaker-go-sdk 查看客户端日志
  8. 区块链 p2p点对点网络是什么
  9. LeetCode----两数之和
  10. override java field_JAVA方法的重载(overload)和覆盖(override)