今天安装oracle的服务器宕机了,重启了一下系统(linux环境),之后重启oracle时,发现有一个实例一直启动失败,错误如下:
ORA-00604:递归SQL级别1出现错误
ORA-00376:此时无法读取文件2
ORA-01110:数据文件2:'/oradata/SGDCODS/SGDCODS/undotbs01.dbf'
在网上查找了一下,是undo表空间出现了问题,根据网上的经验,在/oradata/SGDCODS/SGDCODS目录下重新创建了一个名为undotbs02.dbf的表空间,使用alter system set undo_tablespace=undotbs02语句更改了默认的undo表空间位置,之后重新启动数据库,提示数据库启动成功 Database opened。但是,当我使用PL/SQL登录数据库时,仍然提示上面那三个错误,无法通过PL/SQL登录数据库,请教各位高手,帮忙看看这是什么原因,该如何解决?

解决方案 »

  1.   

    楼主,把你修改undo 的过程贴出来看一下。 你的这个错误可能还是undo 没有设置好。 你查看一下undotbs01.dbf 的状态,如果是online 就设置为offline 看看。 
    alter database datafile '/oradata/SGDCODS/SGDCODS/undotbs01.dbf' offline;
    2.2.2 切换UNDO 表空间1、建立新的表空间UNDOTBS2
    SQL> CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE 'F:\backup\undo03.dbf' size 100M reuse;
    表空间已创建。2、切换到新建的UNOD表空间上来,操作如下
    SQL> alter system set undo_tablespace=UNDOTBS2 scope=both;
    系统已更改。3、将原来的UNDO表空间,置为脱机:
    SQL> alter tablespace UNDO offline;表空间已更改。4、删除原来的UNDO表空间:
    SQL> drop tablespace UNDO including contents AND DATAFILES CASCADE CONSTRAINTS ;
    表空间已删除。如果只是drop tablespace UNDO ,则只会在删除控制文件里的记录,并不会物理删除文件。 
    Drop undo表空间的时候必须是在未使用的情况下才能进行。如果undo表空间正在使用(例如事务失败,但是还没有恢复成功),那么drop表空间命令将失败。在drop表空间的时候可以使用including contents。
    参考:
    Oracle undo 表空间管理:
    http://blog.csdn.net/tianlesoftware/archive/2010/07/11/5689558.aspx
    ------------------------------------------------------------------------------ 
    Blog: http://blog.csdn.net/tianlesoftware 
    网上资源: http://tianlesoftware.download.csdn.net 
    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx 
    DBA1 群:62697716(满); DBA2 群:62697977(满)
    DBA3 群:62697850   DBA 超级群:63306533;     
    聊天 群:40132017
    --加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请
      

  2.   

    我当时修改的过程大致如下:
    1、启动sqlplus,使用sys登录系统
    sqlplus /nolog
    connect /as sysdba
    startup
    此时会出现上面的几个错误
    2、创建一个新的表空间
    create undo tablespace undotbs02 datafile '/oradata/SGDCODS/SGDCODS/UNDOTBS02.dbf' size 1000m autoextend on next 800m maxsize unlimited;
    3、alter system set undo_tablespace=UNDOTBS02 scope=both
    4、使用show parameter undo语句查看,undo表空间已经是UNDOTBS02了,重启数据库
    但是使用plsql登录时还是报那几个错误
      

  3.   

    另外如何查询undotbs01.dbf 的状态啊?
      

  4.   

    select * from v$datafile where t.name=upper('/oradata/SGDCODS/SGDCODS/undotbs01.dbf')
      

  5.   

    估计可能你的回滚段有活动的事务。
    查查dba_rollback_segs,最好把你的错误的信息给详细一些。以便判断。
      

  6.   


    目前的错误信息就是在数据库启动时提示:
    ORA-00604:递归SQL级别1出现错误
    ORA-00376:此时无法读取文件2
    ORA-01110:数据文件2:'/oradata/SGDCODS/SGDCODS/undotbs01.dbf'
      

  7.   

    这个错误是数据文件错误啊,如果数据库处于归档运行,建议楼主,先做一个全备(以防万一)然后删除这个数据文件,重新建一个这样子的数据文件,然后做恢复:
    alter database create datafile '/oradata/SGDCODS/SGDCODS/undotbs01.dbf';
    set autorevovery on;
    recover datafile '/oradata/SGDCODS/SGDCODS/undotbs01.dbf';
    alter database datafile '/oradata/SGDCODS/SGDCODS/undotbs01.dbf' online;
    shutdown immediate;
    startup;