oracle出现数据坏块ORA-01578 ORA-01110 ORA-26040解决办法。
问题描述:
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;
输出结果:
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解决办法。相关推荐
- oracle schema_Oracle数据库坏块检查与修复
摘要:简述数据库坏块,发现并处理Oracle的物理坏块.逻辑坏块 以下摘自网络并规整: 一.数据库坏块介绍 数据库的数据块有固定的格式和结构,分三层:cache layer,transaction l ...
- ORA-19566 exceeded limit of 0 corrupt blocks数据坏块处理
问题描述 RMAN备份失败,报错如下: channel ch1: starting piece 1 at 02-NOV-12 released channel: ch1 RMAN-00571: RMA ...
- oracle operation_type,案例:Oracle报错performing DML/DDL operation over object in bin解决办法
天萃荷净 运维DBA在巡检时发现alert日志文件中出现Oracle报错performing DML/DDL operation over object in bin,分析原因为回收站中的对象执行了d ...
- oracle job enq tx,【学习笔记】Oracle等待事件 enq:TX–allocate ITL entry产生原因和解决办法...
天萃荷净 运维DBA反映Oracle数据库出现enq:TX–allocate ITL entry等待事件,结合案例分析该等待事件产生原因和解决办法 今天在分析一份awr中发现了较为明显的enq: TX ...
- oracle 服务器硬盘满了,【案例】Oracle服务器diag进程占据了12g的磁盘空间分析解决办法...
[案例]Oracle服务器diag进程占据了12g的磁盘空间分析解决办法 时间:2016-11-13 20:10 来源:Oracle研究中心 作者:网络 点击: 次 天萃荷净 Oracle ...
- oracle分区list,Oracle 分区表中存在range-list表分区时遇到问题及解决办法
Oracle 分区表中存在range-list表分区时遇到问题及解决办法 我们遇到的通常是list分区这种居多,我就不介绍了. 以下解决的是 复合分区情况 表已存在,需要在范围分区中增加一个分区 我们 ...
- oracle锁mode,【案例】Oracle dml操作产生TM锁 lmode=6 分析原因和解决办法
[案例]Oracle dml操作产生TM锁 lmode=6 分析原因和解决办法 时间:2016-12-04 20:22 来源:Oracle研究中心 作者:网络 点击: 次 天萃荷净 Ora ...
- 部分ABAQUS版本数据无法正常输出到Excel的一种解决办法
ABAQUS学习笔记-部分ABAQUS版本数据无法正常输出到Excel的一种解决办法 ABAQUS输出的数据主要分为场输出与历史输出两种方式(根据空间与时间域区分),用户可以根据需要在Step中设置不 ...
- Oracle数据库文件坏块损坏的恢复方法
故障描述 打开oracle数据库报错 "system01.dbf需要更多的恢复来保持一致性,数据库无法打开".经检测数据库文件发现sysaux01.dbf有坏块,sysaux01. ...
- oracle .dbf文件过大_学习这篇Oracle数据库文件坏块损坏的恢复方法,拓展你的知识面...
一.Oracle数据库系统简介: ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结 ...
最新文章
- Linux15-SELinux
- 一个由跨平台产生的浮点数bug | 有你意想不到的结果
- 美团酒店Node全栈开发实践
- Stream 工具方法
- Java Web学习笔记10:Servlet基础
- C#中英文逗号之间的相互转化
- 怎么step into MFC Source code
- linux笔记8.0
- java——编程案例
- 局域网内ip冲突引起的怪异现象
- redis的hash与string区别
- Python对电影Top250并进行数据分析
- Android图文识别
- FOC电机ST系列处理器使用的基础知识
- 用canvas画七彩虹伞
- 蓝桥杯单片机串口通信学习提升笔记
- 图片上传回显,并以clob数据类型存入数据库
- 智慧全媒体 5G新视听,共探新时代广播电视!
- 2022年Redis最新面试题
- ORB_SLAM3的安装与测试