本文主要是介绍ORA-01578的解决方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
环境 :Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 + windows 2003
现象描述:
ORA-01578: ORACLE 数据块损坏 (文件号 12, 块号 217816)
ORA-01110: 数据文件 12: 'D:/ORADATA/TS_HIS3LC04'.
处理过程:
1. 先根据文件号,块号定位到segment,语句如下:
SQL> SELECT Tablespace_Name, Segment_Type, Owner, Segment_Name
2 FROM Dba_Extents
3 WHERE File_Id = 12 AND
4 217816 BETWEEN Block_Id AND Block_Id + Blocks - 1
5 /
TABLESPACE_NAME SEGMENT_TYPE OWNER SEGMENT_NAME
------------------------------ ------------------ ------------------------------ --------------------------------------------------------------------
TS_HIS3LC INDEX HIS3LC PK_ZY_RIBAO2
2. 根据segment_name定位
SQL> SELECT SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME FROM User_Segments WHERE segment_name = 'PK_ZY_RIBAO2';
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
-------------------------------------------------------------------------------- ------------------ ------------------------------
PK_ZY_RIBAO2 INDEX TS_HIS3LC
发现是索引的问题,只需重建即可解决(网上有针对表数据块损坏的解决方法,这次幸亏运气不错,只是索引的问题,呵呵)
3. 由于知道是索引问题,可以定位到具体表的索引
SQL> SELECT index_name,table_type,table_name,table_owner FROM user_Indexes WHERE index_name = 'PK_ZY_RIBAO2'
2 /
INDEX_NAME TABLE_TYPE TABLE_NAME TABLE_OWNER
------------------------------ ----------- ------------------------------ ------------------------------
PK_ZY_RIBAO2 TABLE ZY_RIBAO2 HIS3LC
4. 尝试重建索引,结果报错
SQL> alter index PK_ZY_RIBAO2 rebuild nologging;
alter index PK_ZY_RIBAO2 rebuild nologging
ORA-01578: ORACLE data block corrupted (file # 12, block # 217816)
ORA-01110: data file 12: 'D:/ORADATA/TS_HIS3LC04'
5. 查询该索引的信息,确定是主键索引
SQL> SELECT constraint_name,table_name FROM user_constraints WHERE table_name = 'ZY_RIBAO2' AND constraint_type = 'P';
CONSTRAINT_NAME TABLE_NAME
------------------------------ ------------------------------
PK_ZY_RIBAO2 ZY_RIBAO2
6. 主键索引直接rebuild会报错,首先要先disable主键
alter table ZY_RIBAO2
disable constraint PK_ZY_RIBAO2;
(此时索引已经删除)
7.重新添加主键约束
alter table ZY_RIBAO2
add constraint PK_ZY_RIBAO2 primary key (MOBANXMID, RIBAOID, JIAOYILX);
问题解决。
还有种方式可以用plsql里面操作。
网上相关文章:
http://blog.chinaunix.net/u/10516/showart_1958140.html
http://www.rbsbooks.com/lopchap6.htm
http://www.eygle.com/faq/Block_corruption.htm
这篇关于ORA-01578的解决方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!