您的位置:首页 > 数据库 > Oracle

oracle数据字典详解,内部RDBMS(X$)表、数据字典表、动态性能(v$)视图、数据字典视图

2013-11-08 17:25 489 查看
我们所说的数据字典由四部分组成:(1)内部RDBMS(X$)表(2)数据字典表(3)动态性能(v$)视图(4)数据字典视图

 

一.内部RDBMS(V$)表

X$表是oracle数据库的核心部分,用于跟中数据库内部信息,维护数据库的正常运行。X$是加密命名的,而且oracle官方文档不做说明;最为人所熟知的是X$BH、X$KSMSP等:

X$表是oracle数据库的运行基础,在数据库启动时有oracle应用程序自动创建。所以oracle不允许SYSDBA以外的用户直接访问。

一般而言,对于这种对象,进行观察、发现、研究X$表的好办法是借用oracle的AUTOTRACE功能,当查询一些视图时,可以发现这些X$底层表;

如下:

23:26:35
scott@felixSQL>set
autot traceonly;
23:47:54
scott@felixSQL>select*from
v$parameter;
 
347rows selected.
 
 
Execution Plan
----------------------------------------------------------
Planhashvalue:1128103955
 
------------------------------------------------------------------------------
|Id |
Operation         |Name    |Rows |
Bytes |Cost(%CPU)|Time    |
------------------------------------------------------------------------------
|  0|SELECTSTATEMENT |         |    1| 4414|    1(100)|00:00:01|
|* 1| HASHJOIN       |         |    1| 4414|    1(100)|00:00:01|
|* 2|  FIXED
TABLEFULL| X$KSPPI |    1|  249|    0  (0)|00:00:01|
|  3|  FIXED
TABLEFULL| X$KSPPCV|  100|  406K|    0  (0)|00:00:01|
------------------------------------------------------------------------------
 
Predicate Information(identifiedby
operationid):
---------------------------------------------------
 
   1-access("X"."INDX"="Y"."INDX")
       filter(TRANSLATE("KSPPINM",'_','#')NOTLIKE'#%'OR
             
"KSPPSTDF"='FALSE'ORBITAND("KSPPSTVF",5)>0)
   2-filter("X"."INST_ID"=USERENV('INSTANCE')AND
             
BITAND("KSPPIFLG",268435456)=0ANDTRANSLATE("KSPPINM",'_','#')NOT
             
LIKE'##%')
 
 
Statistics
----------------------------------------------------------
          8 recursive calls
          0 dbblock
gets
          2 consistent
gets
          0 physicalreads
          0 redosize
      38375 bytes sent viaSQL*Netto
client
        776 bytes received viaSQL*Netfrom
client
         25 SQL*Net
roundtrips to/from client
          0 sorts(memory)
          0 sorts(disk)
        347 rows
processed
 

 

 

再看这个X$KVIT([K]ernel Layer Performance Layer[V][I]nformation tables [T]ransitory Instance parameter)这个视图记录的是和实例相关的一些内部参数设置,可以看到一些很有意思的内容;

 

select kvittag,kvitval,kvitdscfrom
x$kvit;



                             

 

 

 

数据字典表:

数据字典表用以存储表、索引、约束以及其他数据库结构的信息。这些对象通常是以‘$’结尾(例如:TAB$、OBJ$
、TS$等)

Bsq是非常重要的一个文件,其中包含了数据字典的定义以及注释说明,每个视图深入学习oracle数据库的用户都应该仔细阅读以下该文件该文件位于$ORACLE_HOME/rdbms/admin目录下:

(在11g中bsq文件被分别归类到不通的.bsq文件)。

[oracle@felixadmin]$
pwd
/u01/app/oracle/product/11.2.0/db_1/rdbms/admin
[oracle@felixadmin]$
ls -l*.bsq
-rw-r--r--
1 oracle oinstall   25905 Mar 19 2009 daw.bsq
-rw-r--r--
1 oracle oinstall   91730 Jul 22 2011 dcore.bsq
-rw-r--r--
1 oracle oinstall    2832 Oct 23 2006 ddm.bsq
-rw-r--r--
1 oracle oinstall     674 Jul 14 2008 ddst.bsq
-rw-r--r--
1 oracle oinstall   17993 Feb 23 2010 denv.bsq
-rw-r--r--
1 oracle oinstall    1364 Oct 31 2005 dexttab.bsq
-rw-r--r--
1 oracle oinstall    4937 Oct 31 2005 dfmap.bsq
-rw-r--r--
1 oracle oinstall     728 Oct 31 2005 djava.bsq
-rw-r--r--
1 oracle oinstall   33697 Apr 26 2011 dlmnr.bsq
-rw-r--r--
1 oracle oinstall    9632 Dec 8  2009 dmanage.bsq
-rw-r--r--
1 oracle oinstall   25509 Jun 8  2007 dobj.bsq
-rw-r--r--
1 oracle oinstall   32867 May 18 2011 doptim.bsq
-rw-r--r--
1 oracle oinstall   47093 Nov 12 2009 dpart.bsq
-rw-r--r--
1 oracle oinstall   16679 Jan 8  2007 dplsql.bsq
-rw-r--r--
1 oracle oinstall   17811 Oct 9  2009 drac.bsq
-rw-r--r--
1 oracle oinstall  128181 May 13 2011 drep.bsq
-rw-r--r--
1 oracle oinstall  139898 Jun 11 2010 dsec.bsq
-rw-r--r--
1 oracle oinstall   17751 Mar 9  2009 dsqlddl.bsq
-rw-r--r--
1 oracle oinstall   19958 Jul 30 2008 dsummgt.bsq
-rw-r--r--
1 oracle oinstall   15830 Apr 29 2011 dtools.bsq
-rw-r--r--
1 oracle oinstall    5474 Oct 31 2006 dtxnspc.bsq
-rw-r--r--
1 oracle oinstall 2495314 Sep17  2011 recover.bsq
-rw-r--r--
1 oracle oinstall   53130 Jul 14 2008 sql.bsq

 

这些数据字典表对于数据库的稳定运行生死攸关,所以通常oracle不允许直接对数据字典进行操作。当用户执行DDL和DML操作时,在后台oracle讲这些操作解析为对于数据字典的自动执行。

 

以下是某个bsq的内容:

[oracle@felixadmin]$
cat ddm.bsq
rem   pstengar  05/22/06-add
audit$ columnto model$
rem   mmcracke  03/14/05-
creation
 
rem dataminingmodeltable
createtable model$
(
  obj#         numbernotnull,                  /*
unique model object id */
  func         number,                      /*
mining function (bit flags)*/
  alg          number,                     /*
mining algorithm (bit flags)*/
  bdur         number,                                    /*
time to build */
  msize        number,                               /*
size of model (MB) */
  version      number,                                    /*
model version */
  audit$       varchar2("S_OPFL")notnull             /*
auditing options */
)
storage(maxextentsunlimited)
tablespaceSYSAUX
/
createuniqueindex model$idx
  on model$(obj#)
storage(maxextentsunlimited)
tablespaceSYSAUX
/
rem dataminingmodel
components table
createtable modeltab$
(
  mod#               number      notnull,             /*
model object id */
  obj#               number      notnull,             /*
table object id */
  typ#               number      notnull             /*
model table type */
)
storage(maxextentsunlimited)
tablespaceSYSAUX
/
createuniqueindex modeltab$idx
  on modeltab$(mod#,
typ#)
storage(maxextentsunlimited)
tablespaceSYSAUX
/
rem dataminingmodelattributetable
createtable modelatt$
(
  mod#               number        notnull,           /*
model object id */
  name               varchar2(30)  notnull,            /*
attribute name */
  atyp               number,                             /*
attribute type */
  dtyp                number        notnull,                 /*
data type */
  length             number,                                /*
data length */
  precision#         number,                                  /*
precision */
  scale              number,                                      /*
scale */
  properties         number                                  /*
properties */
)
storage(maxextentsunlimited)
tablespaceSYSAUX
/
createindex modelatt$idx
  on modelatt$(mod#)
storage(maxextentsunlimited)
tablespaceSYSAUX
/
rem dataminingmodelsettingstable
createtable modelset$
(
  mod#               number        notnull,           /*
model object id */
  name               varchar2(30)  notnull,              /*
setting name */
  value              varchar2(4000),                      /*
setting value */
  properties         number                                  /*
properties */
)
storage(maxextentsunlimited)
tablespaceSYSAUX
/
createindex modelset$idx
  on modelset$(mod#)
storage(maxextentsunlimited)
tablespaceSYSAUX
/
Rem
Rem Sequencefor export/import
createsequence DM$EXPIMP_ID_SEQ
/
grantselecton DM$EXPIMP_ID_SEQtopublic
/
 [oracle@felixadmin]$

 

 

例如:当创建一张数据表时,oracle将会在后台执行一系列的内部操作,比如像OBJ$表中插入数据、向tab$表中记录数据、向col$表中记录字段信息、向con$记录约束信息、向seg$中记录数据段信息。

例如:

进行一个10046trace:

 

00:56:54
scott@felixSQL>alter
session set events '10046 tracename context forever,level 12';
 
Session altered.

01:00:18
scott@felixSQL>create
table felix2 as select * fromdba_objects;
 
Table created.
 
01:00:39
scott@felixSQL>select
value from v$diag_info wherename='Default Trace File';
 
VALUE
-----------------------------------------------------------------------------------/u01/app/oracle/diag/rdbms/felix/felix/trace/felix_ora_19538.trc
 
01:00:48
scott@felixSQL>

 

摘录一些跟中文件信息,下面这个是前台的DDL语句在后台是怎样被转化成一系列的DML语句进行执行的,首先记录的是创建语句:

[oracle@felix ~]$ cat/u01/app/oracle/diag/rdbms/felix/felix/trace/felix_ora_19538.trc|
grep create
 
createtable felix2 as select * from dba_objects
     m_stmt:='call mderr.raise_md_error(''MD'',''SDO'', -13391, ''GeoRaster reserved names cannot
be used to create regulartriggers.'')';
     m_stmt:='beginSDO_GEOR_UTL.createDMLTrigger(:1,:2); end;';

 

然后是向obj$ 、con$、 seg$、 tab$、 col$表中增加信息:

[oracle@felix ~]$ cat/u01/app/oracle/diag/rdbms/felix/felix/trace/felix_ora_19538.trc|
grep insert
   m_stmt:='insert into sdo_geor_ddl__table$$values (1)';
   m_stmt:='insert into sdo_geor_ddl__table$$values (2)';
insertintoobj$(owner#,name,namespace,obj#,type#,ctime,mtime,stime,status,remoteowner,linkname,subname,dataobj#,flags,oid$,spare1,spare2,spare3)values(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,:17,:18)
 
insertintoseg$(file#,block#,type#,ts#,blocks,extents,minexts,maxexts,extsize,extpct,user#,iniexts,lists,groups,cachehint,hwmincr,
spare1, scanhint, bitmapranges)values(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,DECODE(:17,0,NULL,:17),:18,:19)
 
insertintotab$(obj#,ts#,file#,block#,bobj#,tab#,intcols,kernelcols,clucols,audit$,flags,pctfree$,pctused$,initrans,maxtrans,rowcnt,blkcnt,empcnt,avgspc,chncnt,avgrln,analyzetime,samplesize,cols,property,degree,instances,dataobj#,avgspc_flb,flbcnt,trigflag,spare1,spare6)values(:1,:2,:3,:4,decode(:5,0,null,:5),decode(:6,0,null,:6),:7,:8,decode(:9,0,null,:9),:10,:11,:12,:13,:14,:15,:16,:17,:18,:19,:20,:21,:22,:23,:24,:25,decode(:26,1,null,:26),decode(:27,1,null,:27),:28,:29,:30,:31,:32,:33)
 
insertintocol$(obj#,name,intcol#,segcol#,type#,length,precision#,scale,null$,offset,fixedstorage,segcollength,deflength,default$,col#,property,charsetid,charsetform,spare1,spare2,spare3)values(:1,:2,:3,:4,:5,:6,decode(:5,182/*DTYIYM*/,:7,183/*DTYIDS*/,:7,decode(:7,0,null,:7)),decode(:5,2,decode(:8,-127/*MAXSB1MINAL*/,null,:8),178,:8,179,:8,180,:8,181,:8,182,:8,183,:8,231,:8,null),:9,0,:10,:11,decode(:12,0,null,:12),:13,:14,:15,:16,:17,:18,:19,:20)
 

 

 

 

oracle通过将DDL解析为dml操作,并将这些操作记录在数据字典表中,通过将这些信息反向解析,可以得到原始的创建语句。

 

 

静态数据字典视图:

由于X$表和数据字典表通常不能直接访问,oracle创建了静态数据字典视图提供用户对于数据字典信息的访问,由于这些信息相对稳定、不能直接修改,所以又被称为静态数据字典视图。静态数据字典视图是由catalog.sql脚本创建(在$ORACLE_HOME/rdbms/admin下)

(1)   USER_视图包含了用户所拥有的相关对象的信息,用户可以通过这个视图查询自己拥有的对象信息。

(2)   ALL_类视图包含了用户有权限访问的所有对象的信息。

(3)   DBA_类视图包含了数据库所拥有的所有相关对象的信息,用户需要select any table权限才能访问。

 

01:31:13
scott@felixSQL>select
table_name,tablespace_namefrom user_tables;
 
TABLE_NAME                                                  TABLESPACE_NAME
------------------------------------------------------------ -----
DEPT                                                        USERS
EMP                                                         USERS
BONUS                                                       USERS
SALGRADE                                                    USERS
FELIX2                                                      USERS
 

 

 

常用的数据字典举例:

(1)   DICT_COLUMNS

01:54:55
scott@felixSQL>SELECT
COLUMN_NAME,COMMENTSFROM DICT_COLUMNSWHERE
TABLE_NAME='DICT';
 
COLUMN_NAME                   COMMENTS
------------------------------ ----------------------------------------
TABLE_NAME                    Nameoftheobject
COMMENTS                      Text
commentontheobject
这个视图记录了字典的很重要的信息,例如找到具有较多字段的TOP 10字典视图:

scott@felixSQL>select*from(
    select table_name,count(*)
    from dict_columns
    groupby table_name
    orderby2desc)
    whererownum<=10;
 
TABLE_NAME                                                    COUNT(*)
------------------------------------------------------------ ----------
GV$SESSION                                                          98
V$SESSION      
                                                     97
GV$ACTIVE_SESSION_HISTORY                                          97
DBA_HIST_ACTIVE_SESS_HISTORY                                       97
V$ACTIVE_SESSION_HISTORY                                           96
GV$SQL                                                               88
V$SQL                                                                87
GV$SQLAREA                                                           83
V$SQLAREA                                                            82
DBA_HIST_SQLSTAT                                                    78
 

 

通过DICT视图可以很快的找到这些和COLUMN有关的视图:

 
scott@felixSQL>select
table_namefrom dictwhere table_namelike'DBA%COLUMNS';
 
TABLE_NAME
------------------------------------------------------------
DBA_APPLY_CONFLICT_COLUMNS
DBA_APPLY_DML_CONF_COLUMNS
DBA_APPLY_KEY_COLUMNS
DBA_APPLY_TABLE_COLUMNS
DBA_AUDIT_POLICY_COLUMNS
DBA_CLU_COLUMNS
DBA_COMPARISON_COLUMNS
DBA_CONS_COLUMNS
DBA_CONS_OBJ_COLUMNS
DBA_CUBE_DIM_VIEW_COLUMNS
DBA_CUBE_HIER_VIEW_COLUMNS
DBA_CUBE_VIEW_COLUMNS
DBA_ENCRYPTED_COLUMNS
DBA_IND_COLUMNS
DBA_JOIN_IND_COLUMNS
DBA_LOG_GROUP_COLUMNS
DBA_OLDIMAGE_COLUMNS
DBA_PART_KEY_COLUMNS
DBA_PUBLISHED_COLUMNS
DBA_REPFLAVOR_COLUMNS
DBA_REPKEY_COLUMNS
DBA_STREAMS_COLUMNS
DBA_STREAMS_KEEP_COLUMNS
DBA_SUBPART_KEY_COLUMNS
DBA_SUBSCRIBED_COLUMNS
DBA_TAB_COLUMNS
DBA_UPDATABLE_COLUMNS
 
27rows selected.
 

(2)   OBJ$/DBA_OBJECTS/OBJ

OBJ$是一个底层的数据字典表,其中记录了数据库中所有对象的信息,DBA_OBJECTS基于OBJ$建立,一脉相承地,ALL_OBJECTS和USER_OBJECTS视图也随之建立;

 

OBJ是对于USER_OBJECTS建立的同义词;其创建语法如下:

CREATE PUBLICSYNONYM OBJ FIR SYS.USER_OBJECTS;

 

02:02:33
scott@felixSQL>select
object_name,object_typefrom obj;
 
OBJECT_NAME                   OBJECT_TYPE
------------------------------ -------------------
PK_DEPT                       INDEX
DEPT                          TABLE
EMP                           TABLE
PK_EMP                         INDEX
BONUS                         TABLE
SALGRADE                      TABLE
FELIX2                        TABLE
 

 

(3)*_SOURCE视图

DBA_SOURCE/ALL_SOURCE/USER_SOURCE用于保存存储对象的源码。这类视图存储的对象包括function/java/packge/packgebody/procedure/trigger/type/typebody等;

02:06:47
scott@felixSQL>desc
dba_source;
 Name                                Null?   Type
 --------------------------------------
 OWNER                                         VARCHAR2(30)
 NAME                                          VARCHAR2(30)
 TYPE                                          VARCHAR2(12)
 LINE                                          NUMBER
 TEXT                                          VARCHAR2(4000)
通过TEXT字段能够获得相关对象创建的脚本;

 

 

动态性能视图:

动态性能视图(V$)(dynamicperformance view)记录了数据库运行时信息和统计数据,大部分动态性能视图被实时更新以反映数据库的当前状态。

(1)   GV$和V$视图

数据库启动时,oracle动态创建X$表,在此基础之上,oracle创建了GV$和V$视图。从oracle
8开始GV$视图开始被引入,其含义是Global,除一些特例之外,每个V$视图都有一个对应的GV$视图存在;

GV$视图的产生是为了满足OPS/RAC环境的需要:

每个V$视图都包含一下类似语句,用于限制返回当前实例的信息:、

Whereinst_id=USERENV(‘Instance’);

 

用单实例进行测试如下(如果是rac环境的话返回的是多个实例名称):

02:41:54
scott@felixSQL>select
inst_id,instance_name,statusfrom
gv$instance;
 
   INST_ID INSTANCE_NAME                    STATUS
---------- -------------------------------- ------------------------
         1 felix                           OPEN

 

而V$视图只会返回本实例上的实例名:

02:41:12
scott@felixSQL>select
instance_number,instance_name,statusfrom
v$instance;
 
INSTANCE_NUMBER INSTANCE_NAME                   STATUS
--------------- -------------------------------- ------------------------
              1 felix                           OPEN

 

 

ORACLE提供了一些特殊视图用以记录其他视图的创建方式,v$fixed_view_definition就是其中之一,从GV$FIXED_TABLE和V$FIXED_TABLE开始,我们来看一下GV$视图和v$视图的创建方式:

V$视图的创建方式:

SQL>select*from
v$fixed_view_definition where view_name='V$FIXED_TABLE';
 
VIEW_NAME           
VIEW_DEFINITION
-----------------------------------------------------------------------------------
V$FIXED_TABLE       
select NAME,
OBJECT_ID ,TYPE, TABLE_NUMfrom
GV$FIXED_TABLEwhere inst_id=USERENV('Instance')
 

 

 

 

GV$视图的创建方式:

SQL>select*from
v$fixed_view_definition where view_name='GV$FIXED_TABLE';
 
VIEW_NAME     
VIEW_DEFINITION
-------------- --------------------------------------------------------------------------------
GV$FIXED_TABLE
select inst_id,kqftanam,
kqftaobj,'TABLE', indxfrom
x$kqftaunionallselect i
              
nst_id,kqfvinam, kqfviobj,'VIEW',65537from
x$kqfvi unionallselect inst_id,k
               qfdtnam, kqfdtobj,'TABLE',65537from
x$kqfdt

 

 

总结一下:oracle的gv$视图和v$视图时在数据库创建过程中建立起来的,内置于数据库中,oracle通过v$fixed_view_definition视图为用户展示这些定义;

 

 

X$表的信息可以从v$fixed_table中查到:

scott@felixSQL>selectcount(*)from
v$fixed_table wherenamelike'X$%';
 
  COUNT(*)
----------
       970
 

 

动态性能视图与数据库启动:

 

(1)   NOMOUNT

在nomount阶段可以获取信息的视图主要有:V$PARAMETER、V$APPARAMETER、 V$SGA、
V$SGASTAT、 V$BH、 V$INSTANCE、 V$OPTION、 V$PROCESS、 V$SESSION;

(2)   mount阶段

可以获取信息的主要视图:V$DATABASE、 V$DATAFILE、 V$VERSION、V$PROCESS、
V$DATAFILE_HEADER。

(3)   OPEN阶段

在数据库OPEN之后,所有数据字典和动态性能视图都可以被查询;

 

 

V$PARAMETER结构:

03:46:58
scott@felixSQL>select
VIEW_DEFINITIONfrom v$fixed_view_definitionwhere view_name='V$PARAMETER';
 
VIEW_DEFINITION
--------------------------------------------------------------------------------
select NUM,NAME,TYPE,VALUE,
DISPLAY_VALUE, ISDEFAULT, ISSES_MODIFIABLE
, ISSYS_MODIFIABLE, ISINSTANCE_MODIFIABLE,
ISMODIFIED, ISADJUSTED, ISDEPRECAT
ED, ISBASIC,DESCRIPTION,
UPDATE_COMMENT,HASH fromGV$PARAMETERwhere
inst_id
=USERENV('Instance')
这里清晰的看到,V$PARAMETER视图是由GV$PARAMETER创建的

 

 
 SQL>select
VIEW_DEFINITION from v$fixed_view_definitionwhere view_name='GV$PARAMETER';
 
VIEW_DEFINITION
--------------------------------------------------------------------------------
select x.inst_id,x.indx+1,ksppinm,ksppity,ksppstvl,
ksppstdvl, ksppstdf, decode
(bitand(ksppiflg/256,1),1,'TRUE','FALSE'), decode(bitand(ksppiflg/65536,3),1,'I
MMEDIATE',2,'DEFERRED',                                 3,'IMMEDIATE','FALSE'),
  decode(bitand(ksppiflg,4),4,'FALSE',                                    decod
e(bitand(ksppiflg/65536,3),0,'FALSE','TRUE')),    decode(bitand(ksppstvf,7),
1,'MODIFIED',4,'SYSTEM_MOD','FALSE'), decode(bitand(ksppstvf,2),2,'TRUE','FALSE
'), decode(bitand(ksppilrmflg/64,1),1,'TRUE','FALSE'), decode(bitand(ksppi
lrmflg/268435456,1),1,'TRUE','FALSE'), ksppdesc,
ksppstcmnt, ksppihash fro
m x$ksppi x, x$ksppcv ywhere(x.indx=
y.indx)and bitand(ksppiflg,268435456)
=0and ((translate(ksppinm,'_','#')notlike'##%')and   ((translate(ksppinm
,'_','#')notlike'#%')     or(ksppstdf='FALSE')or     (bitand(ksppstvf,5
)>0)))
 
在这里可以看到GV$PARAMETER来源于X$KSSPI和X$KSPPCV两个表。这两个表基本上包含所有数据库参数。

(参考《深入解析oracle》盖国强 著)

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: