Oracle 中的 Incarnation 到底是个什么?实验操作篇
对于“化身”Incarnation概念了解之后,本篇通过手工恢复实验来具体操作演示,加深对Incarnation的理解,来自于博客园AskScuti。
你可以点击此处查看《概念理解篇》。
目录
1. 官方图示例
2. 场景模拟
3. 实验步骤
3.1 备份数据库(略)
3.2 查询当前数据库化身版本
3.3 按场景模拟操作
3.4 恢复出B表并打开数据库
3.5 查询当前数据库化身版本
3.6 恢复出A-6(修改当前化身)并打开数据库
3.7 查询当前数据库化身版本
1. 官方图示例
在官方文档 Release 19c Backup and Recovery User's Guide:14.3.2.2 Relationship Among Database Incarnations 中有这么一张示例图片。(注意:每个版本都有,这里只是顺手翻了最新版本)

此图涉及三个版本的化身 Incarnation。
Incarnation 1:
最低位黑色水平线从 SCN1 开始,经历 SCN1000,直到 SCN2000,这个为数据库第一个化身,称之为 Incarnation 1,这时候,化身1 就为当前化身(current incarnation)。
Incarnation 2:
假设在化身1中,我们执行了一个时间点恢复(不完全恢复),且指定的地方是 SCN1000 的位置,然后我们通过使用 Resetlogs 选项打开了数据库,这时,化身2 就出现了(45°倾斜黑色实线),化身2 从SCN1000开始,持续到 SCN3000。这时候,我们称化身1 是 化身2 的父级化身(parent incarnation),化身2 变为当前化身(current incarnation)。
Incarnation 3:
我们观察下向右上角45°倾斜的这条黑色实线,它是化身2。在化身2中,它从 SCN1000开始,经过 SCN2000,持续到 SCN3000。假设在化身2 中,我们执行了一个时间点恢复(不完全恢复),且指定的地方是 SCN2000 的位置,然后通过 Resetlogs 选项打开数据库,这时,化身3 就出现了(位于最高位的黑色水平线),化身3 从 SCN2000开始,持续到黑色水平线的 SCN3000。这时候,我们称化身2 是 化身3 的父级化身,称化身1 是 化身3 的祖辈级化身(ancestor incarnation),化身3 变为当前化身(current incarnation)。
2. 场景模拟
我们不妨来模拟一个场景:下面这张图灰色区块一共8个,这是8个动作。分别代表:表A插入1、表A插入2、表A插入3、表B插入666、Drop删除表B、表A插入4、表A插入5、表A插入6。

我在操作完成表A数据6的插入后,发现了刚才刚才Drop掉了表B(这里不讨论闪回技术),而表B数据很重要,需要做基于时间点的不完全恢复,然后以 Resetlogs 选项打开数据库。这时数据库第二个化身出现,如下图

现在数据库里面的操作都是基于化身2,后面我又想还是算了,重新还原恢复到 A-6 吧。于是还原旧的数据文件,然后进行恢复,试想会成功恢复到A-6吗?前提又是什么呢?是可以成功的,前提是需要在RMAN里面指定使用哪一个化身。因为 A-4、A-5 和 A-6 都是属于第一个原始化身:化身1,而现在数据库是基于化身2的,如果使用现在数据库的默认化身2,那么恢复出来的依然是第二个化身中的操作,就是得提前指定方向,你是想往水平方向(化身1)恢复呢,还是想往右上角方向(化身2)恢复。
同理,如果指定了往水平方向去恢复,恢复到A-6之后,依然需要使用 Resetlogs 选项打开数据库,这时数据库的第三个化身出现,而原第二化身变为孤儿化身(ORPHAN),如下图

3. 实验步骤
3.1 备份数据库(略)
3.2 查询当前数据库化身版本(这里实验环境多了一个化身,忽略)
SQL> select INCARNATION#,RESETLOGS_CHANGE#,RESETLOGS_TIME,STATUS from v$database_incarnation; INCARNATION# RESETLOGS_CHANGE# RESETLOGS_TIME STATUS
------------ ----------------- ------------------ -------
1 1 2011-09-17 09:46:04 PARENT
2 995548 2019-02-23 16:01:17 CURRENT
切归档,查看归档文件名称
SQL> alter system archive log current; System altered. SQL> / System altered. SQL> / System altered. SQL> col name for a60
SQL> select name from v$archived_log; NAME
--------------------------------------------
/u01/app/oracle/archive1/1_54_1001001677.dbf
/u01/app/oracle/archive1/1_55_1001001677.dbf
/u01/app/oracle/archive1/1_56_1001001677.dbf
/u01/app/oracle/archive1/1_57_1001001677.dbf
注意归档日志名称中的 ,这是由数据库归档参数 log_archive_format 定义的,默认情况下该参数对应的值为:%t_%s_%r.dbf
%t:thread number 日志线程号,单实例中就是1(这里不探讨RAC环境)
%s:log sequence number 日志序列号,每次日志切换归档后,序列号加1
%r:resetlogs ID 日志重置ID号,这个就是控制化身Incarnation的,每次resetlogs后,该ID都会改变,日志序列号又从1开始。其目的是为了保证数据库在跨多个化身版本时,保证归档日志名称的唯一性。
3.3 按场景模拟操作
创建A表和B表,并按照场景模拟操作
SQL> create table a(id number); Table created. SQL> create table b(id number); Table created. SQL> insert into a values(1); 1 row created. SQL> insert into a values(2); 1 row created. SQL> insert into a values(3); 1 row created. SQL> insert into b values(666); 1 row created. SQL> commit; Commit complete. SQL> select sysdate from dual; SYSDATE
-------------------
2019-05-28 19:57:50 SQL> select current_scn from v$database; CURRENT_SCN
-----------
1520977 SQL> drop table b purge; Table dropped. SQL> insert into a values(4); 1 row created. SQL> insert into a values(5); 1 row created. SQL> insert into a values(6); 1 row created. SQL> commit; Commit complete.
3.4 恢复出B表并打开数据库
这时,准备恢复出B表(B表中只有一条数据666)
还原旧的数据文件
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> !cp /u01/app/oracle/backup/*.dbf /u01/app/oracle/oradata/PROD1/
做不完全恢复
SQL> startup mount
ORACLE instance started. Total System Global Area 830930944 bytes
Fixed Size 2232920 bytes
Variable Size 591400360 bytes
Database Buffers 234881024 bytes
Redo Buffers 2416640 bytes
Database mounted. SQL> select file#,change# from v$recover_file; FILE# CHANGE#
---------- ----------
1 1519163
2 1519163
3 1519163
4 1519163
5 1519163
6 1519163
7 1519163
8 1519163
9 1519163
10 1519163 10 rows selected. SQL> recover database until change 1520977;
ORA-00279: change 1519163 generated at 05/28/2019 19:29:20 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/archive1/1_55_1001001677.dbf
ORA-00280: change 1519163 for thread 1 is in sequence #55 Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
Log applied.
Media recovery complete.
SQL> alter database open resetlogs; Database altered.
3.5 查询当前数据库化身版本
完成基于时间点恢复后,查询当前数据库化身版本,对比3.2小节
SQL> select INCARNATION#,RESETLOGS_CHANGE#,RESETLOGS_TIME,STATUS from v$database_incarnation; INCARNATION# RESETLOGS RESETLOGS_TIME STATUS
------------ --------- ------------------- -------
1 1 2011-09-17 09:46:04 PARENT
2 995548 2019-02-23 16:01:17 PARENT
3 1520978 2019-05-28 20:35:03 CURRENT
可以看到,当前数据库使用的化身为3,我们尝试切换日志生成归档,对比归档名称
SQL> alter system archive log current; System altered. SQL> / System altered. SQL> / System altered. SQL> select name from v$archived_log; NAME
--------------------------------------------
/u01/app/oracle/archive1/1_54_1001001677.dbf
/u01/app/oracle/archive1/1_55_1001001677.dbf
/u01/app/oracle/archive1/1_56_1001001677.dbf
/u01/app/oracle/archive1/1_57_1001001677.dbf
/u01/app/oracle/archive1/1_58_1001001677.dbf
/u01/app/oracle/archive1/1_1_1009485303.dbf
/u01/app/oracle/archive1/1_2_1009485303.dbf
/u01/app/oracle/archive1/1_3_1009485303.dbf 8 rows selected.
可看到,当数据库 resetlogs 后,归档日志名的 Incarnation 由原来的 1001001677 变为了现在的1009485303,且日志序列号,重新从1开始。
需要注意,Oracle 11g 是可以跨化身进行恢复的。(可以从化身为1001001677 的54号日志开始,一直应用到化身为1009485303的4号日志)
例如,这是另外一个实验,还原旧的数据文件,然后进行完全恢复。仔细观察归档的应用。
SQL> !cp /u01/app/oracle/backup/*.dbf /u01/app/oracle/oradata/PROD1/ SQL> startup mount
ORACLE instance started. Total System Global Area 830930944 bytes
Fixed Size 2232920 bytes
Variable Size 591400360 bytes
Database Buffers 234881024 bytes
Redo Buffers 2416640 bytes
Database mounted.
SQL> recover database;
ORA-00279: change 1519163 generated at 05/28/2019 19:29:20 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/archive1/1_55_1001001677.dbf
ORA-00280: change 1519163 for thread 1 is in sequence #55 Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 1519932 generated at 05/28/2019 19:40:13 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/archive1/1_56_1001001677.dbf
ORA-00280: change 1519932 for thread 1 is in sequence #56 ORA-00279: change 1519936 generated at 05/28/2019 19:40:14 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/archive1/1_57_1001001677.dbf
ORA-00280: change 1519936 for thread 1 is in sequence #57 ORA-00279: change 1519941 generated at 05/28/2019 19:40:18 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/archive1/1_58_1001001677.dbf
ORA-00280: change 1519941 for thread 1 is in sequence #58 ORA-00279: change 1520978 generated at 05/28/2019 20:35:03 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/archive1/1_1_1009485303.dbf
ORA-00280: change 1520978 for thread 1 is in sequence #1 ORA-00279: change 1522809 generated at 05/28/2019 20:55:20 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/archive1/1_2_1009485303.dbf
ORA-00280: change 1522809 for thread 1 is in sequence #2 ORA-00279: change 1522813 generated at 05/28/2019 20:55:22 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/archive1/1_3_1009485303.dbf
ORA-00280: change 1522813 for thread 1 is in sequence #3 ORA-00279: change 1522817 generated at 05/28/2019 20:55:24 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/archive1/1_4_1009485303.dbf
ORA-00280: change 1522817 for thread 1 is in sequence #4 ORA-00279: change 1523255 generated at 05/28/2019 21:01:35 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/archive1/1_5_1009485303.dbf
ORA-00280: change 1523255 for thread 1 is in sequence #5 Log applied.
Media recovery complete.
SQL> alter database open; Database altered.
archivelog sequence
3.7 恢复出A-6(修改当前化身)并打开数据库
查询当前数据库化身(这里实验环境多了一个化身,忽略)
SQL> select INCARNATION#,RESETLOGS_CHANGE#,RESETLOGS_TIME,STATUS from v$database_incarnation; INCARNATION# RESETLOGS RESETLOGS_TIME STATUS
------------ --------- ------------------ ------
1 1 2011-09-17 09:46:04 PARENT
2 995548 2019-02-23 16:01:17 PARENT
3 1520978 2019-05-28 20:35:03 CURRENT
当前数据库正在使用3号 Incarnation,也就意味着,数据的恢复,目前只能走标数字号码的这条线。

如果想要通过旧的数据文件,恢复到A-6,那么需要更改数据库恢复路线,就是更改数据库化身版本Incarnation,修改为2即可。(实验环境,之前操作多了一个化身,可以忽略)
关闭数据库,还原旧的数据文件。
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> !cp /u01/app/oracle/backup/*.dbf /u01/app/oracle/oradata/PROD1/ SQL> startup mount;
ORACLE instance started. Total System Global Area 830930944 bytes
Fixed Size 2232920 bytes
Variable Size 591400360 bytes
Database Buffers 234881024 bytes
Redo Buffers 2416640 bytes
Database mounted.
连接RMAN,更改当前数据库化身版本。
[oracle@henry ~]$ rman target / Recovery Manager: Release 11.2.0.3.0 - Production on Tue May 28 21:35:33 2019 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. connected to target database: PROD1 (DBID=2222344843, not open) RMAN> reset database to incarnation 2; using target database control file instead of recovery catalog
database reset to incarnation 2
我们查看下当前数据库使用的化身版本。
SQL> select INCARNATION#,RESETLOGS_CHANGE#,RESETLOGS_TIME,STATUS from v$database_incarnation; INCARNATION# RESETLOGS RESETLOGS_TIME STATUS
------------ --------- ------------------- ------
1 1 2011-09-17 09:46:04 PARENT
2 995548 2019-02-23 16:01:17 CURRENT
3 1520978 2019-05-28 20:35:03 ORPHAN
现在,数据库又使用了第一个化身版本,化身号为2,(化身号1为初始化身,忽略),而原第二个化身(化身号为3)状态变为了孤儿化身(ORPHAN)。
现在将遵照下图中标注的数字号这条线来恢复出A-6

然后,恢复数据库,仔细观察前滚的归档日志名称。
SQL> recover database;
ORA-00279: change 1519163 generated at 05/28/2019 19:29:20 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/archive1/1_55_1001001677.dbf
ORA-00280: change 1519163 for thread 1 is in sequence #55 Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 1519932 generated at 05/28/2019 19:40:13 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/archive1/1_56_1001001677.dbf
ORA-00280: change 1519932 for thread 1 is in sequence #56
ORA-00278: log file '/u01/app/oracle/archive1/1_55_1001001677.dbf' no longer needed for this recovery ORA-00279: change 1519936 generated at 05/28/2019 19:40:14 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/archive1/1_57_1001001677.dbf
ORA-00280: change 1519936 for thread 1 is in sequence #57
ORA-00278: log file '/u01/app/oracle/archive1/1_56_1001001677.dbf' no longer needed for this recovery ORA-00279: change 1519941 generated at 05/28/2019 19:40:18 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/archive1/1_58_1001001677.dbf
ORA-00280: change 1519941 for thread 1 is in sequence #58
ORA-00278: log file '/u01/app/oracle/archive1/1_57_1001001677.dbf' no longer needed for this recovery Log applied.
Media recovery complete. SQL> alter database open resetlogs; Database altered.
确认A-6数据是否已经恢复
SQL> select * from a;
ID
----------
1
2
3
4
5
6
6 rows selected.
3.8 查询当前数据库化身版本
最后,我们再次查询数据库化身版本。对比3.2和3.7。
SQL> select INCARNATION#,RESETLOGS_CHANGE#,RESETLOGS_TIME,STATUS from v$database_incarnation; INCARNATION# RESETLOGS RESETLOGS_TIME STATUS
------------ --------- ------------------- ------
1 1 2011-09-17 09:46:04 PARENT
2 995548 2019-02-23 16:01:17 PARENT
3 1520978 2019-05-28 20:35:03 ORPHAN
4 1521714 2019-05-28 21:50:58 CURRENT
Oracle 中的 Incarnation 到底是个什么?实验操作篇的更多相关文章
- Oracle 中的 Incarnation 到底是个什么?概念理解篇
高中时候,我深深“爱”上了一位女孩子.那个年纪确实不懂什么是真正的“爱”,反正每天满脑子都是她,只要见到她就会紧张和激动,确切的说是深深的喜欢.你告诉我这叫初恋?不,我的初恋应该是小学3年级,三六班. ...
- Oracle中Blob和Clob类型的区别与操作
Oracle中Blob和Clob类型 1.Oracle中Blob和Clob类型的区别 BLOB和CLOB都是大字段类型,BLOB是按二进制来存储的,而CLOB是可以直接存储文字的.其实两个是可以互换的 ...
- oracle中使用pl/sql进行的文件读写操作
第一次知道,可以使用pl/sql来进行文件的读写操作,嘿嘿,简单的试了下可行. 基本步骤如下: SQL> conn sys/sys@orcl as sysdba 已连接. SQL> cre ...
- SQL Server与Oracle中的隔离级别
在SQL92标准中,事务隔离级别分为四种,分别为:Read Uncommitted.Read Committed.Read Repeatable.Serializable 其中Read Uncommi ...
- ORACLE中查询语句的执行顺及where部分条件执行顺序测试
Oracle中的一些查询语句及其执行顺序 原文地址:https://www.cnblogs.com/likeju/p/5039115.html 查询条件: 1)LIKE:模糊查询,需要借助两个通配符, ...
- ORACLE中DBMS_SQL的用法
ORACLE中DBMS_SQL的用法 对于一般的select操作,如果使用动态的sql语句则需要进行以下几个步骤: open cursor---> parse---> define ...
- Oracle中的一些基本操作
关于Oracle中的一些基本操作,包括表空间操作,用户操作,表操作 --创建表空间 create tablespace itheima datafile 'I:\oracle\table\itheim ...
- oracle中imp命令详解 .
转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...
- Oracle中的rownum用法解析
注意:rownum从1开始: 1.rownum按照记录插入时的顺序给记录排序,所以有order by的子句时一定要注意啊! 2.使用时rownum,order by字段是否为主键有什么影响? 3 ...
随机推荐
- Linux 任务计划,周期性任务执行
未来的某个时间点执行一次某任务的命令:at,batch 命令执行的结果,会发送到任务发起者的邮箱 周期性运行某任务:crontab 命令执行的结果,会发送到任务发起者的邮箱 本地邮件服务 发邮件的协议 ...
- 浅析设计模式之mvc、mvp、mvvm
mvc.mvvm.mvp是常见的设计模式,也是常见的设计思想,现对它们进行简要的归纳总结 三种模式的介绍 1.MVC:经典设计模式 View 传送指令到 Controller(控制器) Control ...
- Your idea evaluation has expired. Your session will be limited to 30 minutes
今天打开idea,出现了上面的话,试了网上的很多办法,获取注册码的那个方法是最常见的,那个网站现在不提供注册码了. ----两种方法-----**1)把提示框的x点掉,会自动打开idea**按最开始安 ...
- VAR 学习笔记3
脉冲响应图及方差分析 当使用VAR模型的时候需要完成: 选择合适的变量 就是研究变量这个没有疑问 判断滞后阶数 根据AIC和SC准则,选择 为何做格兰杰因果检验 如果给定 \(x_t\) 的滞后阶数, ...
- CSRF防护
CSRF防护 (待完善...)
- hydra-爆破工具的使用
0x01简介 hydra 是一个支持众多协议的爆破工具,在kali上集成,但也可以在windows上下载运行: github上的源码: https://github.com/vanhauser-thc ...
- css背景颜色、背景图片,以及列表的多种样式
背景样式 • background-color 设置元素的背景颜色.• background-image 把图像设置为背景.• background-position 设置背景图像的起始位置.• ba ...
- 安装Gitlab到CentOS(YUM)
运行环境 系统版本:CentOS Linux release 7.3.1611 (Core) 软件版本:Gitlab-ce-11.10.1 硬件要求:最低2核4GB,建议4核8GB 安装过程 1.安装 ...
- 数字孪生 VS 平行系统
数字孪生和平行系统作为新兴技术,在解决当今人工智能邻域面临的信息量大,干扰信息不确定因素多,与人的参与沟通更加紧密,人机互动更加重视,为了使人们有更好的体验人工智能带来的便利,急需推动信息物理社会的高 ...
- 解决Mac无法写入U盘问题
注:本文出自博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 本文源链接:https://www.cnblogs.com/chloneda/p/upan-to- ...