磁盘阵列坏了,昨天我朋友帮我发了一天的半天贴子。就是:
主  题:  十萬火急!!!Oracle控制文件和日志文件丟失﹐只剩數據文件﹐請問如何恢復數據庫 
作  者:  WQLu (單弦獨奏)  

解决方案 »

  1.   

    我也是在那个贴子中回答了,Oracle有一个工具叫dul,可以不用RDBMS直接把数据从数据文件中检索回来,建议你叫一下Oracle的现场服务吧。一天1000美金。
      

  2.   

    to hrb_qiuyb 
    谢谢!不能请Oracle公司的,有原因。
    dul工具要哪里有下载?
      

  3.   

    我明白原因
    dul没有下载的,只有Oracle有,我在做特殊培训时用过。
      

  4.   

    我认为没有dul你又没有备份,那你一定是没办法的。
      

  5.   

    加保留参数:
    _allow_resetlogs_corrupton = true
    _corrupted_rollback_segments = true 重建控制文件
    日志组open resetlogs然后赶紧exp
    重新建库
      

  6.   

    _corrupted_rollback_segments = true 这一句是错的
    应为
    _corrupted_rollback_segments = (rbs1,rbs2,...)
      

  7.   

    Thank you!
    我在重建控制文件前,是否要是否要把建立的控制文件清除,要不要把表空间覆盖?
    _corrupted_rollback_segments = (rbs1,rbs2,...)
    rbs1,rbs2...要填入什么内容?
      

  8.   

    可以偿试一下吗。
    1、编辑一下create controlfile 语句,示例如下:
    CREATE CONTROLFILE REUSE DATABASE "CTC" NORESETLOGS ARCHIVELOG
        MAXLOGFILES 32
        MAXLOGMEMBERS 3
        MAXDATAFILES 254
        MAXINSTANCES 8
        MAXLOGHISTORY 226
    LOGFILE
      GROUP 1 '/u01/oradata/ctc/redo01.log'  SIZE 5M,
      GROUP 2 '/u01/oradata/ctc/redo02.log'  SIZE 5M,
      GROUP 3 '/u01/oradata/ctc/redo03.log'  SIZE 5M
    DATAFILE
      '/u01/oradata/ctc/system01.dbf',
      '/u01/oradata/ctc/tools01.dbf',
      '/u01/oradata/ctc/rbs01.dbf',
      '/u01/oradata/ctc/temp01.dbf',
      '/u01/oradata/ctc/users01.dbf',
      '/u01/oradata/ctc/indx01.dbf'
    CHARACTER SET ZHS16CGB231280
    记住一定要把你所有使用数据文件都包括进来,否则以后一定是不可以用的了。
    2、在init<sid>.ora文件中加入以下两行,并把rollback_segments参数注释掉_allow_resetlogs_corrupton = true
    _corrupted_rollback_segments = (rbs1,rbs2,...)#rollback_segments中的回滚段
    3、启动库到nomount,重建控制文件
    svrmrgl>startup momount
    svrmgrl>create crontrolfile 语句;
    4、必要的时侯执行一下recover database,而不管是否报错。
    5、 打开数据库
     svrmgrl>alter database open resetlogs;
    6、如果库可以打开,你就可以执行exp了,如果还不行,相信Oracle除dul它也没办法了。
      

  9.   

    1:你不是丢失了么,又哪里来的控制文件?
    2:为什么会覆盖表空间?那你还上哪里找数据?
    3: 晕,你的回滚段叫什么名字就填什么呀
    4:最好你们还是有一个懂点oracle的人来做保险一些
      

  10.   

    1。重建空的数据库后不是有一个新的控制文件友吗(和以前库名称一样)
    2。重建空的数据库后建立了一个和以前一样的表空间
    3。别晕,我不是Oracle DBA
    4。找一个Oracle懂的人比较难,现在又是非常时刻。
    Thank you very much!过深圳时我请你喝茶。
      

  11.   

    主要是你没有说清楚,从你这里的情况来看,应当是可以恢复的.
    主要是因为你们仅仅是磁盘损坏,而数据文件没有丢失
    而且,由于磁盘损坏导致控制文件损坏,那数据文件应该还是大致同步的.
    主要思想是先恢复控制文件
    然后创建联机日志
    --------------
    1、你可以先在别的机器上建立一个恢复环境,建立一个恢复数据库,最好与原机一致,如数据库名,sid,路径等。
    2、停掉恢复用的数据库,用原来的init.ora文件覆盖恢复用的数据库的init.ora文件,修改相应参数,楼上已经说了。
    3、拷贝原来的数据文件到恢复用的数据库下
    4、启动恢复用的数据库到nomount下,startup nomount。
    5、创建控制文件,如楼上所言
    6、控制文件创建如果没有问题,数据库已经启动到mount下,如果5没有错,则recover database until cancel;如果5有错,检查错误并重试。
    7、如果6没有错,alter database open resetlogs,创建联及日志并同步所有文件。如果6有错,检查错误原因并贴出来
    8、重新备份
      

  12.   

    1。重建空的数据库后不是有一个新的控制文件友吗(和以前库名称一样)
    2。重建空的数据库后建立了一个和以前一样的表空间
    -----------------------------
    如果用于恢复,重新建立一个数据库是可行的,但不用什么都与原来一样,
    如表空间就不用重建,主要是一个环境,路径,sid最好一致是因为恢复完成后拷贝到主数据库方便
    新建立数据库的控制文件,数据文件,联机日志都是不要的。只要一个恢复环境,明白吗
      

  13.   

    谢谢各位同仁。主要是我没有DBA的经验。所以叙起来不清楚的。
    init文件丢失,没有Copy,服务器已格式化。
      

  14.   

    init文件丢失,问题也不大,但要知道原来数据库的环境最好
    服务器已格式化???数据文件拷贝出来没有???
    你说清楚啊,如果再这样,神仙也不能帮你了.
      

  15.   

    新建立数据库的控制文件,数据文件,联机日志都是不要的。
    -------------
    不需要新建立的控数联文件是不是删除,还是不用管它。
    因为没有init文件,我们创建了控制文件后打开数据库提示ID错误
      

  16.   

    原来的数据库环境有哪些呢?
    数据文件Copy出来了(只Copy表空间和索引空间)
    由于不能恢复数据,昨天就格了,只好让工序去补半个月的单。
    但我们还想再尝试恢复。生产线不能等的(一天已经很要命了)
      

  17.   

    注意的是,
    init文件中的数据库名,事例名最好与原来一致,原来是什么你知道吧
    创建新的控制文件的时候,注意字符集与文件路径
    创建新的控制文件之前,可以删除恢复用的机器上的所有其它文件了
    如新的控制文件,没有用的数据文件,新的联机日志
      

  18.   

    你已经让人很要命了,建议这次事件之后,你开始恶补oracle数据库知识吧
      

  19.   

    to :penitent(只取一瓢) ( )
    樓主和我與前是用MSSQL的﹐剛接觸他剛oracle不久﹐請多指教!
      

  20.   

    6、控制文件创建如果没有问题,数据库已经启动到mount下,如果5没有错,则recover database until cancel;如果5有错,检查错误并重试。
    运行6时提示数据库ID不正确。
      

  21.   

    我也知道这次惨痛的教训的。从节后我会恶补Oracle。
    还请各位同仁指教。
      

  22.   

    啊,不好意思﹐筆誤:)樓主和我與前是用MSSQL的﹐她接觸剛oracle不久﹐我還沒用過:(  
    請多指教!
      

  23.   

    to wolu
    你老刚来又走了。反正你也不清楚,走就走吧。
      

  24.   

    从你的情况来说,只能说有可能恢复,因为的确你没有归档和备份.
     csdn521(最近比較煩) 不要太烦,保持身心快乐是最重要的
    有人说,生活是一面镜子:
    你对它笑,它就笑
    你对它哭,它也哭
    ----------------------
    注意创建init.ora文件与控制文件的时候,都是需要数据库名的,要注意与以前一样。我想知道你在运行6的时候出错的错误号是什么
    如ora-?????,这里的数字
      

  25.   


    http://www.cnoug.org/bin/ut/topic_show.cgi?id=94&h=1&bpg=1&age=30这是一个演示示例,应该是很详细的了,有问题可以在这里提出
    对于备份与恢复
    这上面的里的 chao_ping 
    恐怕在网上大陆的比他更有经验的不是太多 :)
    上面跟你说的保留参数
    其实并不是非使用不可,回滚段文件还在的话就可以不用回滚段的参数关键在于你决定丢失多少数据! 我想大致的步骤已经讲的差不多了,更详细的问题可以去上面的地方
    或者这里探讨
     http://www.itpub.net/forumdisplay.php?s=&forumid=2
      

  26.   

    你的这个问题实际上就是一个不完全恢复的问题
    在 机械工业出版社的  8i备份与恢复  中有讲hope this can  help you
      

  27.   

    我想:
    你们一边补录单据你可以尝试恢复
    如果你消耗一天的时间恢复成功,让你的同事们节约了更多的时间,这是你的价值体现出来 出彩 的机会
    同时也更提醒你们公司 管理数据库的重要性当然,你做恢复后,实际上数据库中是可能存在不合法数据的
    要怎么清除不合法数据你一定要根据时间或者某个规则以确定,截止到那天哪个时间的数据是合法的
    然后把这之后的数据全部删除(当然可以先做好exp什么的备份)
    然后从这个时间点开始录入
    这个跟你的业务相关,我就只能给你建议而不能帮助你了最好的情况,就是,你只丢失当时  redo  log 中的数据和回滚段中的需要回滚的数据,应该不多,到要界定出来也不容易
    合理的是把当天(或者当天某个时间点之后)的全部删除再录入
      

  28.   

    Thank you biti!
    Sorry,我现在才有时间来找大家。一早上只顾着处理在补单中的问题,天哪,数据库锁定,同时几个人对同一个表进行Insert会锁定表,其它用户不能再操作。各位在同仁,为什么呢?!!!!!昨天晚上由于我们都在忙着补单问题,经理说已经选择了补单,要先全力以赴解决补单中的问题。要偿试,等过两天放假了再有时间去试(注:25号放假)。昨晚上我回宿舍尝试,可是由于我装了9i,后来又装8i,导致svrmgrl命令找不到,太晚了就放弃了。
    我们已经收集了各位同仁的宝贵资料,25号就可以集中精力去做了。
    真的,Oracle有太多东西要学了。锁表的问题,大家可以帮我想想吗?
      

  29.   

    我需要知道的是:
    你最好要有所有的数据文件(临时数据文件除外),包括系统数据文件,data数据文件,index数据文件(如果全是索引倒可以考虑不要),回滚数据文件(可能需要用到同步)
    特别是系统数据文件和存放数据的数据文件需要存在才有可能有希望.
    ----------
    最后,祝你好运
      

  30.   

    如果同时insert是不会影响的,除非有update或delete发生
    1、当前session中commit、rollback都可以解锁
    2、在别的session中(DBA)通过
    查找用户锁
    select s.username,
    decode(l.type,'TM','TABLE LOCK',
                  'TX','ROW LOCK',
                  NULL) LOCK_LEVEL,
    o.owner,o.object_name,o.object_type,
    s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
    from v$session s,v$lock l,dba_objects o
    where s.sid=l.sid
    and o.object_id=l.id1
    and s.username is not null
    检查出来谁锁了该表
    查看结果中object_name='你的表名'
    然后得到sid,serial#
    alter system kill session 'sid, serial#' 
    or
    alter system disconnect session 'sid, serial#' immediate;
      

  31.   

    Thank you ! Pentient
    我们现在只有Data文件和Index文件。
    我们有查询和Kill锁定的用户的程序,和你给我提供的代码一样。
    可是还是会锁的。
    我们已查出原因。所有的BDE参数都设成一样的,但涉及的BDE版本不同会有不同的问题的。
    我们把会锁定的那台机的BDE520版本更换为BDE510就不会锁定了。
    但是很奇怪的是有的Win 2K装BDE520版本没问题,有的Win 2K装BDE510没问题。
    WIN98 装BDE510就没有问题。为什么呢?
      

  32.   

    同时几个人对同一个表进行Insert会锁定表,其它用户不能再操作。各位在同仁,为什么呢?!!!!!
    alter table xxx storage(freelists 20);请这样修改你的表
      

  33.   

    alter table xxx storage(freelists 20);
    我现在表中存了很多数据的,如果执行这句会不会把数据清除呢?
    freelists 20 是什么意义呢?Thank you !
      

  34.   

    这是为了insert的时候可以并发
    不用 等待空间
    因为默认是1,也就是同一个时间点本质上只有一个用户可以insert数据不会有不利的影响的!
      

  35.   

    http://www.cnoug.org/bin/ut/topic_show.cgi?id=367&h=1&bpg=1&age=100这文章里面有比较深入的讨论
    freelist加大的作用就是为了 insert 的并发
    这个在很多地方都有谈到,道理也很简单
    一个freelist同一时刻只能有一个进程使用
    这是一个链表,上面是 数据块我在这个文章里面探讨了它可能有什么影响,或者说有什么不利的一面
    直到找到oracle的实现算法
    最后证明加大是合理的,几乎没有坏处的(包括理论和实践的证明都有的)