--------------------------------------------------------------------------------
palign="JUSTIFY">ORA-01578:Oracledatablockcorrupted(file#num,block#num)
产生原因:当ORACLE访问一个数据块时,由于1、硬件的I/O错误;2、操作系统的I/O错误或缓冲问题;3、内存或paging问题;4、ORACLE试图访问一个未被格式化的系统块失败;5、数据文件部分溢出等上述几种情况的一种引起了逻辑坏块或者物理坏块,这时就会报ORA-01578的错误。
解决方式:由于ORACLE只有在访问到有问题的数据文件时才会报错,所以报错的时间有可能会比实际出错的时间要晚,如果ORA-01578出错信息提示数据坏块指向的是用户自己的数据文件,则用以下方法来解决:
如果通过下面的SQL语句查出的坏块出现有索引上,则只需重建索引即可
SQL$#@62;Selectowner,segment_name,segment_typefromdba_extentswherefile_id=$#@60;F$#@62;and$#@60;B$#@62;betweenblock_idandblock_id+blocks-1;($#@60;F$#@62;和$#@60;B$#@62;分别是ORA-01578报出的坏块出现的文件号和块号)
如果坏块出现在表上,先用以下语句分析是否为永久性坏块(建议多执行一两次,有助于鉴别数据坏块是永久性的(硬盘上的物理坏块)还是随机性的(内存或硬件错误引起)):
SQL$#@62;Analyzetable$#@60;table_name$#@62;validatestructurecascade;
执行该命令后,可能会出现以下的结果:
ORA-01578:与原先错误信息有相同的参数,为永久性的物理或逻辑坏块;与原先错误信息有不同的参数,可能与内存,pagespace和I/O设备有关。
如果用户有此表的最新备份,那么最好是用此备份来恢复此表,或者使用event10231来取出坏块以外的数据:
$#@60;1$#@62;.先关闭数据库
$#@60;2$#@62;.编辑init$#@60;sid$#@62;.ora文件,加入:
event=”10231tracenamecontextforever,level10”
$#@60;3$#@62;.startuprestrict
$#@60;4$#@62;.创建一个临时表:SQL$#@62;createtableerrortempasselect*fromerror;(error是坏表的表名)
$#@60#@62;.把event从init$#@60;sid$#@62;.ora文件中删掉并重起数据库
$#@60;6$#@62;.rename坏表,把临时表rename成坏表的表名
$#@60;7$#@62;.创建表上的INDEX等
如果ORA-01578出错信息提示数据坏块指向的是数据字典或者是回滚段的话,你应该立即与ORACLE公司联系,共同商量一个好的解决办法。
这里所讲的解决方法只是比较常见的一种,一些更为具体的解决办法可以查看一下ORACLE的故障解决手册,那里面有浞及使用ROWID方法来取出坏块以外的数据的方法,这里就不介绍了。
相应的英文如下:
Cause:Thegivendatablockwascorrupted,probablyduetoprogramerrors
Action:Trytorestorethesegmentcontainingthegivendatablock,Thismayinvolvedroppingthesegmentandrecreatingit,Ifthereisatracefile,reportthemessagesrecordedinittocustomersupport.
ORA-01628:max#ofextentsnumreachedforrollbacksegmentnum
产生原因:这种错误通常为一个回滚段和一个表空间已经达到MAXEXTENTS参数设置的极限。要注意的是这个MAXEXTENTS不是该回滚段或表空间的硬件极限,硬件极限取决于数据库创建时在init.ora文件中指定的DB_BLOCK_SIZE参数的值。
解决方法:使用SQL命令ALTERTABLESPACE…STORAGE(MAXEXTENTSXXXX)来增加MAXEXTENTS,其中“XXXX”值必须大于错误信息中所指的数值,但不能大于LARGESTMAXEXTENT的值,如果已经达到了LARGESTMAXEXTENTVALUE,解决的办法就是重新创建较大的范围尺寸,使用带有选项COMPRESS=Y的Export工具导出表,如果表空间有可用空间,先给表做一个备份,用altertablespacetablespace_name更改其名字,然后再装载表回数据库。
查看其错误出现的地方,如果出现在回滚段或索引上,那么必须将其删除并重建,如果出现在临时表空间,修改临时表空间的存储字段,便可解决这个问题。
一个报错例子如下:
ORA-1628:max#extents50reachedforrollbacksegmentRBS_1
相应的英文如下:
Cause:Anattemptwasmadetoextendarollbacksegmentthatalreadyhasreacheditsmaximumsizeorspacecouldnotbeallocatedinthedatadictionarytocontainthedefinitionoftheobject.
Action:Ifpossible,increasethevalueofeithertheMAXEXTENTSorPCTINCREASEinitializationparametersorfindthedatadictionarytablelackingspaceandalterthestorageparameters,asdescribedintheOracle8ServerAdministrator'sGuide.