面试宝典:介绍下Oracle数据库动态性能视图 V$PDB_INCARNATION

在这里插入图片描述
好的,我们来对 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. 使用场景

  1. PDB的时间点恢复(PITR)
    当需要将PDB恢复到过去的某个时间点(SCN或时间戳)时,必须确定要恢复到的目标时间点属于哪个PDB化身。恢复操作必须在正确的化身分支中进行。此视图可以帮助你找到正确的化身路径。

  2. PDB闪回
    闪回PDB到某个还原点(Restore Point)或SCN在底层也是通过化身来实现的。此视图可以确认闪回操作后创建的新化身。

  3. 诊断与故障排查
    当遇到ORA-600 [3020](“在恢复中检测到分裂重置日志”)之类的错误时,通常意味着恢复进程尝试应用的错误化身的重做日志。通过查询此视图,可以理清化身的演变历史,找到正确的恢复路径。

  4. 确认当前PDB化身
    检查PDB当前所处的化身状态、创建时间以及重置SCN。


3. 字段含义详解

以下是 V$PDB_INCARNATION 视图中各个字段的详细说明:

字段名数据类型含义说明
PDB_INCARNATION#NUMBERPDB化身的唯一标识号。这是主键,每次RESETLOGS操作都会递增。
PDB_NAMEVARCHAR2(128)PDB的名称。
PDB_GUIDRAW(16)PDB的全局唯一标识符(GUID)。
STATUSVARCHAR2(20)化身的当前状态。有效值:
- CURRENT:PDB当前正在使用的化身。
- PARENT:这是一个父化身,已有后代化身从其分支出来。
- ORPHAN:一个已被废弃的化身(例如,在闪回数据库后,旧的化身分支会被标记为ORPHAN)。
- RESETLOGS:化身是在RESETLOGS操作时创建的初始记录。
INCARNATION_SCNNUMBER创建此化身时的SCN(系统更改号)。即执行RESETLOGS操作时的SCN。
INCARNATION_TIMEDATE创建此化身时的时间戳。即执行RESETLOGS操作时的时间。
RESETLOGS_SCNNUMBER此化身分支的起始重设SCN。对于大多数情况,这与INCARNATION_SCN相同。在复杂的恢复场景中,它可能指向分支开始的更早的SCN。
RESETLOGS_TIMEDATE此化身分支的起始重设时间。通常与INCARNATION_TIME相同。
PRIOR_INCARNATION#NUMBER此化身的父化身的PDB_INCARNATION#。通过这个字段可以构建出化身的完整谱系树。
FLASHBACK_DATABASE_ALLOWEDVARCHAR2(3)指示是否允许对此化身执行闪回数据库操作。值为YESNO
CON_IDNUMBER包含此化身的容器的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 记录整个CDBRESETLOGS历史。
  • V$PDB_INCARNATION 记录单个PDBRESETLOGS历史。
  • 一个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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值