
好的,我们来对 Oracle 19C 数据库中的 V$PDB_INCARNATION 动态性能视图进行一次全面、深入的解析。
1. 作用与概述
V$PDB_INCARNATION 视图的主要作用是追踪和展示可插拔数据库(PDB)的化身(Incarnation)历史。
核心概念:PDB化身(Incarnation)
一个PDB化身代表了PDB在某个时间点的特定“身份”或“版本”。每当对PDB进行RESETLOGS操作(这是打开PDB时最常遇到的情况)后,Oracle就会为该PDB创建一个新的化身。这个操作会重置重做日志序列号(从1重新开始),并创建一个新的日志线程,标志着PDB进入了一个新的、独立的重做流时代。
简单来说:V$PDB_INCARNATION 就像PDB的“人生履历表”,记录着它每一次“重生”(RESETLOGS)的时间、SCN以及状态,这对于PDB的时间点恢复(Point-in-Time Recovery)和闪回(Flashback)操作至关重要。
2. 使用场景
-
PDB的时间点恢复(PITR):
当需要将PDB恢复到过去的某个时间点(SCN或时间戳)时,必须确定要恢复到的目标时间点属于哪个PDB化身。恢复操作必须在正确的化身分支中进行。此视图可以帮助你找到正确的化身路径。 -
PDB闪回:
闪回PDB到某个还原点(Restore Point)或SCN在底层也是通过化身来实现的。此视图可以确认闪回操作后创建的新化身。 -
诊断与故障排查:
当遇到ORA-600 [3020](“在恢复中检测到分裂重置日志”)之类的错误时,通常意味着恢复进程尝试应用的错误化身的重做日志。通过查询此视图,可以理清化身的演变历史,找到正确的恢复路径。 -
确认当前PDB化身:
检查PDB当前所处的化身状态、创建时间以及重置SCN。
3. 字段含义详解
以下是 V$PDB_INCARNATION 视图中各个字段的详细说明:
| 字段名 | 数据类型 | 含义说明 |
|---|---|---|
| PDB_INCARNATION# | NUMBER | PDB化身的唯一标识号。这是主键,每次RESETLOGS操作都会递增。 |
| PDB_NAME | VARCHAR2(128) | PDB的名称。 |
| PDB_GUID | RAW(16) | PDB的全局唯一标识符(GUID)。 |
| STATUS | VARCHAR2(20) | 化身的当前状态。有效值: - CURRENT:PDB当前正在使用的化身。- PARENT:这是一个父化身,已有后代化身从其分支出来。- ORPHAN:一个已被废弃的化身(例如,在闪回数据库后,旧的化身分支会被标记为ORPHAN)。- RESETLOGS:化身是在RESETLOGS操作时创建的初始记录。 |
| INCARNATION_SCN | NUMBER | 创建此化身时的SCN(系统更改号)。即执行RESETLOGS操作时的SCN。 |
| INCARNATION_TIME | DATE | 创建此化身时的时间戳。即执行RESETLOGS操作时的时间。 |
| RESETLOGS_SCN | NUMBER | 此化身分支的起始重设SCN。对于大多数情况,这与INCARNATION_SCN相同。在复杂的恢复场景中,它可能指向分支开始的更早的SCN。 |
| RESETLOGS_TIME | DATE | 此化身分支的起始重设时间。通常与INCARNATION_TIME相同。 |
| PRIOR_INCARNATION# | NUMBER | 此化身的父化身的PDB_INCARNATION#。通过这个字段可以构建出化身的完整谱系树。 |
| FLASHBACK_DATABASE_ALLOWED | VARCHAR2(3) | 指示是否允许对此化身执行闪回数据库操作。值为YES或NO。 |
| CON_ID | NUMBER | 包含此化身的容器的ID。对于PDB化身,此值即为该PDB的CON_ID。 |
4. 相关视图与基表
-
相关动态性能视图:
V$DATABASE_INCARNATION:用于追踪整个CDB(根容器)的化身历史。这是CDB级别的化身视图,与V$PDB_INCARNATION非常相似但作用范围不同。这是最重要的相关视图。V$PDBS:显示当前所有PDB的状态信息,可以连接CON_ID来获取更多信息。V$CONTAINERS:显示所有可插拔数据库的基本信息。
-
底层基表:
动态性能视图(如V$开头的视图)通常不是直接基于普通的基表,而是源自内存中的X表(动态性能基础表),这些表是Oracle内部实现的一部分。‘V表(动态性能基础表),这些表是Oracle内部实现的一部分。 `V表(动态性能基础表),这些表是Oracle内部实现的一部分。‘VPDB_INCARNATION的信息最终来源于控制文件(Control File)和数据库的重做日志。每次RESETLOGS`操作都会在控制文件中记录一个新的化身条目。
5. 详细原理与知识点
1. 化身与RESETLOGS操作:
当以RESETLOGS方式打开一个PDB时(例如,在ALTER PLUGGABLE DATABASE OPEN RESETLOGS;之后),Oracle会执行以下操作:
- 将当前重做日志序列号重置为1。
- 为PDB创建一个新的重做日志线程。
- 在控制文件中创建一个新的PDB化身记录,其
PDB_INCARNATION#递增,STATUS设置为CURRENT,并将之前的化身标记为PARENT。 - 记录下此刻的SCN(
INCARNATION_SCN)和时间(INCARNATION_TIME)。
2. 化身分支(Branching):
PDB的恢复不一定总是沿着一条直线进行。你可以从一个旧的父化身分支出来,恢复到某个时间点,然后从这个点开启一个新的化身分支。PRIOR_INCARNATION#和RESETLOGS_SCN字段正是用来描述这种分支关系的。
3. 与CDB化身的区别:
这是关键知识点:CDB和其内部的PDB有各自独立的化身历史。
V$DATABASE_INCARNATION记录整个CDB的RESETLOGS历史。V$PDB_INCARNATION记录单个PDB的RESETLOGS历史。- 一个CDB化身期间,其内部的PDB可能经历了多次自身的化身变化。PDB的化身操作(如闪回)不会影响CDB的化身,反之亦然。
4. 恢复过程中的作用:
当使用RECOVER ... UNTIL SCN ...对PDB进行时间点恢复时,恢复进程会:
a) 确定目标SCN属于哪个PDB化身。
b) 从当前化身开始,沿着PRIOR_INCARNATION#指针回溯,找到正确的化身分支。
c) 仅应用该化身分支内、且小于等于目标SCN的重做日志文件。
如果尝试应用错误化身的重做日志(序列号可能相同但内容不同),恢复就会失败并报错。
6. 常用查询SQL
1. 查询当前CDB中所有PDB的化身历史:
SELECT CON_ID, PDB_INCARNATION#, PDB_NAME, STATUS,
INCARNATION_SCN, TO_CHAR(INCARNATION_TIME, 'YYYY-MM-DD HH24:MI:SS') AS INCARNATION_TIME,
PRIOR_INCARNATION#
FROM V$PDB_INCARNATION
ORDER BY CON_ID, PDB_INCARNATION#;
2. 查询特定PDB(例如 ‘MYPDB’) 的所有化身:
SELECT PDB_INCARNATION#, STATUS, INCARNATION_SCN,
TO_CHAR(INCARNATION_TIME, 'YYYY-MM-DD HH24:MI:SS') AS INCARNATION_TIME,
PRIOR_INCARNATION#, FLASHBACK_DATABASE_ALLOWED
FROM V$PDB_INCARNATION
WHERE PDB_NAME = 'MYPDB'
ORDER BY PDB_INCARNATION#;
3. 查询当前PDB的化身信息(在PDB内部连接时查询):
SELECT PDB_INCARNATION#, STATUS, INCARNATION_SCN,
TO_CHAR(INCARNATION_TIME, 'YYYY-MM-DD HH24:MI:SS') AS INCARNATION_TIME
FROM V$PDB_INCARNATION
WHERE STATUS = 'CURRENT';
4. 结合CDB化身一起查看(在CDB$ROOT中连接查询):
这个查询展示了CDB化身和某个PDB(例如 ‘MYPDB’)化身的对应关系,非常有助于理解全局情况。
SELECT DI.INCARNATION# AS CDB_INCARNATION,
DI.STATUS AS CDB_STATUS,
DI.RESETLOGS_SCN AS CDB_RESETLOGS_SCN,
PI.PDB_NAME,
PI.PDB_INCARNATION#,
PI.STATUS AS PDB_STATUS,
PI.INCARNATION_SCN AS PDB_INCARNATION_SCN
FROM V$DATABASE_INCARNATION DI
CROSS JOIN V$PDB_INCARNATION PI
WHERE PI.PDB_NAME = 'MYPDB'
AND PI.INCARNATION_TIME BETWEEN DI.RESETLOGS_TIME AND DI.END_RESETLOGS_TIME
ORDER BY DI.INCARNATION#, PI.PDB_INCARNATION#;
总结
V$PDB_INCARNATION 是管理多租户架构下PDB恢复和闪回操作的核心视图。它精确记录了每个PDB的生命周期中的每一个“转折点”(RESETLOGS)。深入理解其内容和工作原理,对于执行成功的时间点恢复、闪回数据库以及解决复杂的恢复错误至关重要。务必记住将其与 V$DATABASE_INCARNATION 区分开来,前者针对PDB,后者针对整个CDB。
欢迎关注我的公众号《IT小Chen》
7823

被折叠的 条评论
为什么被折叠?



