环境:windows xp,oracle9i
操作:执行oracle基于时间的恢复
     1、先冷备份所有数据文件和控制文件
     2、startup
     3、表中增加一条记录
     4、SHUTDOWN IMMEDIATE;
     5、从冷备份中拷贝回所有数据文件
     6、startup mount
     7、recover database until time '2009-03-30:11:45:00';
     显示:
ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 将出现如下错误
ORA-01194: 文件1需要更多的恢复来保持一致性
ORA-01110: 数据文件 1: 'D:\ORACLE\ORADATA\XUJIE\SYSTEM01.DBF'请问:如何解决

解决方案 »

  1.   

    recover datafiel 1;
    alter database open;
      

  2.   

    要想从冷备份文件中恢复数据,应该把原来冷备份的所有文件覆盖现在的oracle数据库文件
      

  3.   

    楼上说的对:冷备份的话,要求所有的文件:数据文件,控制文件和日志文件
    如果只备份数据文件和控制文件也是打开的,你先
    start mount;
    select checkpoint_change# from v$datafile;
    select checkpoint_change# from v$database;
     alter   database   recover   automatic   datafile   1
     alter   database   open    resetlogs;
      

  4.   

    LZ多半是非归档模式吧?
    如果是非归档,就只有还是把控制文件也恢复过来,而且不能做until time的还原,只能还原到冷备的时间点。
      

  5.   

    to vc555 :
      首先表示感谢.
      数据库是归档模式。请问还原时,1、除了拷贝回全部数据文件,还要拷贝回控制文件吗?2、是拷贝回全部数据文件,还是只拷贝回要时间恢复的部分数据文件?
      

  6.   


    如果是归档模式,可以拷贝回控制文件进行恢复,利用rman恢复是要做几个动作的,
    首先restore,恢复数据文件,
    再recover,产生redolog,tmp等数据文件,
    recover的时候指定一个时间参数即可恢复到一个时间点,前提是你的归档文件是完整的
      

  7.   

    run{
    allocate channel c1 type disk;
    allocate channel c2 type disk;
    set until time='2007-11-09:11:44:00';
    restore database;
    recover database;
    alter database open resetlogs;
    }
      

  8.   

    请问,如果是"基于SCN的恢复"恢复,如何得到某一时刻的SCN号,谢谢
      

  9.   

    再问,如果是"基于SCN的恢复"恢复,如何得到某一时刻的SCN号?"
      

  10.   

    楼主的库虽然是归档模式,可能没有启动归档进程
    archive log list
    看下提示,主要看下存档终点是哪个文件夹
    或者
    show parameter log_archive_dest_n(注:n换成1-10)
    看下VALUE列的值,如果是空值,那归档文件估计就没
    这样的话,重做日志文件应该已经被覆盖了
      

  11.   

    请问,如果是"基于SCN的恢复"恢复,如何得到某一时刻的SCN号,谢谢
      

  12.   

    请问:如何得到某一时刻的SCN号?
      

  13.   


    select scn,time_dp from sys.smon_scn_time where time_dp like to_date('2009 4 09','yyyy-mm-dd');可以通过系统表smon_scn_time查询scn和时间的关系
      

  14.   

    可通过闪回版本查询,
    SQL> select versions_starttime,versions_startscn,versions_endscn from test versi
    ons between timestamp minvalue and maxvalue;
      

  15.   

    再怎么说,你是恢复回来的控制文件,当然应该:recover databae using backup controlifle until time ''....
      

  16.   

    再问:如何得到某一时刻的SCN号?
      

  17.   

    这个也看的哦,如果是10g,符合条件的话,可以使用权timestamp_to_scn函数来得到
      

  18.   

    to liuyi8903 
      首先表示感谢.
      能解释一下9i与10g的区别吗?
      

  19.   

    请问:如何得到某一时刻的SCN号?
      

  20.   

    select dbms_flashback.get_system_change_number from dual;这是获得当前的.某一时刻可以存在转换关系,我说了,这个是有限制的.
      

  21.   

    当然,如果你的archivelog,那么是可以通过logmnr来分析日志,从里面找到scn==>time的对应的.
      

  22.   

    再问:如何得到某一时刻的SCN号?
      

  23.   

    SQL> select dbms_flashback.get_system_change_number scn from dual;       SCN
    ----------
       2308386SQL> select scn_to_timestamp(2308386)  from dual;SCN_TO_TIMESTAMP(2308386)
    ---------------------------------------------------------------------------
    15-APR-09 10.10.26.000000000 PMSQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';Session altered.SQL>  select scn_to_timestamp(2308386)  from dual;SCN_TO_TIMESTAMP(2308386)
    ---------------------------------------------------------------------------
    15-APR-09 10.10.26.000000000 PMSQL> select timestamp_to_scn(to_date('2009-04-15 10:10:26','yyyy-mm-dd hh24:mi:ss')) from dual;TIMESTAMP_TO_SCN(TO_DATE('2009-04-1510:10:26','YYYY-MM-DDHH24:MI:SS'))
    ----------------------------------------------------------------------
                                                                   2283500
      

  24.   

    to liuyi8903 :
       首先表示感谢.
       我在执行select scn_to_timestamp(2308386)  from dual; 时,报如下错误,请指导.   select scn_to_timestamp(2308386)  from dual
           *
       第 1 行出现错误:
       ORA-00904: "SCN_TO_TIMESTAMP": 无效的标识符
      

  25.   

    啊,你是9i,我突然想起来你是9i,9i是不行的.
    9i要获取这个,非得使用logmnr
      

  26.   

    请问9i如何使用logmnr获得某一时刻的SCN号,谢谢
      

  27.   

    再问9i如何使用logmnr获得某一时刻的SCN号,谢谢
      

  28.   

    所以说,前提你要了解logmnr的用法呀.如:v$logmnr_contents这个view里面就有scn这一列.
    前提你要先分析log
      

  29.   


    下面命令获得, 系统当前的SCN. 如果你计划在一个时间点模拟损坏数据库,可以先执行,
    获取SCN后记忆下来.select checkpoint_change# from v$database;
      

  30.   

    你如果是使用的冷备份进行备份和恢复策略的话。那就必须保证使用相同时刻的数据文件和控制文件。不需要日志文件,和归档文件。对应冷备份来说,归档和日志基本上没有意义叻。所以也只能恢复到冷备份的那个时刻的状态了。所以基于时间的恢复,就要看你的时间是在冷备份之前还是之后,如果是冷备份之后的话,就没有办法了,如果是之前的话,就要看你有没有备份日志和归档文件了。有了这两个在基于根据冷备份恢复好的系统,进行不完全恢复。注意你在做冷备份的恢复的时候,需要把已有备份的日志文件覆盖过去,否则只能resetlogs,这样也不能呢个做基于时间的不完全恢复叻。
    ====================================================================================
    Inthirties关注Oracle数据库 优化,安全,备份,恢复,迁移如果你需要帮助或想和我一起学习的请联系
    联系方式QQ:370140387
    QQ群:  85837884(注明:数据库)
    电子邮件:[email protected]
    网站: http://www.inthirties.com
      

  31.   

    to Tomac :
       首先表示感谢.
       “select checkpoint_change# from v$database; ”只能查询现在的SCN号,我需要过去某一时间的SCN号,请问如何得到?
      

  32.   


    1)建立一个记录SCN,时间的对照表,把上述SQL写成为一个PROCEDURE. 执行写入.
    2)建立JOB,每5分钟定时执行.这样你就可以得到时间和SCN的对照了. 至于ORACLE自身,可能没有一个特定的地方保存这些资料,没有意义的.
    即使有,也是一个特定的功能临时保存,例如STATSPACK等包的定时运行.无论做技术还是其他,需要灵活处理,不要耗到一个地方了.谢谢!
      

  33.   

    感谢Tomac,"建立一个记录SCN,时间的对照表,把上述SQL写成为一个PROCEDURE. "请问这个PROCEDURE如何写,才能取到任意时刻的SCN
      

  34.   

    Tomac的意思除了有对照表,还要有个JOB来跑这个表,然后来推算
      

  35.   

    再问:9i中如何得到某一时刻的SCN号?
      

  36.   

    深奥,oracle这东西,接触的都基本是运行中数据库,难以学习啊
      

  37.   


    根据系统当前的SCN号推测错误操作的SCN,系统有一个函数用于转换SCN和时间的,不过9i的不是太准确,具体可以baidu或者google一下举个例子:
    select current_scn from v$database;一般情况下还是用基于时间点的恢复较多,SCN不太容易得到确切的
      

  38.   


    这个查询出来的是database的scn号,如果基于scn恢复的话,这个没有太大的意义。我们来查scn来恢复的话,可以用过dump log,bloc或者根据rman里记录的scn号来做,比较有实际意义了。
      

  39.   

    to inthirties :
       首先表示感谢。
       “用过dump log,bloc或者根据rman里记录的scn号来做”,能具体讲一下吗?
      

  40.   

    dump是一种方式,可以将一些相关信息加到trc文件里,通过对trc文件里对block和log文件的查询可以查到一些相关的信息,比如scn就是如此。你可以g一下相关的文档至于rman也会记录一些有关旧的scn的号,不过我这里提到的只是对楼上有人说scn号的问题的一个自己的想法,和你说冷备份,然后recovery没有太大关系,对于冷备份的恢复来说,你先试试resetlogs的方式,然后在已经从冷备份的恢复的基础上,如果归档文件完整的话,再试着从从时间点上恢复,这个时间点必须是冷备份之前的时间。
    ==================================================================================== 
    Inthirties关注Oracle数据库 优化,安全,备份,恢复,迁移 如果你需要帮助或想和我一起学习的请联系 
    联系方式QQ:370140387 
    QQ群:  85837884(注明:数据库) 
    电子邮件:[email protected] 
    网站: http://www.inthirties.com