0%

oracle incarnation 理解(RMAN - 20207)

RMAN-20207: UNTIL TIME or RECOVERY WINDOW is before RESETLOGS time

1
2
RMAN> list incarnation;
RMAN> reset database to incarnation {INCARNATION#};

昨天在客户IT在备份环境做DBPITR时,突然报上面错误,谷歌一下,简单解决了,表面原因是他rman执行until time还原DB时设置的时间超前当前incarnation的时间了。但是什么事incarnation,查了一下一头雾水,还是要看官网,个人知识和翻译不同导致见解不同,我个人把它理解成:化身,或者阶段来描述它。


查看官网视图,与incarnation相关有2个,DBA_RESOURCE_INCARNATIONS 和 V$DATABASE_INCARNATION:
其中DBA_RESOURCE_INCARNATIONS是关于instance的,一般应该用不到,记录的信息其他视图也能找到。

1
2
3
4
5
6
7
8
9
set lin 200 pages 3000
col RESOURCE_TYPE for a20
col RESOURCE_NAME for a20
col DB_UNIQUE_NAME for a20
col DB_DOMAIN for a20
col INSTANCE_NAME for a20
col HOST_NAME for a20
col STARTUP_TIME for a20
select * from dba_resource_incarnations;

image-20200303215437181.png

1
2
col FLASHBACK_DATABASE_ALLOWED for a3
select * from V$DATABASE_INCARNATION;

1583335025532

第一列是number唯一标识号,第二列是open resetlogs时的redo记录的scn,其中status有 父态、孤儿态、当前态,有点难理解,其实官方手册说还有祖先态,但我这里没显示,请看下面理解

和rman相关的就是V$DATABASE_INCARNATION,查询结果和rman命令结果一致:

1583335057903

1
什么是scn:系统改变号,一个随时间递增的数字,oracle有4种scn,用来保证事务acid和DB恢复的有序进行。
1
resetlogs做什么:归档当前redo并重置redo序号,如果redo不存在则创建,创建new incarnation并初始化控制文件的redo信息,还有更新dbf、redo、arch日志的scn信息。

什么incarnation:

1583335084564

其中标红线的就是3个incarnation:

1
2
3
incarnation1: 横向的scn1    -- scn2000
incarnation2: 斜向的scn1000 -- scn3000(open resetlogs至incarnation1的scn1000处创建出来的incarnation2)
incarnation3: 横向的scn2000 -- scn3000(open resetlogs至incarnation2的scn2000处创建出来的incarnation3)

那为什么要有incarnation呢:

1583335101710

1
2
如上图,在incarnation1和incarnation2是可能存在同一个scn号1500同时对应不同incarnation分支线上的同一个时间点的,如果再来一个incarnation4从incarnation1的scn1000出open resetlogs创建分支出来,那scn号1500可能就对应多个分支线数据了,所以控制文件只认当前为current的最新的incarnation的scn,如果你想要返回之前哪个incarnation的scn号的数据,就需要手动rman执行: reset database to incarnation <number号>;
你可以选择incarnation2的1500或者是incarnation1的1500号的scn数据,当然,前提是resetlogs后重新做了备份,并且之前的incarnation的备份数据都在,就可以until 回去了。

最后,incarnation状态中什么是孤儿态(ORPHAN)?

1583335118056

1
上图中红线部分都是ORPHAN态,词典译为孤儿态,就是一个父亲,下面的就是current态,父亲的父亲就是祖先态(ancestor),当一个incarnation被resetlogs后丢弃的那部分数据,就称为孤儿态。