DataDictionary and Dynamic Performance Views(数据字典和动态性能试图)
这一章介绍了每个数据库的具有的只读参考表(视图)的最重要部分,统称为数据字典。这张还介绍了动态性能试图,它们是一些在数据库打开状态时会不停更新的特殊视图。
这章包含一下小节:
·Overview of the Data Dictionary(数据字典的概述)
·Overview of the Dynamic Performance Views(动态性能试图的概述)
·Database Object Metadata(数据库对象元数据)
Overview of the DataDictonary(数据字典的概述)
Oracle数据库有一个很重要的部分,就是data dictionary(数据字典),它们是只读表提供数据库管理时需要的元数据。数据字典们会包含如下内容:
·每个schema object的定义,包括每列的默认值,完整性约束信息
·分配给schema object的空间,以及它当前使用了多少空间
·Oracle数据库的用户的名字,授予用户的权限和角色,以及和用户相关的审计信息
数据字典,是每个数据库数据管理的核心部分.举个例子说明,数据库执行了下列操作:
·通过访问数据字典获取用户,schema object,存储结构等的详细信息.
·每次发出DDL语句时,会对数据字典造成修改.
因为Oracle数据库存储数据字典中数据的方式,和其他数据一样,都是存入到表中,所以用户可以直接通过SQL来查这些数据。举个例子:用户可以执行SELECT语句去确定他们的权限,他们的schema中有什么表,这些表有什么列,列上是否有索引,等等。
Contents of the DataDIctionary(数据字典的内容)
数据字典由下面两种对象组成:
·Base tables
它们存储着关于数据库的信息。只有Oracle数据库可以读写这些表。用户很少直接访问这些表,因为表和其中数据的格式,都是按照一种绝密的方式存放的。
·Views
这些视图使用joins和WHERE语句来简化信息,对基表的数据进行判断,把有用的信息显示出来(例如表名,用户名)。这些视图包含数据字典中的所有对象的描述和名称。有一些视图,所有的用户都可以访问,而另外的视图则只为管理员准备
基本来说,数据字典视图根据集合分组。大多数情况下,一个集合由包含相似信息的三个视图组成,这三个视图通过不同的前缀来区分,如下面的表所示。查询合适的视图,你可以访问只与你相关的信息:
Prefix | User Access | Contents | Notes |
DBA_ | 数据库管理员 | 所有对象 | 一些DBA_视图拥有一些额外的列。专门供DBA使用 |
ALL_ | 所有用户 | 用户有权限访问的 | 包括自己拥有的对象。这些视图服从当前已经启用的角色 |
USER_ | 所有用户 | 用户自设拥有的 | USER_开头的视图,通常都没有OWNER列。此列隐含为对视图发出查询的用户 |
不是所有的视图集合都是三个成员。举个例子:有数据字典DBA_LOCK视图,但没有ALL_LOCK视图。
系统提供了一个DICTIONARY视图包含了所有数据字典视图的名称和简单描述。
下面就是查询这个视图的案例:
SQL> SELECT * FROM DICTIONARY
2 ORDER BY TABLE_NAME;
TABLE_NAME COMMENTS
----------------------------------------------------------------------
ALL_ALL_TABLES Description of all object andrelational
tablesaccessible to the user
ALL_APPLY Details about each applyprocess that
dequeues fromthe queue visible to the
current user
.
.
Views with the Prefix DBA_(DBA_前缀的视图)
DBA_前缀的视图显示了整个数据库中所有相关的信息。DBA_ 视图为DBA所准备。
举个例子,下面的查询显示了数据库中所有object相关的信息:
SELECT OWNER, OBJECT_NAME, OBJECT_TYPE
FROM DBA_OBJECTS
ORDER BY OWNER, OBJECT_NAME;
Viewswith the Prefix ALL_(ALL_前缀的视图)
ALL_前缀的视图通过用户的视角去看整个数据库。这些视图返回的信息,都是用户可以访问的信息,通过public角色或者显式授予的权限和角色,可以看到自己有权限看到的对象的信息。
举个例子,下面的查询将返回你所有访问的所有对象的信息:
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_ 视图时 角色对其的影响,如果这里角色默认不是激活状态的话。
Viewswith the Prefix USER_(USER_ 开头的视图)
普通数据库用户可以对USER_ 开头的视图更感兴趣,这些视图:
·指的是在数据库中用户的私有环境,包括用户创建的schema objects相关的元数据,用户授出去的权限,等等。
·显示ALL_ 视图中属于用户自己的一部分
·拥有的和其他视图一样的列,除了OWNER列以外。
·可以为了方便而创建一个简短一些的PUBLIC 同义词。
举个例子,下面的查询返回你schema中所有的objects
SELECT OBJECT_NAME, OBJECT_TYPE
FROM USER_OBJECTS
ORDER BY OBJECT_NAME;
TheDUAL Table(DUAL表)
DUAL是个数据字典中的小表,Oracle数据库和用户自定义过程可以引用它来保证获得一个正常的返回结果。当一个值只返回一次时,可以使用dual表,举个例子:当前的日期和时间。所有的数据库用户都可以访问DUAL。
DUAL表只有一列,列名为DUMMY,也只有一行,值是X。
下面的例子是通过查询DUAL做一次数学运算:
SQL> SELECT ((3*4)+5)/3 FROM DUAL;
((3*4)+5)/3
-----------
5.66666667
Storageof the Data Dictionary(数据字典的存储)
Oracle数据库最先创建的就是数据字典的基表。数据库中所有的数据字典视图和基表都是存放在SYSTEM表空间。因为在数据库打开时,SYSTEM表空间永远是online的,所以在数据库打开时所有的数据字典永远是可用的。
HowOracle Database Uses the Data Dictionary(数据库怎样使用数据字典)
Oracle数据库用户SYS拥有所有的数据字典基表以及视图。数据字典基表中的数据 对于数据库运行来说是必须存在的。因此只有Oracle数据库可以写或者更改数据字典中的信息。用户永远不要对SYS schema中的对象或数据进行修改,因为这样的操作会损坏数据完整性。
安全管理员必须保证对这个关键用户(SYS)的控制。
警告:更改或操作数据字典的数据会对数据库运行造成永久的损害。
在数据库运行期间,在用户访问一个schema objects时,Oracle数据库会读取数据字典来确认这些schema objects是否存在。Oracle数据库同样也会持续对数据字典进行更新用来反映数据库中 结构,审计,授权以及数据的变化。
举个例子,如果hr用户创建一个名叫interns的表,那么会有插入一些行到数据字典中来对应这个新表,列,段,区,以及hr在这个表上的权限。这些新的信息会在下次查询数据字典中体现出来。
PublicSynonyms for Data Dictionary Views(数据字典视图的公共同义词)
Oracle数据库给很多数据字典创建了公共同义词,这样用户就可以很方便的访问它们。安全管理员可以另外再增加公共同义词。用户给自己对象起名时要注意规避这些公共同义词的名字。
Cachethe Data Dictionary for Fast Access(将数据字典缓存,方便快速访问)
许多数据字典中的数据都在data dictionary cache中,因为数据库频繁的查询这些信息去验证用户们访问的对象的状态。parsing(解析)信息往往保存在caches中。COMMENTS列 说明了表们以及它的列们没有缓存到dictionary cache,但是可能会缓存到database buffer cache。
OtherPrograms and the Data Dictionary
其他Oracle数据库产品可以引用已经存在的数据字典,然后创建它们自己的数据字典表或视图。应用开发人员在写程序时用到数据字典,应该用它们的公共同义词,而不是底层的表。
同义词在不同版本很少发生改变。
Overview of the DynamicPerformance Views(动态性能试图的概述)
在Oracle数据库运行(从open到关闭),Oracle数据库会维护一组虚表用来记录当前数据库的动作。因为它们在数据库打开后就不间断的更新着 所以称它们为动态性能试图。
这些视图同样会被称之为 V$ 视图。包含的信息如下:
·系统和会话的参数(parameters)
·内存的使用和分配
·文件的状态(包括RMAN备份文件)
·jobs和tasks的进度
·SQL执行情况
·统计信息和度量信息
动态性能有下面几个主要用户:
·Oracle Enterprise Manager 使用这些视图获取Oracle数据库中的信息
·管理员可以使用这些视图来性能监控和排错。
Contentsof the Dynamic Performance Views(动态性能试图的内容)
动态性能试图有时候也被叫做固化(fixed)视图,因为它们不能被DBA更改或者删除。DBA可以查询,以及在这些表上创建视图然后将这些视图的访问授权给其他用户。
SYS拥有动态性能视图,它们的名字都是以V_$开头。这些表上有视图,以及它们的公共同义词前缀是V$。举个例子,V$DATAFILE视图包含了数据文件的信息。V$FIXED_TABLE视图包含了所有动态性能表和视图的信息。
几乎所有的V$视图都有一个对应的GV$视图存在。在RAC中,查询GV$视图将返回所有数据库instance中的V$视图中的信息。
当你使用了Database Configuration Assistant(DBCA)创建一个数据库,Oracle会自动创建数据字典。Oracle数据库会自动运行catalog.sql脚本,这个脚本包含动态性能视图的公共同义词的定义。你必须运行catalog.sql来创建这些视图和同义词。
Storageof the Dynamic Performance Views(动态性能试图的存储)
动态性能试图是基于根据数据库内存结构创建的虚表。因此,它们没有传统的表存储在数据库。视图的读一致性没有保证,因为数据一直在动态更新中。
动态性能试图不是真彪,数据依赖于数据库和实例的状态。举个例子,当数据库是NOMOUNT时你可以查询V$INSTANCE和V$BGPROCESS,可是,在数据库NOMOUNT时,你是不能查询V$DATAFILE的。
Database Object Metadata(数据库对象元数据)
DBMS_METADAT包提供了抽取数据库objects完整定义的接口。这些定义可以表现为XML或者SQL DDL语句。这里提供了两种类型的接口:为程序控制提供了灵活,复杂的接口,以及为临时查询提供的简单接口。