刚才在学习ORACLE的过程中做了下实验,结果不小心误操作导致数据库打不开了。我大概说一下情况吧以下是我记得笔记:
添加control file的方法
① 通过SPFILE
SQL>alter system set  control_files='D:\ORACLE\PRODUCT\10.2.\ORADATA\ORCL\CONTROL01.CTL','D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL02.CTL','D:\ORACLE\PRODUCT\10.2.\ORADATA\ORCL\CONTROL03.CTL','D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL04.CTL' SCOPE=SPFILE;
再去响应的目录D:\ORACLE\PRODUCT\10.2.\ORADATA\ORCL中复制出一份控制文件CONTROL04.CTL。此时在SQL*PLUS 中shutdown,再startup,通过命令show parameter control则可以看到修改的结果。
② 通过PFILE
直接用NOTEPAD打开PFILE进行相应的修改,再去相应的目录D:\ORACLE\PRODUCT\10.2.\ORADATA\ORCL中复制出一份控制文件CONTROL04.CTL。完了在SQL*PLUS 中shutdown,再通过startup pfile=PFILE的路径启动ORACLE,这时show parameter control则可以看到修改的结果。
我先通过方法①创建了CONTROL04.CTL,为了保持PFILE和SPFILE的一致,我使用了命令create pfile from spfile。此时还正常。
接下来我用方法②创建了control05.ctl,但我并没有使用命令alter system set  control_files='D:\ORACLE\PRODUCT\10.2.\ORADATA\ORCL\CONTROL01.CTL','D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL02.CTL','D:\ORACLE\PRODUCT\10.2.\ORADATA\ORCL\CONTROL03.CTL','D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL04.CTL','D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL05.CTL' SCOPE=SPFILE; 而是直接使用了create spfile from pfile
此时shutdown,再startup就启动不起来了。
现在不管从SQL*PLUS还是命令行,用任何用户都登陆不进去,提示错误ORA-01033请问有什么解决办法没有,谢谢了!

解决方案 »

  1.   

    我在SQL*PLUS中conn / as sysdba就可以登录
    可在cmd
    sqlplus /nolog
    conn / as sysdba
    就提示权限不足我在网上查了下解决办法
    在SQLNET.ORA里加上SQLNET.AUTHENTICATION_SERVICES = (NTS)
    在initorcl.ora里的那个remote_login_passwordfile='EXCLUSIVE'可还是不行
      

  2.   


    用create pfile='指定一个pfile.ora路径' from spfile;然后用文本编译器打开上一步指定的pfile.ora文件,找到control_files这行,手工把你的control05.ctl去掉。关闭你的oracle的服务,然后启动服务然后用startup pfile='第一步指定的pfile.ora路径'启动实例,如果提示数据已打开的错误,就先shutdown immediate关闭,然后再用该命令打开如果能够成功打开的话。用create spfile from pfile='第一步指定的pfile.ora路径'保存spfile。
      

  3.   

    SQL> create pfile='D:\pfile.ora' from spfile;
    create pfile='D:\pfile.ora' from spfile
    *
    µÚ 1 ÐгöÏÖ´íÎó:
    ORA-27046: 文件大小不是逻辑块大小的倍数
    我之前创建都可以的,现在报这个错
      

  4.   

    你的block_size不正确吧.有没有修改?alert日志不能给看看?
      

  5.   

    startup nomount pfile=...alter database mount;alter database open;
    分开来,看看哪一步有错误.
      

  6.   


    你是不是直接改的spfile文件呀,感觉好像是不是spfile文件已经坏掉了。你找一个pfile的备份,或者是手工写一个pfile,然后直接从pfile启动试试。
      

  7.   

    首先,谢谢您的回答,并不是ALTER不能给看,而是我并不知道给你看其中的哪一部分,今天公司的DBA去台北那边了,所以我只能自己解决问题。现在数据库可以正常启动起来了,很诡异。我把我刚才做的事情简单的说一下。
    我刚才去别人那拷来了他的SPFILE和PFILE想覆盖我的试试,我先把我的复制了一份出去,把新拷过来的SPFILE和PFILE拷进D:\oracle\product\10.2.0\db_1\database,重启服务。在连接数据库时提示错误ora-27101 shared memory realm does not exist。
    我想那算了吧,等公司的DBA来了我让他帮我看看。
    可我起码得恢复现场嘛,我就把他的SPFILE和PFILE删掉,重新把我的SPFILE和PFILE复制回去。
    接下来在打开FORMS的时候提示连接,我就试试,结果突然发现可以连接上了可现在执行create pfile from spfile或者create spfile from pfile就会出现
    ORA-27046: 文件大小不是逻辑块大小的倍数 
      

  8.   

    对的
    我用NOTEPAD打开过SPFILE并修改过其中内容,可我后来又改回去了,不过估计还是造成损坏了。
    那二进制文件可以用ULTRAEDIT编辑吗?
      

  9.   

    我刚试了下
    create spfile='D:\spfile.ora' from pfile;
    是可以成功的
    只是create pfile='D:\pfile.ora' from spfile;会报错估计正如楼上所说的SPFILE坏掉了,可我现在数据库正处于打开状态。
    我该如何修复一下损坏的SPFILE呢?
    用create spfile='D:\spfile.ora' from pfile;的结果去覆盖损坏的SPFILE?
      

  10.   

    spfile是二进制文件,不要用文本编辑器打开,一个字节的错误他就损坏了。你可以再ORACLE_BASE/admin/SID下找找看,这里应该有一个备份的pfile的文件。如果你没有清理的话。打开这个pfile,用startup pfile=启动数据库,如果可以启动的话,就用create spfile from pfile='这个可以的pfile', 做一个spfile出来。上面是一种方法,如果你有用RMAN做过control file的auto backup的,从RMAN恢复
    spfile也是一种方法。手工写一个pfile然后和方法一,也是一种简易方法。
      

  11.   


    create spfile from pfile='可以成功启动的pfile文件路径';你可以看看这个文章
    http://www.inthirties.com/?p=438
      

  12.   

    谢谢你了。
    我使用
    create spfile from pfile='可以成功启动的pfile文件路径'; 
    重新创建了一个SPFILE放置到D:\oracle\product\10.2.0\db_1\database目录下。
    并且把原先的SPFILE删掉,数据库可以正常启动了。顺带问一下,有没有什么好的工具可以编辑这些二进制文件呢?
    可以用ULTRAEDIT编辑吗?
      

  13.   

    为什么要编辑二进制的?
    你在sqlplus中就可以修改spfile了.
      

  14.   

    为什么总想想改二进制文件呢,这个风险很大的。想修改参数文件的话,可以分这几步
    1. create pfile = 'XXXX.ora' from spfile
    2. vi xxxx.ora
    3. create spfile from pfile = 'XXXX.ora'
    重启数据库生效
      

  15.   

    你意思是不是就是说在SQL*Plus以sysdba身份连接,然后使用:
    ALTER SYSTEM SET parameter = value [ SCOPE= { MEMORY | SPFILE | BOTH } ]
    来修改SPFILE中的相关参数?呵呵,可能平常习惯于直接打开文件修改内容了,所以总想用个什么软件来把SPFILE打开直接修改。