在使用ORACLE的过程过我们会经常遇到一些ORACLE产生的错误对于初学者而言这些错误可能有点模糊而且可能一时不知怎么去处理产生的这些错误本人就使用中出现比较频繁的错误代码一一做出分析希望能够帮助你找到一个合理解决这些错误的方法同时也希望你能够提出你的不同看法毕竟作为一种交流的手段个人意见难免过于偏颇而且也必定存在着不足出错之处在所难免写这篇文章的目的就是想通过相互之间的交流共同促进共同进步
ORA:unable to extend rollback segment NAME by NUM intablespace NAME
产生原因上述ORACLE错误为回滚段表空间不足引起的这也是ORACLE数据管理员最常见的ORACLE错误信息当用户在做一个非常庞大的数据操作导致现有回滚段的不足使可分配用的回滚段表空间已满无法再进行分配就会出现上述的错误
解决方式使用ALTER TABLESPACE tablespace_name ADD DATAFILE filename SIZE size_of_file命令向指定的数据增加表空间根据具体的情况可以增加一个或多个表空间当然这与还与你主机上的裸盘设备有关如果你主机的裸盘设备已经没有多余的使用空间建议你不要轻意的增加回滚段表空间的大小可使用下列的语句先查询一下剩余的tablespace空间有多少
Select user_namesql_text from V$open_cursor where user_name=;
如果多余的空间比较多就可以适当追加一个大的回滚段给表空间使用从而避免上述的错误你也可以用以下语句来检测一下rollback segment的竞争状况
Select classcount from V$waitstat where calss in(system undo headersystem undo blockundo headerundo block);和
Select sum(value) from V$sysstat where name in (db_block_getsconsistents gets);
如果任何一个class in count/sum(value)大于%就应该考虑增加rollback segment
相应的英文如下
Cause:Failed to allocate extent from the rollback segment in tablespace
Action:Use the ALTER TABLESPACE ADD DATAFILE statement to add one or more files to the specified tablespace
ORA:unable to extend temp segment by num in tablespace name
产生原因ORACLE临时段表空间不足因为ORACLE总是尽量分配连续空间一但没有足够的可分配空间或者分配不连续就会出现上述的现象
解决方法我们知道由于ORACLE将表空间作为逻辑结构单元而表空间的物理结构是数据文件数据文件在磁盘上物理地创建表空间的所有对象也存在于磁盘上为了给表空间增加空间就必须增加数据文件先查看一下指定表空间的可用空间使用视图SYSDBA_FREE_SPACE视图中每条记录代表可用空间的碎片大小
SQL>Select file_idblock_idblocksbytes from sysdba_free_space where tablespace_name=;
返回的信息可初步确定可用空间的最大块看一下它是否小于错误信息中提到的尺寸再查看一下缺省的表空间参数
SQL>SELECT INITIAL_EXTENTNEXT_EXTENTMIN_EXTENTSPCT_INCREASE FROM SYSDBA_TABLESPACES WHERE TABLESPACE_NAME=name;
通过下面的SQL命令修改临时段表空间的缺省存储值
SQL>ALTER TABLESPACE name DEFAULT STORAGE (INITIAL XXX NEXT YYY);
适当增大缺省值的大小有可能解决出现的错误问题也可以通过修改用户的临时表空间大小来解决这个问题
SQL>ALTER USER username TEMPORARY TABLESPACE new_tablespace_name;
使用ALTER TABLESPACE命令一但完成所增加的空间就可使用无需退出数据库或使表空间脱机但要注意一旦添加了数据文件就不能再删除它若要删除就要删除表空间
一个报错例子如下
ORA:unable to extend temp segment by in tablespace TEMPSPACE
相应的英文如下
Cause: Failed to allocate extent for temp segment in tablespace
Action:Use the ALTER TABLESPACE ADD DATAFILE statement to add one or more files to the specified tablespace or create the object in another tablespace
ORA:Oracle data block corrupted(file # numblock # num)
产生原因当ORACLE访问一个数据块时由于硬件的I/O错误操作系统的I/O错误或缓沖问题内存或paging问题ORACLE试图访问一个未被格式化的系统块失败数据文件部分溢出等上述几种情况的一种引起了逻辑坏块或者物理坏块这时就会报ORA的错误
解决方式由于ORACLE只有在访问到有问题的数据文件时才会报错所以报错的时间有可能会比实际出错的时间要晚如果ORA出错信息提示数据坏块指向的是用户自己的数据文件则用以下方法来解决
如果通过下面的SQL语句查出的坏块出现有索引上则只需重建索引即可
SQL>Select ownersegment_namesegment_type from dba_extents where file_id= and between block_id and block_id+blocks;
(和分别是ORA报出的坏块出现的文件号和块号)
如果坏块出现在表上先用以下语句分析是否为永久性坏块(建议多执行一两次有助于鑒别数据坏块是永久性的(硬盘上的物理坏块)还是随机性的(内存或硬件错误引起)) SQL>Analyze table validate structure cascade;
执行该命令后可能会出现以下的结果
ORA与原先错误信息有相同的参数为永久性的物理或逻辑坏块与原先错误信息有不同的参数可能与内存page space和I/O设备有关
如果用户有此表的最新备份那么最好是用此备份来恢复此表或者使用event 来取出坏块以外的数据
<>先关闭数据库
<>编辑initora文件加入
event= trace name context foreverlevel
<>startup restrict
<>创建一个临时表SQL>create table errortemp as select * from error;(error是坏表的表名)
<>把event从initora文件中删掉并重起数据库
<>rename坏表把临时表rename成坏表的表名
<>创建表上的INDEX等
如果ORA出错信息提示数据坏块指向的是数据字典或者是回滚段的话你应该立即与ORACLE公司联系共同商量一个好的解决办法
这里所讲的解决方法只是比较常见的一种一些更为具体的解决办法可以查看一下ORACLE的故障解决手册那里面有浞及使用ROWID方法来取出坏块以外的数据的方法这里就不介绍了
相应的英文如下
Cause:The given data block was corruptedprobably due to program errors
Action:Try to restore the segment containing the given data blockThis may involve dropping the segment and recreating itIf there is a trace filereport the messages recorded in it to customer support
ORA:max # of extents num reached for rollback segment num
产生原因这种错误通常为一个回滚段和一个表空间已经达到MAXEXTENTS参数设置的极限要注意的是这个MAXEXTENTS不是该回滚段或表空间的硬件极限硬件极限取决于数据库创建时在initora文件中指定的DB_BLOCK_SIZE参数的值
解决方法使用SQL命令ALTER TABLESPACE…STORAGE(MAXEXTENTS XXXX)来增加 MAXEXTENTS其中XXXX值必须大于错误信息中所指的数值但不能大于LARGEST MAXEXTENT的值如果已经达到了LARGEST MAXEXTENT VALUE解决的办法就是重新创建较大的范围尺寸使用带有选项COMPRESS=Y的Export工具导出表如果表空间有可用空间先给表做一个备份用alter tablespace tablespace_name更改其名字然后再装载表回数据库
查看其错误出现的地方如果出现在回滚段或索引上那么必须将其删除并重建如果出现在临时表空间修改临时表空间的存储字段便可解决这个问题
一个报错例子如下
ORA:max # extents reached for rollback segment RBS_
相应的英文如下
Cause: An attempt was made to extend a rollback segment that already has reached its maximum size or space could not be allocated in the data dictionary to contain the definition of the object
Action:If possibleincrease the value of either the MAXEXTENTS or PCTINCREASE initialization parameters or find the data dictionary table lacking space and alter the storage parametersas described in the Oracle Server Administrators Guide
ORA:internal error codearguments:[num][?][?][?][?]
产生