如果v $ archive_log oracle中有两个线程#,我应该引用哪个SCN

时间:2016-02-23 10:22:22

标签: oracle oracle11g oracle10g rman

我正在使用RMAN进行oracle备份并保存当前scn编号我从命令下面获取scn编号

no more job
array (size=2)
  0 => 
    array (size=4)
      'worker1' => 
        array (size=2)
          0 => string 'j1' (length=2)
          1 => string 'j2' (length=2)
      'worker2' => 
        array (size=2)
          0 => string 'j3' (length=2)
          1 => string 'j4' (length=2)
      'worker3' => 
        array (size=2)
          0 => string 'j5' (length=2)
          1 => string 'j6' (length=2)
      'worker4' => 
        array (size=2)
          0 => string 'j7' (length=2)
          1 => string 'j8' (length=2)
  1 => 
    array (size=1)
      'worker1' => 
        array (size=2)
          0 => string 'j9' (length=2)
          1 => string 'j10' (length=3)

它给出了如下的输出

select max(next_change#) from v$archived_log where archived = 'YES' group by thread#;
我从oracle文档中发现,如果日志存档两次,则会有两个归档日志记录具有相同的MAX(NEXT_CHANGE#) ----------------- 3911392 3903950 THREAD#SEQUENCE#,但具有不同的名。

Que 1)在FIRST_CHANGE# commnd

中恢复时应该引用哪个SCN

Que 2)还有一个命令用于获取SCN,如下所示

SET Until SCN

其输出

select current_scn from v$database;

这两个命令之间的区别是什么输出SCN?

Que 3)我有一个RAC设置,它有两个oracle机器,这两个线程#是否与此有关?

1 个答案:

答案 0 :(得分:1)

让我们先从Oracle只有一个系统SCN这一事实开始(你的RAC中有多少个节点并不重要)。每个事务都有它自己的SCN,这就是为什么你在不同的线程上有不同的SCN(这很明显,因为每个线程管理它自己的事务)。现在回答你的问题:

  1. 这个问题有点奇怪,因为你应该参考你需要的SCN,如果你想要从3天前恢复“时间点”你从3天前推荐SCN。如果要将数据库恢复/恢复到上次提交的事务,则根本不需要引用任何SCN。
  2. 是 - “从双重选择dbms_flashback.get_system_change_number”并且可能存在其他一些方法。 和...之间的不同 select max(next_change#) from v$archived_log where archived = 'YES' group by thread#;select current_scn from v$database;是第一种情况,你得到的最大值(SCN)被存档(存档日志),第二种是当前数据库SCN,它总是大于第一次选择。
  3. 是的,每个线程都管理自己的事务(和隐式SCN)
  4. 通常,只有在需要“时间点”恢复时,才应在恢复/恢复方案中引用SCN。 select max(next_change#) from v$archived_log where archived = 'YES' group by thread#;并不意味着您是最新的系统级SCN,这意味着MAX归档SCN(考虑到您当前的在线重做日志中也有很多SCN)。还要考虑一下你的数据库是否处于NO_ARCHIVE模式 - 在这种情况下,select将不返回任何内容......