- 作者:三十而立
数据字典,第一次听到这个词的时候,还是刚刚踏进IT行业,计算机的知识是自己业余学的,所以对这样的专有名称并不了解,不耻下问的问一个老鸟,告知是我们写程序时,比如状态,地方码,区码等一些基础信息,也叫做code table。 哦。 原来是这么回事。有了这个经历,再一次在谈及数据库时听到数据库里也有数据字典的时候,就没有那么多的陌生了,心里知道,对于数据库软件来说,他本身也是和我们写的程序一样,也是一应用,那么里面的数据字典就是 数据库应用需要的一些基础信息叻。
的确,数据库是数据的集合,数据库维护和管理这用户的数据,那么这些用户数据表都存在哪里,用户的信息是怎样的,存储这些用户的数据的路径在哪里,这些信息不属于用户的信息,却是数据库维护和管理用户数据的核心,这些信息就是数据库的数据字典来维护的,数据库的数据字典就汇集了这些数据库运行所需要的基础信息叻。 每个数据库都提供了各自的数据字典的方案,虽然形式不同,但是目的和作用是一样的,比如在mysql里数据字典是在information_schema里表现的,sqlserver则是在sys这个系统schema里来展示的,那么Oracle又是如何的叻。 这是本文章所主要要探讨的内容叻。
Oracle里数据字典按照他们存在的形式可以分为数据字典表和动态性能视图。
数据字典表和用户创建的表没有什么区别,不过数据字典表里的数据是Oracle系统存放的系统数据,而普通表存放的是用户的数据而已,为了方便的区别这些表,这些表的名字都是用"$"结尾,在我们看到的sql语句里看到"$"结尾的这些表,大家就可以想到这可能是一个数据字典表了,同样,既然如此,我们创建自己的用户表的时候就不要用“$”结尾,以免让别人误会, 数据字典表是系统存放系统用户的,所以他的owner是sys,在手工用create database的命令的时候,会调用
$ORACLE_HOME/rdbms/admin /sql.bsq文件,这个就会执行生成我们这些数据字典表。 bsq文件是什么,以前关注过我的朋友,还记得我写的有关RMAN的文章么,其中就谈到过这个bsq文件,是客户sqlplus尅调用的文件。有兴趣的朋友可以打开看看这个文件,里面是不是有很多$结尾的表呀,那么这些都是数据字典表了。
对于数据字典表,里面的数据是有数据库系统自身来维护的,所以这里虽然和普通表一样可以用DML语句来修改数据内容,但是大家最好还是不要自己来做了,因为这些表都是作用于数据库内部的,我们有时看到的604的的recursive sql这里的sql实际上很有可能就是我们的相关的数据字典表的执行内容。所以这里我们切记记住不要去修改这些表里的内容。
刚才说道了。这里的数据字典表的用户都是sys,存在在system这个表空间里,表名都用"$"结尾,为了便于用户对数据字典表的查询,这样的名字r是不利于我们记忆的,所以Oracle对这些数据字典都分别建立了用户视图视图,不仅有叻更容易接受的名字,还隐藏了数据字典表表之间的关系,让我们字节通过视图来进行查询,简单而形象,Oracle针对这些对象的范围,分别把视图命名为DBA_XXXX, ALL_XXXX和USER_XXXX
DBA_XXXX 可以看到所有数据字典里的信息
ALL_XXXX 可以看到所有这个用户可以看到的信息
USER_XXXX 仅仅是这个用户拥有的信息
比如说DBA_TABLES, ALL_TABLES和USER_TABLES,
这个视图是由sys用户创建的,所以使用需要加上sys
,显然这个太麻烦了,所以Oracle为每个数据字典表的视图头建立了同名字的公共同义词(public synonyms). 这样简单的处理就省去了写sys.这个麻烦事。
Oracle为了便于汇总数据字典表的信息,把所有的数据字典都汇集到dictionary表里了,通过对这个表的查询,我们可以很方便的找到数据库提供的数据字典。
SQL> desc dictionary;
Name Type Nullable Default Comments
---------- -------------- -------- ------- --------------------------
TABLE_NAME VARCHAR2(30) Y Name of the object
COMMENTS VARCHAR2(4000) Y Text comment on the object
上面我们了解了这里数据字典表的内部机理,我们通过实验来加深一下影响吧
我们以ALL_TABLES这个为例,看看她是怎样的一回事叻
我们可以先看看dictionary表里确实有这样一个数据字典
SQL> select * from dictionary a where a.table_name = 'ALL_TABLES';
TABLE_NAME COMMENTS
------------------------------ --------------------------------------------------------------------------
ALL_TABLES Description of relational tables accessible to the
这里ALL_TABLES是一个同义词,查出关联对象
SQL> select * from dba_synonyms a where a.synonym_name = 'ALL_TABLES';
OWNER SYNONYM_NAME TABLE_OWNER TABLE_NAME
------------------------------ ------------------------------ ------------------------------ ------------
PUBLIC ALL_TABLES SYS ALL_TABLES
是SYS的ALL_TABLES的同义词
根据上面我们提到的,这个的同义词指向一个view,我们查查view的定义
SQL> select * from dba_views a where a.view_name = 'ALL_TABLES';
OWNER VIEW_NAME TEXT_LENGTH TEXT
------------------------------ ------------------------------ ----------- -------------------------------
SYS ALL_TABLES 4173 select u.name, o.name,d........
from sys.user$ u, sys.ts$ ts, s ys.seg$ s, sys.obj$ co, sys.tab$ t, sys.obj$ o,sys.obj$ cx, sys.user$ cu
..................
这里就可以看到这个all_tables查询了 sys.user$ u, sys.ts$ ts, s ys.seg$ s, sys.obj$ co, sys.tab$ t, sys.obj$ o,sys.obj$ cx, sys.user$ cu 这样一系列表,有兴趣的朋友看看,这里是不是All的这个逻辑呀,也就是这个用户可以看到的所有的表。
这里我们大致描述了Oracle里数据字典表的组织方式,作为数据库DBA,我们的工作职责就是对数据以及数据库进行有效的维护,那么熟记这些数据字典和使用这些数据字典表是我们所必须具备的能力, 最好的记忆方式就是不停的理解上应用。 大家多试试吧。
有些细心的朋友,可能在查询刚才的dictionary表的时候,除了看到这些ALL, DBA,USER,还看到一些V$ GV$这样的记录,他们是什么东东,他们在这个表里出现,也应该是数据字典吧,他们有什么作用呢,他们又是什么来历呢?
让我们关注下一集 走近Oracle数据字典<二>--动态性能视图
- 如果没有那句“三十而立”,三十岁的男人正可以轻轻松松