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

Which SCN should i refer if there are two thread# in v$archive_log oracle

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

select max(next_change#) from v$archived_log where archived = 'YES' group by thread#;

输出如下

MAX(NEXT_CHANGE#)
-----------------
          3911392
          3903950

我从oracle文档中查到的是,如果日志被归档了两次,就会有两条归档日志记录相同的THREAD#SEQUENCE#FIRST_CHANGE#,但是与一个不同的名字。

问题 1)在 SET Until SCN commnd

中恢复时我应该引用哪个 SCN

问题2)还有一个获取SCN的命令如下

select current_scn from v$database;

它的输出是

CURRENT_SCN
-----------
    3914145

这两个命令输出SCN有什么区别?

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

让我们从 Oracle 只有一个系统 SCN 这一事实开始(无论您的 RAC 中有多少个节点)。每个事务都有它自己的 SCN,这就是为什么你在不同的线程上有不同的 SCN(这是显而易见的,因为每个线程管理它自己的事务)。现在回复您的问题:

  1. 这个问题有点奇怪,因为你应该引用你需要的 SCN,如果你想 "point in time" 从 3 天前恢复你引用 3 天前的 SCN。如果您想 restore/recover 您的数据库直到最后提交的事务,那么您根本不必引用任何 SCN。
  2. 是 - "select dbms_flashback.get_system_change_number from dual" 也许还有其他方法。 和...之间的不同 select max(next_change#) from v$archived_log where archived = 'YES' group by thread#;select current_scn from v$database; 是在第一种情况下你得到 max(SCN) 已存档(到存档日志中)第二种是当前 DB SCN,它总是大于第一个 SELECT.
  3. 是的,每个线程管理自己的事务(和隐式 SCN)

一般来说,只有当您想要 "point in time" 恢复时,您才应该在 restore/recovery 场景中引用 SCN。 select max(next_change#) from v$archived_log where archived = 'YES' group by thread#; 并不意味着您是最新的、系统范围的 SCN,这意味着 MAX 存档的 SCN(考虑到您当前的联机重做日志中也有很多 SCN)。还要考虑您的数据库是否处于 NO_ARCHIVE 模式 - 在这种情况下 select 将 return 什么都没有...