码迷,mamicode.com
首页 > 数据库 > 详细

oracle数据字典

时间:2015-07-14 13:18:51      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

每个数据库都提供了各自的数据字典的方案,虽然形式不同,但是目的和作用是一样的,比如在mysql里数据字典是在information_schema 里表现的,sqlserver则是在sys这个系统schema里来展示的。
Oracle的数据字典是Oracle数据库安装之后,自动创建的一系列数据库对象。数据字典是Oracle数据库对象结构的元数据信息。熟悉和深入研究数据字典对象,可以很大程度的帮助我们了解Oracle内部机制。
Oracle字典视图包括四个层次,分别为X$内部表、基础数据字典表、数据字典视图和动态性能视图。

数据字典表和用户创建的表没有什么区别,不过数据字典表里的数据是Oracle系统存放的系统数据,而普通表存放的是用户的数据而已,

在手工用create database的命令的时候,会调用$ORACLE_HOME/rdbms/admin/sql.bsq文件,这个就会执行生成我们这些数据字典表。打开sql.bsq会发现很多数据字典几乎都以$结尾,比如col$,tab$等。

这里的数据字典表的用户都是sys,存在于system这个表空间里,表名都用"$"结尾,为了便于用户对数据字典表的查询,这样的名字是不利于我们记忆的,所以Oracle对这些数据字典都分别建立了用户视图,不仅有更容易 接受的名字,还隐藏了数据字典表之间的关系,让我们直接通过视图来进行查询,简单而形象,Oracle针对这些对象的范围,分别把视图命名为 DBA_XXXX, ALL_XXXX和USER_XXXX

user_对象视图:描述了当前用户schema下的对象;
all_对象视图:描述了当前用户有权限访问到的所有对象的信息;
dba_对象视图:包括了所有数据库对象的信息;

 

注意:在创建数据库是会运行两个脚本。先运行catalog.sql,该脚本用来创建数据库的内部字典表。然后再运行catrpoc.sql,该脚本用来创建数据库内建的存储过程、包等pl\sql对象。如果我们是使用dbca来创建数据库,则dbca会自动调用这两个脚本。否则在执行create database命令来创建时,则需要手工运行这两个脚本。

 

动态性能视图概述

 

所谓动态性能视图,就是指将内存里的数据或控制文件里的数据以表的形式展现出来。他们实际都是虚拟表,并不是真正的表。只不过是为了能够让我们更好的管理数据库的性能,所以将内存里的活动情况以表的形式展现出来。只要数据库还在运行,就会不断更新动态性能视图。一旦数据库关闭或崩溃,动态性能视图里的数据就会全部丢失,下次重启时则会重新计算。就像所有的数据字典的名词都存在 dictionary里一样,v$fixed_table里存放了所有的动态性能视图的名称。所有的动态性能的属主都是sys,且都以v$_开头,创建同名词时则都以v$开头。

 

 

数据字典视图非常多,我们无法一一记住,但是有个视图,我们必须知道,那就是dictionary视图,该视图里记录了所有的数据字典视图的名称。所以当我们需要查找某个数据字典而又不知道这个信息在哪个视图里的时候,就可以在dictionary视图里找。该视图还有个同名词dict。下面我们来追踪下dba_synonyms
SQL> desc dict
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 TABLE_NAME                                         VARCHAR2(30)
 COMMENTS                                           VARCHAR2(4000)

SQL> select * from dict where table_name like %DICT%;
SQL> select count(*) from dict;

  COUNT(*)
----------
      2553

SQL> select * from dict where table_name like %SYNONYM%;
TABLE_NAME                     COMMENTS
------------------------------ -----------------------------------------------------------------
USER_SYNONYMS                  The users private synonyms
ALL_SYNONYMS                   All synonyms for base objects accessible to the user and session
DBA_SYNONYMS                   All synonyms in the database
在DBA_SYNONYMS验证下dba_synonyms是否为同名词
SQL> select OWNER,SYNONYM_NAME,TABLE_NAME from dba_synonyms;
果然,DBA_SYNONYMS为DBA_SYNONYMS表的同名词。

继续查找dba_objects验证DBA_SYNONYMS为何种对象。
SQL> column object_name format a30
SQL> select OWNER,OBJECT_NAME,OBJECT_TYPE from dba_objects where OBJECT_NAME=DBA_SYNONYMS;

OWNER                          OBJECT_NAME                    OBJECT_TYPE
------------------------------ ------------------------------ -------------------
SYS                            DBA_SYNONYMS                   VIEW
PUBLIC                         DBA_SYNONYMS                   SYNONYM
可以看出,DBA_SYNONYMS为sys用户下的视图,继续查找dba_views查看DBA_SYNONYMS的具体定义。
SQL> select VIEW_NAME,TEXT from dba_views where VIEW_NAME=DBA_SYNONYMS;

VIEW_NAME                      TEXT
------------------------------ --------------------------------------------------------------------------------
DBA_SYNONYMS                   select u.name, o.name, s.owner, s.name, s.node
                               from sys.user$ u, sys.syn$ s, sys
可以看到,DBA_SYNONYMS是基于sys用户下的user$和syn$这两张数据字典表创建的视图。
这里也就验证了,我们前面所说的数据字典组织方式:先基于数据字典创建数据字典视图,然后在基于数据字典视图创建同名词,并将该同名词赋给了PUBLIC,从而使得所有用户都可以通过同名词查看数据字典信息。 


下面以v$session为例进行追踪
SQL> select OWNER,SYNONYM_NAME,TABLE_NAME from dba_synonyms where SYNONYM_NAME=V$SESSION;

OWNER                          SYNONYM_NAME                   TABLE_NAME
------------------------------ ------------------------------ ------------------------------
PUBLIC                         V$SESSION                      V_$SESSION
查看V_$SESSION的对象类型和属主
SQL> select OWNER,OBJECT_NAME,OBJECT_TYPE from dba_objects where OBJECT_NAME=V_$SESSION;

OWNER                          OBJECT_NAME                    OBJECT_TYPE
------------------------------ ------------------------------ -------------------
SYS                            V_$SESSION                     VIEW
这里可以知道V_$SESSION是视图,查看该视图的具体定义。
SQL> select TEXT from dba_views where VIEW_NAME=V_$SESSION;
可以看到v_$session视图是基于与动态性能视图v$session视图创建的,而动态性能视图的定义信息记录在v$fixed_view_definition里面
select VIEW_DEFINITION from v$fixed_view_definition where VIEW_NAME=V$SESSION;
可以看到动态性能视图v$session是基于动态性能视图gv$session视图创建的,继续追踪
select VIEW_DEFINITION from v$fixed_view_definition where VIEW_NAME=GV$SESSION
可以看到gv$session是的最终定义信息是来自于x$ksuse s和x$ksle,这些表是动态性能视图的基表。但是这些表都是内存表,表中的数据不会存在数据文件中,只存在内存中。

 

oracle数据字典

标签:

原文地址:http://www.cnblogs.com/createyuan/p/4645056.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!