Oracle官方文档翻译《Database Concepts 23ai》第9章-数据字典与动态性能视图
Oracle官方文档翻译《Database Concepts 23ai》第9章-数据字典与动态性能视图
9 Data Dictionary and Dynamic Performance Views(数据字典与动态性能视图)
每个Oracle数据库中由只读引用表和视图组成的核心集合统称为数据字典(data dictionary)。动态性能视图(dynamic performance views) 是一类特殊视图,在数据库处于打开和使用状态时会持续更新。
Overview of the Data Dictionary(数据字典概述)
Oracle数据库的重要组成部分之一是数据字典,它是一组只读表,用于提供数据库的管理元数据。
Overview of the Dynamic Performance Views(动态性能视图概述)
在运行过程中,Oracle数据库会维护一组虚拟表,用于记录当前数据库的活动情况。
Database Object Metadata(数据库对象元数据)DBMS_METADATA
包提供了用于提取数据库对象完整定义的接口。
Overview of the Data Dictionary(数据字典概述)
Oracle数据库的重要组成部分之一是数据字典,它是一组只读表,用于提供数据库的管理元数据。
Purpose of the Data Dictionary(数据字典的用途)
数据字典包含描述数据库内容的元数据。
Data Dictionary Components(数据字典的组成)
数据字典由基表(base tables)和视图(views)组成。
How the Data Dictionary Works(数据字典的工作原理)
Oracle数据库的SYS
用户账户拥有数据字典的所有基表和用户可访问视图。
Data Dictionary Storage(数据字典的存储)
用于存储整个CDB(可插拔数据库容器)元数据的数据字典仅存储在系统表空间中。
Purpose of the Data Dictionary(数据字典的用途)
数据字典包含描述数据库内容的元数据。
例如,数据字典包含以下类型的信息:
- 数据库中每个模式对象的定义,包括列的默认值和完整性约束信息
- 为模式对象分配的空间大小以及当前使用的空间大小
- Oracle数据库用户的名称、授予用户的权限和角色,以及与用户相关的审计信息
Data Management(数据管理)
数据字典是每个Oracle数据库数据管理的核心部分。
Data Dictionary Separation in a CDB(CDB中的数据字典分离)
在CDB中,数据字典元数据在CDB根容器(CDB root)和PDB(可插拔数据库)之间拆分存储。从用户和应用程序的角度来看,CDB中每个容器的数据字典都是独立的。
Data Management(数据管理)
数据字典是每个Oracle数据库数据管理的核心部分。
例如,数据库会执行以下操作:
- 访问数据字典以获取关于用户、模式对象和存储结构的信息
- 每次执行DDL(数据定义语言)语句时,都会修改数据字典
由于Oracle数据库像存储其他数据一样,将数据字典数据存储在表中,因此用户可以使用SQL查询这些数据。例如,用户可以执行SELECT
语句来查看自己的权限、自己的模式中存在哪些表、这些表包含哪些列、是否在这些列上建立了索引等。
另请参见:
- “Introduction to Schema Objects(模式对象简介)”
- 有关用户账户的内容,请参阅《Oracle Database Security Guide》(Oracle数据库安全指南)
- “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
假设您创建了一个PDB,然后在该PDB中创建了包含employees
表和departments
表的hr
模式。该PDB的数据字典中包含一些描述Oracle提供的实体的行,以及一些描述用户创建的实体的行。例如,PDB数据字典中的TAB$
表包含一条描述employees
表的元数据行和一条描述departments
表的元数据行。
Figure 9-2 Data Dictionary Architecture in a CDB
上图显示,PDB中的数据字典包含指向CDB根容器数据字典的指针。在内部,Oracle提供的对象(如数据字典表定义和PL/SQL包)仅在CDB根容器中存储一次。这种架构在CDB中实现了两个主要目标:
- 减少重复存储:例如,无需在每个PDB中存储
DBMS_ADVISOR
PL/SQL包的源代码,CDB仅在CDB$ROOT
中存储一次该代码,从而节省磁盘空间。 - 简化数据库升级:如果每个PDB中都存在数据字典表的定义,且新版本中该定义需要更改,那么每个PDB都需要单独升级以应用此更改。而将表定义仅在CDB根容器中存储一次,可避免此问题。
Data Dictionary Components(数据字典的组成)
数据字典由基表和视图组成。
这些对象的定义如下:
-
基表(Base tables)
基表用于存储数据库相关信息。只有Oracle数据库才能对这些表执行写入和读取操作。用户很少直接访问基表,因为基表经过规范化处理,且大多数数据以难以理解的格式存储。 -
视图(Views)
视图通过连接(joins)和WHERE
子句简化信息,将基表数据转换为有用的信息(如用户名或表名)。视图包含数据字典中所有对象的名称和描述。部分视图对所有数据库用户可访问,而另一些视图则仅供管理员使用。
通常,数据字典视图会按组划分。在很多情况下,一组视图包含三个信息相似的视图,它们通过前缀区分,如下表所示。通过查询相应的视图,用户可以仅获取与自己相关的信息。
Table 9-1 Data Dictionary View Sets(表9-1 数据字典视图组)
前缀(Prefix) | 用户访问权限(User Access) | 内容(Contents) | 说明(Notes) |
---|---|---|---|
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 | 描述用户可访问的所有对象表和关系表 |
ALL_APPLY | 描述当前用户可访问的队列中每个应用进程的详细信息 |
Container Data Objects in a CDB(CDB中的容器数据对象)
容器数据对象(container data object) 是包含多个容器或整个CDB相关数据的表或视图。
前缀为DBA_的视图(Views with the Prefix DBA_)
前缀为DBA_
的视图显示整个数据库中的所有相关信息。这类视图仅供管理员使用。
前缀为ALL_的视图(Views with the Prefix ALL_)
前缀为ALL_
的视图反映用户对数据库的整体可见范围。
前缀为USER_的视图(Views with the Prefix USER_)
对于普通数据库用户而言,最可能感兴趣的是前缀为USER_
的视图。
DUAL表(The DUAL Table)DUAL
是数据字典中的一个小型表,Oracle数据库和用户编写的程序可引用该表以确保获得确定的结果。
另请参见:
- “Overview of Views(视图概述)”
- 有关数据字典视图及其列的完整列表,请参阅《Oracle Database Reference》(Oracle数据库参考)
Container Data Objects in a CDB(CDB中的容器数据对象)
容器数据对象是包含多个容器或整个CDB相关数据的表或视图。
容器数据权限满足了一个常见需求:多个PDB驻留在单个CDB中,但具有不同的本地管理需求。例如,如果应用程序DBA不希望进行本地管理,他们可以将适当视图的容器数据权限授予公共用户。在这种情况下,CDB管理员可以访问这些PDB的数据。相反,如果PDB管理员不希望CDB管理员访问其数据,则不会授予容器数据权限。
容器数据对象的示例包括Oracle提供的、名称以V$
和CDB_
开头的视图。所有容器数据对象都包含CON_ID
列。下表说明了该列取值的含义。
Table 9-2 Container ID Values(表9-2 容器ID取值说明)
容器ID(Container ID) | 行对应的对象(Rows pertain to) |
---|---|
0 | 整个CDB |
1 | CDB$ROOT(CDB根容器) |
2 | PDB$SEED(PDB种子容器) |
其他所有ID | 用户创建的PDB、应用程序根容器或应用程序种子容器 |
在CDB中,每个DBA_
视图都对应一个CDB_
视图。CDB_
视图的所有者与对应DBA_
视图的所有者相同。下图展示了不同类别数据字典视图之间的关系:
Figure 9-3 Dictionary Views in a CDB
当当前容器是PDB时,用户只能查看该PDB的数据字典信息。但当当前容器是CDB根容器时,公共用户可以查询CDB_
视图,以查看CDB根容器以及该用户具有权限的PDB的元数据。
注意:
从CDB根容器查询时,CDB_
和V$
视图会自动将数据转换为AL32UTF8
字符集。如果某个字符集的字符转换为AL32UTF8
时需要更多字节,且视图列宽度无法容纳来自特定PDB的数据,则可能会发生数据截断。
下表描述了CDB_
视图的查询过程,每行描述的操作在前行操作之后执行。
Table 9-3 Querying CDB_ Views(表9-3 查询CDB_视图)
操作(Operation) | 描述(Description) |
---|---|
SQL> CONNECT SYSTEM Enter password: ******** Connected. |
SYSTEM 用户是CDB中所有容器共有的用户,该用户连接到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; | SYSTEM 用户查询CDB_USERS 以确定CDB中不同容器的数量。 |
SQL> CONNECT SYSTEM@hrdb Enter password: ******** Connected. |
SYSTEM 用户现在连接到名为hrdb 的PDB。 |
SQL> SELECT COUNT(*) FROM CDB_USERS; COUNT(*) -------- 48 |
SYSTEM 用户查询CDB_USERS 。输出结果显示当前容器(即hrdb )中存在48个公共用户和本地用户。 |
SQL> SELECT COUNT(*) FROM DBA_USERS; COUNT(*) -------- 48 |
SYSTEM 用户查询DBA_USERS 。输出结果与上一个查询相同。由于SYSTEM 未连接到CDB根容器,DBA_USERS 视图的输出与CDB_USERS 相同。由于DBA_USERS 仅显示当前容器中的用户,因此显示48个。 |
前缀为DBA_的视图(Views with the Prefix DBA_)
前缀为DBA_
的视图显示整个数据库中的所有相关信息。这类视图仅供管理员使用。
以下示例查询显示数据库中所有对象的信息:
SELECT OWNER, OBJECT_NAME, OBJECT_TYPE
FROM DBA_OBJECTS
ORDER BY OWNER, OBJECT_NAME;
另请参见:
有关管理权限的详细信息,请参阅《Oracle Database Administrator’s Guide》(Oracle数据库管理员指南)
前缀为ALL_的视图(Views with the Prefix 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_的视图(Views with the Prefix USER_)
对于普通数据库用户而言,最可能感兴趣的是前缀为USER_
的视图。
这些视图具有以下特点:
- 反映用户在数据库中的私有环境,包括用户创建的模式对象的元数据、用户授予的权限等
- 仅显示与该用户相关的行,返回
ALL_
视图信息的子集 - 列结构与其他视图相同,但
OWNER
列默认为当前用户(不显示该列) - 为方便使用,可能存在简化的公共同义词
例如,以下查询返回您的模式中包含的所有对象:
SELECT OBJECT_NAME, OBJECT_TYPE
FROM USER_OBJECTS
ORDER BY OBJECT_NAME;
DUAL表(The DUAL Table)
DUAL
是数据字典中的一个小型表,Oracle数据库和用户编写的程序可引用该表以确保获得确定的结果。
当只需返回一个值(如当前日期和时间)时,DUAL
表非常有用。所有数据库用户都可以访问DUAL
表。
DUAL
表包含一列(名为DUMMY
)和一行(值为X
)。以下示例查询DUAL
表以执行算术运算:
SQL> SELECT ((3*4)+5)/3 FROM DUAL;
((3*4)+5)/3
-----------
5.66666667
另请参见:
有关DUAL
表的更多信息,请参阅《Oracle Database SQL Language Reference》(Oracle数据库SQL语言参考)
How the Data Dictionary Works(数据字典的工作原理)
Oracle数据库的SYS
用户账户拥有数据字典的所有基表和用户可访问视图。
在数据库运行过程中,Oracle数据库会读取数据字典,以确认模式对象存在且用户具有适当的访问权限。Oracle数据库会持续更新数据字典,以反映数据库结构、审计、权限授予和数据的变化。
例如,如果hr
用户创建了一个名为interns
的表,数据库会在数据字典中添加新行,以反映这个新表、表的列、段、区以及hr
用户对该表拥有的权限。下次查询数据字典视图时,这些新信息将可见。
数据字典基表中的数据是Oracle数据库正常运行所必需的。只有Oracle数据库才能写入或修改数据字典信息。任何Oracle数据库用户都不应修改SYS
模式中的行或模式对象,因为此类操作可能会破坏数据完整性。安全管理员必须严格控制这个核心账户。
警告(WARNING):
修改数据字典表中的数据可能会对数据库运行造成永久性的不利影响。
Metadata and Data Links(元数据链接与数据链接)
CDB使用内部链接机制来分离数据字典信息。
Public Synonyms for Data Dictionary Views(数据字典视图的公共同义词)
Oracle数据库为许多数据字典视图创建公共同义词,方便用户访问。
Data Dictionary Cache(数据字典缓存)
大部分数据字典信息存储在数据字典缓存中,因为数据库需要不断使用这些信息来验证用户访问权限和检查模式对象的状态。
Other Programs and the Data Dictionary(其他程序与数据字典)
其他Oracle数据库产品可以引用现有的视图,并创建自己的额外数据字典表或视图。
另请参见:
“SYS and SYSTEM Accounts(SYS和SYSTEM账户)”
Metadata and Data Links(元数据链接与数据链接)
CDB使用内部链接机制来分离数据字典信息。
具体而言,Oracle数据库使用以下自动管理的指针:
- 元数据链接(Metadata links)
Oracle数据库仅在CDB根容器中存储数据字典对象的元数据。例如,作为DBA_OBJECTS
数据字典视图底层表的OBJ$
字典表,其列定义仅存在于CDB根容器中。如第9-2图所示,每个PDB中的OBJ$
表使用一种名为“元数据链接”的内部机制,指向存储在CDB根容器中的OBJ$
表定义。
元数据链接对应的数据存储在其所属的PDB中,而非CDB根容器中。例如,如果您在hrpdb
中创建表mytable
并向其中添加行,这些行将存储在PDB的数据文件中,而不是CDB根容器的数据文件中。
PDB和CDB根容器中的数据字典视图包含不同的行。例如,描述mytable
的新行存在于hrpdb
的OBJ$
表中,而不存在于CDB根容器的OBJ$
表中。因此,在CDB根容器中查询DBA_OBJECTS
与在hrdpb
中查询DBA_OBJECTS
会得到不同的结果。
-
数据链接(Data links)
注意(Note):
在Oracle Database 12c Release 1 (12.1.0.2)中,数据链接(data links)被称为对象链接(object links)。
在某些情况下,Oracle数据库仅在应用程序容器的应用程序根容器中存储某个对象的数据(不仅是元数据)。例如,某电子商务公司为不同地区设置了不同的PDB,其应用程序根容器中可能存储一个名为postal_codes
的表,该表列出了所有美国邮政编码。此容器中的每个应用程序PDB都需要访问这个公共的postal_codes
表。
应用程序PDB使用一种名为“数据链接”的内部机制来引用应用程序根容器中的对象。创建数据链接的应用程序PDB也会存储该数据链接的描述。数据链接会继承其所引用对象的数据类型。 -
扩展数据链接(Extended data link)
扩展数据链接是数据链接和元数据链接的混合体。与数据链接类似,扩展数据链接引用应用程序根容器中的对象;但与元数据链接类似,扩展数据链接还会引用应用程序PDB中的对应对象。例如,某个应用程序PDB可能有一个扩展数据链接表,既存储美国邮政编码,也存储加拿大邮政编码。应用程序PDB中的对象会从应用程序根容器中的对应对象继承元数据。
在应用程序根容器中查询时,扩展数据链接表仅从应用程序根容器中获取行(例如,仅美国邮政编码);而在应用程序PDB中查询时,扩展数据链接表会从应用程序根容器和应用程序PDB中同时获取行(例如,美国邮政编码和加拿大邮政编码)。
Oracle数据库会自动创建和管理指向CDB$ROOT
的元数据链接和数据链接。用户无法添加、修改或删除这些链接。
另请参见:
“Application Common Objects(应用程序公共对象)”
有关数据字典的概述,请参阅《Oracle Database Concepts》(Oracle数据库概念)
Public Synonyms for Data Dictionary Views(数据字典视图的公共同义词)
Oracle数据库为许多数据字典视图创建公共同义词,方便用户访问。
安全管理员也可以为系统级使用的模式对象创建额外的公共同义词。Oracle建议不要将私有模式对象与公共同义词命名相同。
另请参见:
“Overview of Synonyms(同义词概述)”
Data Dictionary Cache(数据字典缓存)
大部分数据字典信息存储在数据字典缓存中,因为数据库需要不断使用这些信息来验证用户访问权限和检查模式对象的状态。
缓存中通常包含解析信息。描述表及其列的COMMENTS
列不存储在数据字典缓存中,但可能存储在数据库缓冲区缓存中。
另请参见:
“Data Dictionary Cache(数据字典缓存)”
Other Programs and the Data Dictionary(其他程序与数据字典)
其他Oracle数据库产品可以引用现有的视图,并创建自己的额外数据字典表或视图。
Oracle建议,编写引用数据字典的程序的应用程序开发人员应使用公共同义词,而非底层表。因为同义词在不同版本之间发生变化的可能性更小。
Data Dictionary Storage(数据字典的存储)
用于存储整个CDB元数据的数据字典仅存储在系统表空间中。
用于存储特定PDB元数据的数据字典存储在该PDB专用的独立表空间中。PDB表空间同时包含应用程序后端的数据和元数据。因此,每组数据字典表都存储在其专用的表空间集中。
另请参见:
有关SYSTEM
表空间的更多信息,请参阅“The SYSTEM Tablespace(SYSTEM表空间)”
Overview of the Dynamic Performance Views(动态性能视图概述)
在运行过程中,Oracle数据库会维护一组虚拟表,用于记录当前数据库的活动情况。
这些视图之所以被称为“动态”,是因为在数据库处于打开和使用状态时,它们会持续更新。这些视图有时也被称为V$
视图,因为它们的名称以V$
开头。
动态性能视图包含以下类型的信息:
- 系统和会话参数
- 内存使用和分配情况
- 文件状态(包括RMAN备份文件)
- 作业和任务的进度
- SQL执行情况
- 统计信息和指标
动态性能视图的主要用途如下:
- Oracle Enterprise Manager(Oracle企业管理器)使用这些视图获取数据库信息
- 管理员可以使用这些视图进行性能监控和故障排查
Contents of the Dynamic Performance Views(动态性能视图的内容)
动态性能视图被称为“固定视图(fixed views)”,因为数据库管理员无法修改或删除它们。但数据库管理员可以查询这些表、在表上创建视图,并将这些视图的访问权限授予其他用户。
Storage of the Dynamic Performance Views(动态性能视图的存储)
动态性能视图基于数据库内存结构构建的虚拟表。
另请参见:
有关动态性能视图的完整列表,请参阅《Oracle Database Reference》(Oracle数据库参考)
Contents of the Dynamic Performance Views(动态性能视图的内容)
动态性能视图被称为“固定视图”,因为数据库管理员无法修改或删除它们。但数据库管理员可以查询这些表、在表上创建视图,并将这些视图的访问权限授予其他用户。
SYS
用户拥有动态性能表,这些表的名称以V_$
开头。系统会在这些表上创建视图,然后创建以V$
为前缀的公共同义词。例如,V$DATAFILE
视图包含数据文件的相关信息,V$FIXED_TABLE
视图包含所有动态性能表和视图的相关信息。
几乎每个V$
视图都对应一个GV$
视图。在Oracle Real Application Clusters(Oracle RAC,Oracle实时应用集群)中,查询GV$
视图会从所有符合条件的数据库实例中获取V$
视图的信息。
当您使用Database Configuration Assistant(DBCA,数据库配置助手)创建数据库时,Oracle会自动创建数据字典。Oracle数据库会自动运行catalog.sql
脚本,该脚本包含动态性能视图的视图定义和公共同义词定义。您必须运行catalog.sql
才能创建这些视图和同义词。
另请参见:
- 有关如何手动运行
catalog.sql
的内容,请参阅《Oracle Database Administrator’s Guide》(Oracle数据库管理员指南) - 有关在Oracle RAC中使用性能视图的内容,请参阅《Oracle Real Application Clusters Administration and Deployment Guide》(Oracle实时应用集群管理与部署指南)
Storage of the Dynamic Performance Views(动态性能视图的存储)
动态性能视图基于数据库内存结构构建的虚拟表。
这些视图不是存储在数据库中的常规表。由于数据会动态更新,因此无法保证这些视图的读一致性。
由于动态性能视图不是真正的表,其数据依赖于数据库和数据库实例的状态。例如,数据库启动但未挂载时,您可以查询V$INSTANCE
和V$BGPROCESS
;但只有在数据库挂载后,才能查询V$DATAFILE
。
另请参见:
“Data Concurrency and Consistency(数据并发与一致性)”
Database Object Metadata(数据库对象元数据)
DBMS_METADATA
包提供了用于提取数据库对象完整定义的接口。
这些定义可以表示为XML格式或SQL DDL格式。Oracle数据库提供两种风格的接口:一种是灵活、复杂的接口,用于程序控制;另一种是简化的接口,用于临时查询。
另请参见:
有关DBMS_METADATA
的更多信息,请参阅《Oracle Database PL/SQL Packages and Types Reference》(Oracle数据库PL/SQL包和类型参考)
更多推荐
所有评论(0)