9 Data Dictionary and Dynamic Performance Views(9 数据字典与动态性能视图)

本章概述数据字典和动态性能视图,包含以下主题:

  • Overview of the Data Dictionary(数据字典概述)
  • Overview of the Dynamic Performance Views(动态性能视图概述)
  • Database Object Metadata(数据库对象元数据)

Overview of the Data Dictionary(数据字典概述)

每个 Oracle 数据库中都有一组核心的只读参考表和视图,统称为数据字典。数据字典是一个只读表集合,提供有关数据库的管理元数据。

  • Purpose of the Data Dictionary(数据字典的目的)
    数据字典包含描述数据库内容的元数据。
  • Data Dictionary Components(数据字典组件)
    数据字典由基表和视图组成。
  • How the Data Dictionary Works(数据字典如何工作)
    Oracle AI Database 用户账户 SYS 拥有数据字典的所有基表和用户可访问的视图。
  • Data Dictionary Storage(数据字典存储)
    存储整个 CDB 元数据的数据字典仅存储在系统表空间中。

Purpose of the Data Dictionary(数据字典的目的)

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

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

  • 数据库中每个模式对象的定义,包括列的默认值和完整性约束信息
  • 为模式对象分配的空间量以及当前使用的空间量
  • Oracle AI Database 用户的名称、授予用户的权限和角色,以及与用户相关的审计信息

Data Management(数据管理)

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

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

  • 访问数据字典以查找关于用户、模式对象和存储结构的信息
  • 每次发出 DDL 语句时修改数据字典

由于 Oracle AI Database 将数据字典数据存储在表中,就像其他数据一样,用户可以使用 SQL 查询这些数据。例如,用户可以运行 SELECT 语句来确定他们的权限、他们模式中存在哪些表、这些表中包含哪些列、是否在这些列上建立了索引等等。

另请参见:

  • “Introduction to Schema Objects ”(模式对象简介)
  • 《Oracle AI Database Security Guide》(《Oracle AI Database 安全指南》),了解用户账户
  • “Data Definition Language (DDL) Statements ”(数据定义语言(DDL)语句)

Data Dictionary Separation in a CDB(CDB 中的数据字典分离)

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

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

Figure 9-1 Data Dictionary Metadata in the CDB Root(图 9-1 CDB 根容器中的数据字典元数据)

假设您创建了一个 PDB,然后在该 PDB 中创建了一个 hr 模式,其中包含 employees 和 departments 表。PDB 中的数据字典包含一些描述 Oracle 提供的实体的行,以及其他描述用户创建的实体的行。例如,PDB 字典中的 TAB$ 表为 employees 表和 departments 表各有一行元数据。

Figure 9-2 Data Dictionary Architecture in a CDB(图 9-2 CDB 中的数据字典架构)

上述图形显示 PDB 中的数据字典包含指向 CDB 根容器数据字典的指针。在内部,Oracle 提供的对象(如数据字典表定义和 PL/SQL 包)在 CDB 根容器中仅表示一次。这种架构在 CDB 中实现了两个主要目标:

  • 减少重复
    例如,CDB 不会在每个 PDB 中存储 DBMS_ADVISOR PL/SQL 包的源代码,而是仅将代码存储在 CDB$ROOT 中一次,从而节省磁盘空间。
  • 易于数据库升级
    如果数据字典表的定义在每个 PDB 中都存在,并且如果在新版本中该定义发生变化,则需要单独升级每个 PDB 以捕获更改。将表定义仅存储在 CDB 根容器中一次即可消除此问题。

Data Dictionary Components(数据字典组件)

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

这些对象的定义如下:

  • 基表
    这些表存储有关数据库的信息。只有 Oracle AI Database 应该对这些表进行读写。用户很少直接访问基表,因为它们是规范化的,并且大多数数据以加密格式存储。
  • 视图
    这些视图通过使用连接和 WHERE 子句对基表数据进行解码,以提供有用的信息,例如用户或表名。视图包含数据字典中所有对象的名称和描述。某些视图可供所有数据库用户访问,而其他视图仅供管理员使用。

通常,数据字典视图以集的形式分组。在许多情况下,一个集由三个视图组成,它们包含相似的信息,并通过前缀进行区分,如下表所示。通过查询适当的视图,您可以访问仅与您相关的信息。

Table 9-1 Data Dictionary View Sets(表 9-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
.
.
.
Container Data Objects in a CDB(CDB 中的容器数据对象)

容器数据对象是包含与多个容器或整个 CDB 相关的数据的表或视图。

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

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

Table 9-2 Container ID Values(表 9-2 容器 ID 值)

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

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

Figure 9-3 Dictionary Views in a CDB(图 9-3 CDB 中的字典视图)

  • CDB_:CDB 中跨所有 PDB 的所有对象
  • DBA_:容器或 PDB 中的所有对象
  • ALL_:当前用户可访问的对象
  • USER_:当前用户拥有的对象

当当前容器是 PDB 时,用户只能查看当前 PDB 的数据字典信息。但是,当当前容器是 CDB 根容器时,公用用户可以查询 CDB_ 视图来查看 CDB 根容器以及该用户有权访问的 PDB 的元数据。

注意:从 CDB 根容器查询时,CDB_ 和 V$ 视图会隐式将数据转换为 AL32UTF8 字符集。如果某个字符集在转换为 AL32UTF8 时需要更多字节来表示一个字符,并且视图列的宽度无法容纳来自特定 PDB 的数据,则可能发生数据截断。

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

Table 9-3 Querying CDB_ Views(表 9-3 查询 CDB_ 视图)

操作 描述
SQL> CONNECT SYSTEM
Enter password: ********
Connected.
在所有容器中公用的 SYSTEM 用户连接到 CDB 根容器(请参阅“ Common User Accounts ”)。
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。输出显示当前容器(即 hrpdb)中有 48 个公用和本地用户。
SQL> SELECT COUNT(*) FROM DBA_USERS;
COUNT(*)
----------
48
SYSTEM 查询 DBA_USERS。输出与前一个查询相同。由于 SYSTEM 未连接到 CDB 根容器,DBA_USERS 视图显示与 CDB_USERS 相同的输出。由于 DBA_USERS 仅显示当前容器中的用户,因此显示 48。
Views with the Prefix DBA_(前缀为 DBA_ 的视图)

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

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

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

另请参见:
《Oracle AI Database Administrator’s Guide》(《Oracle AI Database 管理员指南》),了解有关管理权限的详细信息。

Views with the Prefix ALL_(前缀为 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_ 视图时,应注意角色的影响,因为在存储过程中角色默认不启用。

Views with the Prefix USER_(前缀为 USER_ 的视图)

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

这些视图:

  • 引用用户在数据库中的私有环境,包括用户创建的模式对象的元数据、用户进行的授权等
  • 仅显示与用户相关的行,返回 ALL_ 视图中的信息子集
  • 具有与其他视图相同的列,但隐含了 OWNER 列
  • 为了方便,可能具有缩写的 PUBLIC 同义词

例如,以下查询返回您模式中包含的所有对象:

SELECT OBJECT_NAME, OBJECT_TYPE 
FROM   USER_OBJECTS
ORDER BY OBJECT_NAME;
The DUAL Table(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》(《Oracle AI Database SQL 语言参考》),了解有关 DUAL 表的更多信息。

How the Data Dictionary Works(数据字典如何工作)

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

在数据库操作期间,Oracle AI Database 读取数据字典以确认模式对象存在,并且用户具有适当的访问权限。Oracle AI Database 会不断更新数据字典,以反映数据库结构、审计、授权和数据方面的更改。

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

数据字典基表中的数据对于 Oracle AI Database 的正常运行至关重要。只有 Oracle AI Database 才能写入或更改数据字典信息。任何 Oracle AI Database 用户都不应更改 SYS 模式中包含的行或模式对象,因为此类活动可能会损害数据完整性。安全管理员必须严格控制此核心账户。

警告:更改或操作数据字典表中的数据可能会永久性地、有害地影响数据库操作。

  • Metadata and Data Links(元数据和数据链接)
  • Public Synonyms for Data Dictionary Views(数据字典视图的公用同义词)
  • Data Dictionary Cache(数据字典高速缓存)
  • Other Programs and the Data Dictionary(其他程序与数据字典)

另请参见:
“SYS and SYSTEM Accounts ”(SYS 与 SYSTEM 账户)

Metadata and Data Links(元数据和数据链接)

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

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

  • 元数据链接
    Oracle AI Database 仅将关于字典对象的元数据存储在 CDB 根容器中。例如,作为 DBA_OBJECTS 数据字典视图基础的 OBJ$ 字典表的列定义仅存在于 CDB 根容器中。如图 9-2 所示,每个 PDB 中的 OBJ$ 表使用一种称为元数据链接的内部机制指向存储在 CDB 根容器中的 OBJ$ 定义。

    与元数据链接对应的数据驻留在其 PDB 中,而不是 CDB 根容器中。例如,如果您在 hrpdb 中创建表 mytable 并向其中添加行,则这些行存储在 PDB 数据文件中,而不是 CDB 根容器数据文件中。

    PDB 和 CDB 根容器中的数据字典视图包含不同的行。例如,在 hrpdb 的 OBJ$ 表中存在一个新的描述 mytable 的行,但在 CDB 根容器的 OBJ$ 表中则不存在。因此,在 CDB 根容器中查询 DBA_OBJECTS 和在 hrpdb 中查询 DBA_OBJECTS 会显示不同的结果。

  • 数据链接

    注意:在 Oracle Database 12c 第 1 版 (12.1.0.2) 中,数据链接被称为对象链接

    在某些情况下,Oracle AI Database 仅为某个对象存储一次数据(而不仅仅是元数据),存储在应用程序容器的应用程序根容器中。设想一家电子商务公司,为不同地区设有不同的 PDB。应用程序根容器可能存储一个名为 postal_codes 的表,其中列出了所有美国邮政编码。此容器中的每个应用程序 PDB 都需要访问公共的 postal_codes 表。

    应用程序 PDB 使用一种称为数据链接的内部机制引用应用程序根容器中的对象。创建数据链接的应用程序 PDB 还存储数据链接描述。数据链接继承其引用对象的数据类型。

  • 扩展数据链接
    扩展数据链接是数据链接和元数据链接的混合体。与数据链接类似,扩展数据链接引用应用程序根容器中的对象。但是,扩展数据链接还引用应用程序 PDB 中的相应对象。例如,一个应用程序 PDB 可能有一个扩展数据链接表,该表同时存储美国邮政编码和加拿大邮政编码。与元数据链接类似,应用程序 PDB 中的对象从应用程序根容器中的相应对象继承元数据。

    当在应用程序根容器中查询时,扩展数据链接表仅从应用程序根容器中获取行,例如,仅美国邮政编码。然而,当在应用程序 PDB 中查询时,扩展数据链接表从应用程序根容器和应用程序 PDB 中获取行,例如,美国邮政编码和加拿大邮政编码。

Oracle AI Database 自动创建并管理到 CDB$ROOT 的元数据链接和数据链接。用户不能添加、修改或删除这些链接。

另请参见:

  • “Application Common Objects ”(应用程序公共对象)
  • 《Oracle AI Database Concepts》(《Oracle AI Database 概念》),了解数据字典的概述
Public Synonyms for Data Dictionary Views(数据字典视图的公用同义词)

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

安全管理员还可以为系统范围内使用的模式对象创建额外的公用同义词。Oracle 建议不要对私有模式对象和公用同义词使用相同的名称。

另请参见:
“Overview of Synonyms ”(同义词概述)

Data Dictionary Cache(数据字典高速缓存)

由于数据库经常需要数据字典信息来验证用户访问和验证模式对象的状态,因此大部分数据字典信息都位于数据字典高速缓存中。

高速缓存通常包含解析信息。描述表和列的 COMMENTS 列不缓存在字典高速缓存中,但可能会缓存在数据库缓冲区高速缓存中。

另请参见:
“Data Dictionary Cache ”(数据字典高速缓存)

Other Programs and the Data Dictionary(其他程序与数据字典)

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

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

Data Dictionary Storage(数据字典存储)

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

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

另请参见:
“The SYSTEM Tablespace ”(SYSTEM 表空间),了解有关 SYSTEM 表空间的更多信息。

Overview of the Dynamic Performance Views(动态性能视图概述)

在运行过程中,Oracle AI Database 维护了一组记录当前数据库活动的虚拟表。

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

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

  • 系统和会话参数
  • 内存使用和分配
  • 文件状态(包括 RMAN 备份文件)
  • 作业和任务的进度
  • SQL 执行
  • 统计信息和指标

动态性能视图的主要用途如下:

  • Oracle Enterprise Manager 使用这些视图来获取有关数据库的信息。

  • 管理员可以使用这些视图进行性能监控和调试。

  • Contents of the Dynamic Performance Views(动态性能视图的内容)

  • Storage of the Dynamic Performance Views(动态性能视图的存储)

另请参见:
《Oracle AI Database Reference》(《Oracle AI Database 参考》),了解动态性能视图的完整列表。

Contents of the Dynamic Performance Views(动态性能视图的内容)

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

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

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

当您使用 Database Configuration Assistant (DBCA) 创建数据库时,Oracle 会自动创建数据字典。Oracle AI Database 会自动运行 catalog.sql 脚本,该脚本包含动态性能视图的视图定义和公用同义词。您必须运行 catalog.sql 来创建这些视图和同义词。

另请参见:

  • 《Oracle AI Database Administrator’s Guide》(《Oracle AI Database 管理员指南》),了解如何手动运行 catalog.sql
  • 《Oracle Real Application Clusters Administration and Deployment Guide》(《Oracle Real Application Clusters 管理和部署指南》),了解在 Oracle RAC 中使用性能视图的信息

Storage of the Dynamic Performance Views(动态性能视图的存储)

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

这些视图不是存储在数据库中的传统表。由于数据是动态更新的,因此无法保证视图的读取一致性。

由于动态性能视图不是真实的表,因此其数据取决于数据库和数据库实例的状态。例如,您可以在数据库启动但未装载时查询 VINSTANCE和VINSTANCE 和 VINSTANCEVBGPROCESS。但是,直到数据库装载后,您才能查询 V$DATAFILE。

另请参见:
“Data Concurrency and Consistency ”(数据并发与一致性)

Database Object Metadata(数据库对象元数据)

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》(《Oracle AI Database PL/SQL 包和类型参考》),了解有关 DBMS_METADATA 的更多信息。
  • 《Oracle AI Database PL/SQL Packages and Types Reference》(《Oracle AI Database PL/SQL 包和类型参考》),了解有关 DBMS_DEVELOPER.GET_METADATA 的更多信息。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐