RMAN-20207: UNTIL TIME or RECOVERY WINDOW is before RESETLOGS time
1 | list incarnation; |
昨天在客户IT在备份环境做DBPITR时,突然报上面错误,谷歌一下,简单解决了,表面原因是他rman执行until time还原DB时设置的时间超前当前incarnation的时间了。但是什么事incarnation,查了一下一头雾水,还是要看官网,个人知识和翻译不同导致见解不同,我个人把它理解成:化身,或者阶段来描述它。
查看官网视图,与incarnation相关有2个,DBA_RESOURCE_INCARNATIONS 和 V$DATABASE_INCARNATION:
其中DBA_RESOURCE_INCARNATIONS是关于instance的,一般应该用不到,记录的信息其他视图也能找到。
1 | set lin 200 pages 3000 |
1 | col FLASHBACK_DATABASE_ALLOWED for a3 |
第一列是number唯一标识号,第二列是open resetlogs时的redo记录的scn,其中status有 父态、孤儿态、当前态,有点难理解,其实官方手册说还有祖先态,但我这里没显示,请看下面理解
和rman相关的就是V$DATABASE_INCARNATION,查询结果和rman命令结果一致:
1 | 什么是scn:系统改变号,一个随时间递增的数字,oracle有4种scn,用来保证事务acid和DB恢复的有序进行。 |
1 | resetlogs做什么:归档当前redo并重置redo序号,如果redo不存在则创建,创建new incarnation并初始化控制文件的redo信息,还有更新dbf、redo、arch日志的scn信息。 |
什么incarnation:
其中标红线的就是3个incarnation:
1 | incarnation1: 横向的scn1 -- scn2000 |
那为什么要有incarnation呢:
1 | 如上图,在incarnation1和incarnation2是可能存在同一个scn号1500同时对应不同incarnation分支线上的同一个时间点的,如果再来一个incarnation4从incarnation1的scn1000出open resetlogs创建分支出来,那scn号1500可能就对应多个分支线数据了,所以控制文件只认当前为current的最新的incarnation的scn,如果你想要返回之前哪个incarnation的scn号的数据,就需要手动rman执行: reset database to incarnation <number号>; |
最后,incarnation状态中什么是孤儿态(ORPHAN)?
1 | 上图中红线部分都是ORPHAN态,词典译为孤儿态,就是一个父亲,下面的就是current态,父亲的父亲就是祖先态(ancestor),当一个incarnation被resetlogs后丢弃的那部分数据,就称为孤儿态。 |