当数据库从9i或8i升级到10g时, 如果compatible参数也设成了10以上, 则LOG_ARCHIVE_FORMAT参数中必须包含%s, %t, %r参数. 其中%s是Log Seuqence; %t是Thread ID, RAC的节点中设有THREAD参数, 就是这个值了; %r指的是Resetlog ID了, 比较新, 得从Oracle 10g中增加的跨Resetlogs恢复功能说起.

    为了支持这个功能, Oracle 10g在控制文件中新增了一部份内容, 就是历次Open Resetlogs的经过, 每经历一次Open Restlogs就生成了一个新的Incarnation(不知道如何翻译这个单词了), 反应到数据库中则是V$DATABASE_INCARNATION视图(基表x$kccic, 说明是存放在控制文件中的). 我这儿没有经过多次open resetlogs的数据库, 等一下验证一下. 查一个从来没有Open Resetlogs的库吧, 如下所示:

ASQL> SELECT * FROM v$DATABASE_INCARNATION/G;

INCARNATION#                  : 1
RESETLOGS_CHANGE#             : 1
RESETLOGS_TIME                : 2007-07-16 17:28:06.0
PRIOR_RESETLOGS_CHANGE#       : 0
PRIOR_RESETLOGS_TIME          : null
STATUS                        : CURRENT
RESETLOGS_ID                  : 628104486
PRIOR_INCARNATION#            : 0
FLASHBACK_DATABASE_ALLOWED    : NO

1 rows returned.

    从这儿可以推导出一个观点, 当你重建控制文件后, 将丢失跨Resetlogs恢复的能力. 还好控制文件的参数大部份都可以动态改了, 基本上没有重建它的需要了. 上面的值中, STATUS列的值为CURRENT表示是当前的Incarnation, 另外还可以从V$DATABASE中获得当前正在使用的Incarnation. 如下所示:

ASQL> SELECT LAST_OPEN_INCARNATION# FROM V$DATABASE;

LAST_OPEN_INCARNATION#
----------------------
                     1

1 rows returned.

    有些部份还只是猜测, 如有错误, 请理解.