分类: Oracle
2012-04-11 21:43:57
问题描述: 当一个回滚段表空间数据文件丢失或损坏时,而且又指定了另外的回归段表空间,此时数据库可以正常打开,查询、插入、删除数据等都没有问题,当新增一个表时,会提示如下错误:
ORA-00604:递归SQL级别1出现错误
ORA-00376:此时无法读取文件 44
ORA-01110:数据文件44:'E\ORADATA\ORCL\UNDOTEMP.ORA'
具体解决步骤如下:
1、 先SHUTDOWN,以RESTRICT模式打开数据库:
SQL>STARTUP RESTRICT MOUNT;
2、 以OFFLINE DROP选项删除丢失或损坏的数据文件:
SQL>alter database datafile 44 offline drop;
3、 打开数据库:
SQL>ALTER DATABASE OPEN;
4、 修改initSID.ora的文件,并且加入如下一行:
_corrupted_rollback_segments = (,...,)
这个参数应当包含ROLLBACK_SEGMENTS中损坏的表空间的所有的回滚段,例如:
_corrupted_rollback_segments = (_SYSSMU11$,_SYSSMU12$,_SYSSMU13$,_SYSSMU14$,_SYSSMU15$,_SYSSMU16$,_SYSSMU17$,_SYSSMU18$,_SYSSMU19$,_SYSSMU20$,_SYSSMU21$)
5、 以RESTRICT模式指定pfile打开数据库:
SQL>STARTUP RESTRICT pfile="C:\oracle\product\10.2.0\db_1\database\initORCL.ORA";
6、删除掉损坏的数据文件所属的回滚段表空间:
SQL>DROP TABLESPACE "UNDOTEMP" INCLUDING CONTENTS AND DATAFILES;
7、重建回滚段表空间:
SQL>CREATE UNDO TABLESPACE UNDOTBS DATAFILE 'E:\oradata\ORCL\UNDOTBS.DBF' SIZE 100M REUSE AUTOEXTEND ON;
SQL>ALTER SYSTEM SET UNDO_TABLESPACE=UNDOTBS;
SQL>DROP TABLESPACE UNDO0702 INCLUDING CONTENTS;
SQL>SELECT * FROM DBA_TABLESPACES;
8、在initSID.ora中把你重新创建的回滚段再一次包括进来,如:
undo_tablespace=UNDOTBS
9、以该pfile再次重启数据库,一切正常,表创建成功。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/furtherchan/archive/2009/07/02/4315526.aspx
问题描述:这是一个回滚段表空间数据文件丢失或损坏的情景,这时oracle不能识别相应的数据文件。当你试图startup数据文件时会报ORA-1157,ORA-1110,并且可能会伴随着标识操作系统级别的错误,比如ORA-7360。当你试图以shutdown normal或shutdown immediate模式关闭时会导至ORA-1116,ORA-1110,并可能伴随标识操作系统级别的错误,比如ORA-7368,有时以正常方式shutdown根本shutdown不下来。警告:文章中所提及的步骤是供oracle的全球技术支持使用的。特别是步骤6中的_corrupted_rollback_segments参数,使用后需要重建,在使用这个参前请观察一下所有其它的选项。解决方法解释:如下的解决方法取于检测问题出现时所处于状态:I. 是处于关闭状态的。
试图打开时报ORA-1157和ORA-1110错误,这时的解决方法取于是否是正常shutdown的(使用normal或immediate选项。I.A.是正常shutdown的如果数据是正常shutdown的,最简单的解决方法是以offline drop选项删除丢失或损坏的数据文件,以restriceted模式打个,删除并重建这个数据文件所属的那个回滚表空间。如果是以shutdown abort或自己崩溃掉的则不要遵循这个过程。步骤如下:1、确认是正常shutdown的。可以检查alter.log这个文件,定位到最后几行看是否可以看到如下的信息:
"alter databasedismount
Completed: alter databasedismount"这当然也包括以正常方式shutdown,接然试图启动确失败的状况。如果最近一次你是以shutdown abort方式关闭的或是自己crashed掉的,你应用使用下面的I.B的方法。2、在init.ora中把属于丢失数据文件的回滚段从ROLLBACK_SEGMENTS参数中去掉。如果你不能确信是哪个回滚段,可以简单的把ROLLBACK_SEGMENTS这个参数注释掉。3、以restricted模式mount
STARTUP RESTRICT MOUNT;4、Offline drop丢失或损坏的那个数据文件。
ALTER DATABASE DATAFILE ‘‘ OFFLINE DROP;5、打开
ALTER DATABASE OPEN;如果返回"Statement processed"这条信息,转到第7步.如果得到ORA-604,ORA-376,和ORA-1110错误,转到第6步。6、因为打开失败,shutdown掉并且编辑int.ora这个文件。注释掉ROLLBACK_SEGMENTS这个参数,并且在init.ora文件中加入如下一行:
_corrupted_rollback_segments = (,...,)
这个参数应当包含ROLLBACK_SEGMENTS中所有的回滚段。需要注意的是这个参数只能在指定的情况下或在oracle的全球持术支持的指导下才应使用,然后以restricted模式打开:STARTUP RESTRICT7、删除掉那个文件所属的回滚段表空间。
DROP TABLESPACE
INCLUDING CONTENTS;8、重建回滚段表空间及回滚段,创建完后使它们online.9、使所有用户都可用。
ALTER SYSTEM DISABLE RESTRICTED SESSION;10、在init.ora中把你重新创建的回滚段再一次包括进来,如果你使用了第6步则移除掉CORRUPTED_ROLLBACK_SEGMENTS这个参数。I.B.不是正常shutdown的这种情况,最近一次是用shutdown abort或crashed掉关闭,回滚段中几乎一定包含着活动的事务。因此,坏的那个数据文件不能脱机(offline)或是drop掉,你必需从备份恢复这个文件。如果数据为是处于非归档模式的,只有最近的一些事务日志还没有被重写掉的情况你才能成功恢复这个文件。如果这个文件的备份也是无效的,联系一下oracle的技术支持吧。步骤如下:1、从备份中恢复丢失的那个数据文件.2、mount 上3、执行如下的查询:
SELECT FILE#,NAME,STATUS FROM V$DATAFILE;如果数据文件的状态是offline的,你必需先把它联机了:
ALTER DATABASE DATAFILE ‘‘ ONLINE;4、执行如下的查询:SELECT V1.GROUP#, MEMBER, SEQUENCE#, FIRST_CHANGE#
FROM V$LOG V1, V$LOGFILE V2
WHERE V1.GROUP# = V2.GROUP# ;这将列出所有的联机的重做日志和他们的序号及首次改变号(first change numbers).5、如果这个是非归档模式的,执行如下的查询:
SELECT FILE#, CHANGE# FROM V$RECOVER_FILE;如果其中的CHANG#比4中的最小的那个FIRST_CHANGE#大的话,用联机日志就可以完成恢复。6、如果CHANG#比4中的最小的那个FIRST_CHANGE#小,则是不能恢复的,可以联系一下oracle的技术支持。译者插入:如果你真是非归档方式且这个文件的备份也是无效的,如果你认为可以丢失回滚段中的那事务,你可以用I.A中从第6步的方法,这时可以打开,应立即做一个备份,因为库中的数据有些不一致。RECOVER DATAFILE ‘‘7、确认所有的日志都被恢复,只到你收到"Media recovery complete"信息。8、打开待续