数据字典和动态性能视图

每个 Oracle 数据库的只读参考表和视图的中心集统称为数据字典。动态性能视图是在数据库打开和使用期间持续更新的特殊视图。

数据字典概览

Oracle 数据库的一个重要部分是其数据字典,这是一组只读表,提供有关数据库的管理元数据。

数据字典的用途

数据字典包含描述数据库内容的元数据。

例如,数据字典包含如下信息:

数据管理

对于每个 Oracle 数据库,数据字典都是数据管理的核心部分。

例如,数据库执行以下操作:

由于 Oracle AI Database 像其他数据一样将数据字典数据存储在表中,因此用户可以使用 SQL 查询数据。例如,用户可以运行 SELECT 语句来确定其权限、其方案中存在哪些表、这些表中的哪些列、是否基于这些列构建索引等。

另请参见:

CDB 中的数据字典分隔

在 CDB 中,数据字典元数据在 CDB 根和 PDB 之间进行拆分。从用户和应用程序角度看,CDB 中每个容器中的数据字典是分开的。

在新创建的尚未包含用户数据的 CDB 中,CDB 根中的数据字典仅包含系统元数据。例如,TAB$ 表包含仅描述 Oracle 提供的表的行,例如 TRIGGER$ 和 SERVICE$。下图描述了三个底层数据字典表,红色条表示描述系统的行。

图 1:CDB 根中的数据字典元数据

插图 cncpt_vm_363.png 的说明

假设创建 PDB,然后创建包含此 PDB 中 employees 和 departments 表的 hr 方案。PDB 中的数据字典包含一些描述 Oracle 提供的实体的行,以及描述用户创建的实体的其他行。例如,PDB 字典中的 TAB$ 表包含一行 employees 表的元数据,以及一行 departments 表。

图 2:CDB 中的数据字典体系结构

插图 cncpt_vm_361.png 的说明

上图显示了 PDB 中的数据字典包含指向 CDB 根中数据字典的指针。在内部,Oracle 提供的对象(例如数据字典表定义和 PL/SQL 程序包)仅在 CDB 根中表示一次。此体系结构在 CDB 中实现了两个主要目标:

数据字典组件

数据字典由基表和视图组成。

这些对象的定义如下:

通常,数据字典视图按集合分组。在许多情况下,一个集合由包含相似信息的三个视图组成,各个视图通过前缀彼此进行区分,如下表中所示。通过查询适当的视图,您只能访问与您相关的信息。

表 1 数据字典视图集

前缀 用户权限 内容 注释
DBA_ 数据库管理人员 全部对象 某些 DBA_ 视图具有其他列,其中包含对管理员有用的信息。
ALL_ 所有用户 用户具有权限的对象 包括用户拥有的对象。这些视图遵循当前启用的角色集。
USER_ 所有用户 用户拥有的对象 前缀为 USER_ 的视图通常不包括列 OWNER。此列在 USER_ 视图中暗示为发出查询的用户。

并非所有视图集都具有三个成员。例如,数据字典包含 DBA_LOCK 视图,但没有 ALL_LOCK 视图。

系统提供的 DICTIONARY 视图包含所有数据字典视图的名称和缩写说明。此视图的以下查询包括部分示例输出:

SQL> SELECT * FROM DICTIONARY
  2  ORDER BY TABLE_NAME;

TABLE_NAME                     COMMENTS
------------------------------ ----------------------------------------
ALL_ALL_TABLES                 Description of all object and relational
                               tables accessible to the user

ALL_APPLY                      Details about each apply process that
                               dequeues from the queue visible to the
                               current user
.
.
.

另请参见:

CDB 中的容器数据对象

容器数据对象是一个表或视图,其中包含与多个容器或整个 CDB 有关的数据。

容器数据权限支持一般要求,即多个 PDB 驻留在单个 CDB 中,但具有不同的本地管理要求。例如,如果应用程序 DBA 不想在本地进行管理,则他们可以向公用用户授予对相应视图的容器数据权限。在这种情况下,CDB 管理员可以访问这些 PDB 的数据。相反,不希望 CDB 管理员访问其数据的 PDB 管理员不会授予容器数据权限。

容器数据对象的示例是 Oracle 提供的视图,其名称以 V$ 和 CDB_ 开头。所有容器数据对象都具有 CON_ID 列。下表显示了此列值的含义。

表 2 容器 ID 值

容器标识 行与
0 整个 CDB
1 CDB$ROOT
2 PDB$SEED
所有其他 ID 用户创建的 PDB、应用程序根或应用程序种子

在 CDB 中,对于每个 DBA_ 视图,都存在对应的 CDB_ 视图。CDB_ 视图的所有者是相应 DBA_ 视图的所有者。下图显示了不同类别的字典视图之间的关系:

图 3:CDB 中的字典视图

插图 cncpt_vm_366.png 的说明

当当前容器为 PDB 时,用户只能查看当前 PDB 的数据字典信息。但是,当当前容器是 CDB 根时,公用用户可以查询 CDB_ 视图来查看 CDB 根的元数据以及此用户有权访问的 PDB 的元数据。注:从 CDB 根查询时,CDB_ 和 V$ 视图会隐式将数据转换为 AL32UTF8 字符集。如果将字符集转换为 AL32UTF8 时需要更多字节来表示字符,并且视图列宽度无法容纳来自特定 PDB 的数据,则可以截断数据。

下表介绍了 CDB_ 视图的查询。每一行描述在前一行中的操作之后发生的操作。

表 3 查询 CDB_ 视图

操作 说明
SQL> CONNECT SYSTEM
 Enter password: ********
 Connected.

CDB 中所有容器共有的 SYSTEM 用户连接到 CDB 根(请参阅“公用用户帐户”)。

SQL> SELECT COUNT(*) FROM CDB_USERS
  WHERE CON_ID=1;

  COUNT(*)
 --------
 38
SYSTEM 查询 CDB_USERS 以获取 CDB 根中的公用用户数。输出表明 CDB 根中存在 38 个公用用户。
SQL> SELECT COUNT(DISTINCT(CON_ID))
  FROM CDB_USERS;

  COUNT(DISTINCT(CON_ID))
 -----------------------
 4
SYSTEM 查询 CDB_USERS 以确定 CDB 中不同容器的数量。
SQL> CONNECT SYSTEM@hrdb
 Enter password: ********
 Connected.
SYSTEM 用户现在连接到名为 hrpdb 的 PDB。
SQL> SELECT COUNT(*) FROM CDB_USERS;

  COUNT(*)
 ----------
 48
SYSTEM 查询 CDB_USERS。输出表明当前容器中存在 48 个公用用户和本地用户,即 hrpdb。
SQL> SELECT COUNT(*) FROM DBA_USERS;

  COUNT(*)
 ----------
 48
SYSTEM 查询 DBA_USERS。输出与上一个查询相同。由于 SYSTEM 未连接到 CDB 根,因此 DBA_USERS 视图显示与 CDB_USERS 相同的输出。由于 DBA_USERS 仅显示 current 容器中的用户,因此显示 48 个。

带有前缀 DBA_ 的视图

前缀为 DBA_ 的视图显示整个数据库中的所有相关信息。DBA_ 视图仅供管理员使用。

以下示例查询显示有关数据库中的所有对象的信息:

SELECT OWNER, OBJECT_NAME, OBJECT_TYPE
FROM   DBA_OBJECTS
ORDER BY OWNER, OBJECT_NAME;

另请参阅:Oracle AI Database Administrator’s Guide,了解有关管理权限的详细信息

带有前缀 ALL_ 的视图

前缀为 ALL_ 的视图指用户对数据库的整体视角。

除了用户拥有的方案对象外,这些视图还返回有关用户可以通过公共或显式授予权限和角色来访问的方案对象的信息。

例如,以下查询将返回有关您有权访问的所有对象的信息:

SELECT OWNER, OBJECT_NAME, OBJECT_TYPE
FROM   ALL_OBJECTS
ORDER BY OWNER, OBJECT_NAME;

由于 ALL_ 视图遵循当前启用的角色集,因此查询结果取决于启用的角色,如以下示例中所示:

SQL> SET ROLE ALL;

Role set.

SQL> SELECT COUNT(*) FROM ALL_OBJECTS;

COUNT(*)
----------
68295

SQL> SET ROLE NONE;

Role set.

SQL> SELECT COUNT(*) FROM ALL_OBJECTS;

COUNT(*)
----------
53771

应用程序开发人员在存储过程中使用 ALL_ 视图时应了解角色的影响,默认情况下不会启用角色。

带有前缀 USER_ 的视图

典型数据库用户最感兴趣的视图是前缀为 USER_ 的视图。

这些视图:

例如,以下查询将返回方案中包含的所有对象:

SELECT OBJECT_NAME, OBJECT_TYPE
FROM   USER_OBJECTS
ORDER BY OBJECT_NAME;

DUAL 表

DUAL 是数据字典中的一个小表,Oracle AI Database 和用户编写的程序可以引用该表来保证已知结果。

当一个值必须仅返回一次(例如,当前日期和时间)时,dual 表非常有用。所有数据库用户都可以访问 DUAL。

DUAL 表具有一个名为 DUMMY 的列,一个包含值 X 的行。以下示例查询 DUAL 以执行算术运算:

SQL> SELECT ((3*4)+5)/3 FROM DUAL;

((3*4)+5)/3
-----------
 5.66666667

另请参阅: Oracle AI Database SQL Language Reference,了解有关 DUAL 表的更多信息

数据字典的工作原理

Oracle AI Database 用户帐户 SYS 拥有所有基表以及用户可访问的数据字典视图。

在数据库操作期间,Oracle AI Database 会读取数据字典,以确定方案对象是否存在以及用户是否具有适当的访问权限。Oracle AI Database 会持续更新数据字典,以反映数据库结构、审计、授权和数据方面的更改。

例如,如果用户 hr 创建了一个名为 interns 的表,则数据库会向数据字典中添加新行,以反映新表、列、段、区以及 hr 对该表具有的权限。下次查询字典视图时,可以看到此新信息。

数据字典的基表中的数据对于 Oracle AI Database 发挥作用是必需的。只有 Oracle AI Database 才应写入或更改数据字典信息。任何 Oracle AI Database 用户都不应更改 SYS 方案中包含任何行或模式对象,因为此类活动会破坏数据完整性。安全管理员必须严格控制此类重要帐户。

警告:更改或处理数据字典表中的数据可能会永久且不利地影响数据库操作。

元数据和数据链接

CDB 使用内部链接机制来分隔数据字典信息。

具体而言,Oracle AI Database 使用以下自动管理的指针:

Oracle AI Database 会自动创建和管理指向 CDB$ROOT 的元数据和数据链接。用户无法添加、修改或删除这些链接。

另请参见:

数据字典视图的公共同义词

Oracle AI Database 为许多数据字典视图创建公共同义词,以便用户可以方便地访问它们。

安全管理员还可以为系统范围使用的方案对象创建其他公共同义词。Oracle 建议不要对专用方案对象和公共同义词使用相同的名称。

另请参阅:“同义词概述”

数据字典高速缓存

大部分数据字典信息都位于数据字典高速缓存中,因为数据库始终需要这些信息来验证用户访问和验证方案对象的状态。

高速缓存通常包含语法分析信息。描述表及其列的 COMMENTS 列不会缓存到字典高速缓存中,但可以缓存到数据库缓冲区高速缓存中。

另请参阅:“数据字典高速缓存”

其他程序和数据字典

其他 Oracle AI Database 产品可以引用现有视图并创建其他数据字典表或自己的视图。

Oracle 建议编写引用数据字典的程序的应用程序开发人员使用公共同义词,而不是底层表。同义词在发行版之间不太可能更改。

数据字典存储

将 CDB 元数据整体存储的数据字典仅存储在系统表空间中。

存储特定 PDB 元数据的数据字典存储在专用于此 PDB 的自包含表空间中。PDB 表空间包含应用程序后端的数据和元数据。因此,每组数据字典表都存储在自己的专用表空间集中。

另请参阅:“ SYSTEM 表空间”了解有关 SYSTEM 表空间的更多信息

动态性能视图概览

在整个操作过程中,Oracle AI Database 会维护一组记录当前数据库活动的虚拟表。

这些视图是动态的,因为它们在数据库打开和使用期间会不断更新。这些视图有时称为 V$ 视图,因为其名称以 V$ 开头。

动态性能视图包含如下信息:

动态性能视图具有以下主要用途:

动态性能视图的内容

动态性能视图称为固定视图,因为数据库管理员无法更改或删除它们。但是,数据库管理员可以在表上查询和创建视图,并将对这些视图的访问权限授予其他用户。

SYS 拥有动态性能表,其名称以 V_$ 开头。将对这些表创建视图,然后使用以 V$ 为前缀的公共同义词。例如,V$DATAFILE 视图包含有关数据文件的信息。V$FIXED_TABLE 视图包含有关所有动态性能表和视图的信息。

对于几乎每个 V$ 视图,都存在对应的 GV$ 视图。在 Oracle Real Application Clusters (Oracle RAC) 中,查询 GV$ 视图将从所有限定数据库实例检索 V$ 视图信息。

使用数据库配置辅助程序 (Database Configuration Assistant,DBCA) 创建数据库时,Oracle 会自动创建数据字典。Oracle AI Database 会自动运行 catalog.sql 脚本,其中包含动态性能视图的视图定义和公共同义词。必须运行 catalog.sql 才能创建这些视图和同义词。

另请参见:

动态性能视图的存储

动态性能视图基于基于数据库内存结构构建的虚拟表。

视图不是数据库中存储的常规表。无法保证视图的读取一致性,因为数据是动态更新的。

由于动态性能视图不是真表,因此数据取决于数据库和数据库实例的状态。例如,可以在数据库启动但未挂载时查询 V$INSTANCE 和 V$BGPROCESS。但是,在装载数据库之前,无法查询 V$DATAFILE。

另请参阅:“数据并发性和一致性”

数据库对象元数据

DBMS_METADATA 软件包和 DBMS_DEVELOPER.GET_METADATA 函数提供了用于提取数据库对象的完整定义的接口。

使用 DBMS_METADATA 程序包,定义可以表示为 XML 或 SQL DDL。Oracle AI Database 提供了两种样式的界面:用于编程控制的灵活、复杂的界面,以及用于即席查询的简化界面。

使用 DBMS_DEVELOPER.GET_METADATA 函数,对象元数据将作为 JSON 文档返回。

另请参阅:《Oracle AI Database PL/SQL Packages and Types Reference 》,了解有关 DBMS_METADATA 的更多信息。《Oracle AI Database PL/SQL Packages and Types Reference 》,了解有关 DBMS_DEVELOPER.GET_METADATA 的更多信息。