mysql解析字典_oracle数据字典详解:内部RDBMS(X$)表、数据字典表、动态性能(v$

我们所说的数据字典由四部分组成:( 1 )内部 RDBMS(X$) 表( 2 )数据字典表( 3 )动态性能 (v$) 视图( 4 )数据字典视图 一.内部 RDBMS ( V$ )表 X$ 表是 oracle 数据库的核心部分,用于跟中数据库内部信息,维护数据库的正常运行。 X$ 是加密命名的

我们所说的数据字典由四部分组成:(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:35scott@felixSQL>setautot traceonly;

23:47:54scott@felixSQL>select*fromv$parameter;

347rowsselected.

ExecutionPlan

----------------------------------------------------------

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|FIXEDTABLEFULL|X$KSPPI|1|249|0(0)|00:00:01|

|3|FIXEDTABLEFULL|X$KSPPCV|100|406K|0(0)|00:00:01|

------------------------------------------------------------------------------

Predicate Information(identifiedbyoperationid):

---------------------------------------------------

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

----------------------------------------------------------

8recursive calls

0dbblockgets

2consistentgets

0physicalreads

0redosize

38375bytes sent viaSQL*Nettoclient

776bytes received viaSQL*Netfromclient

25SQL*Net

roundtripsto/fromclient

0sorts(memory)

0sorts(disk)

347rowsprocessed

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

selectkvittag,kvitval,kvitdscfromx$kvit;

test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20131108172306218%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGFuZmVsaXg%3D%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&refer=http%3A%2F%2Fblog.csdn.net%2Fhaiross%2Farticle%2Fdetails%2F41246241

数据字典表:

数据字典表用以存储表、索引、约束以及其他数据库结构的信息。这些对象通常是以‘$’结尾(例如: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 oinstall25905 Mar 19 2009 daw.bsq

-rw-r--r--

1 oracle oinstall91730 Jul 22 2011 dcore.bsq

-rw-r--r--

1 oracle oinstall2832 Oct 23 2006 ddm.bsq

-rw-r--r--

1 oracle oinstall674 Jul 14 2008 ddst.bsq

-rw-r--r--

1 oracle oinstall17993 Feb 23 2010 denv.bsq

-rw-r--r--

1 oracle oinstall1364 Oct 31 2005 dexttab.bsq

-rw-r--r--

1 oracle oinstall4937 Oct 31 2005 dfmap.bsq

-rw-r--r--

1 oracle oinstall728 Oct 31 2005 djava.bsq

-rw-r--r--

1 oracle oinstall33697 Apr 26 2011 dlmnr.bsq

-rw-r--r--

1 oracle oinstall9632 Dec 8 2009 dmanage.bsq

-rw-r--r--

1 oracle oinstall25509 Jun 8 2007 dobj.bsq

-rw-r--r--

1 oracle oinstall32867 May 18 2011 doptim.bsq

-rw-r--r--

1 oracle oinstall47093 Nov 12 2009 dpart.bsq

-rw-r--r--

1 oracle oinstall16679 Jan 8 2007 dplsql.bsq

-rw-r--r--

1 oracle oinstall17811 Oct 9 2009 drac.bsq

-rw-r--r--

1 oracle oinstall128181 May 13 2011 drep.bsq

-rw-r--r--

1 oracle oinstall139898 Jun 11 2010 dsec.bsq

-rw-r--r--

1 oracle oinstall17751 Mar 9 2009 dsqlddl.bsq

-rw-r--r--

1 oracle oinstall19958 Jul 30 2008 dsummgt.bsq

-rw-r--r--

1 oracle oinstall15830 Apr 29 2011 dtools.bsq

-rw-r--r--

1 oracle oinstall5474 Oct 31 2006 dtxnspc.bsq

-rw-r--r--

1 oracle oinstall 2495314 Sep172011 recover.bsq

-rw-r--r--

1 oracle oinstall53130 Jul 14 2008 sql.bsq

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

以下是某个bsq的内容:

[oracle@felixadmin]$

cat ddm.bsq

rempstengar 05/22/06-addaudit$columntomodel$

remmmcracke 03/14/05-creation

remdataminingmodeltable

createtablemodel$

(

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) */

versionnumber,/*

model version */

audit$ varchar2("S_OPFL")notnull/*

auditing options */

)

storage(maxextentsunlimited)

tablespaceSYSAUX

/

createuniqueindexmodel$idx

onmodel$(obj#)

storage(maxextentsunlimited)

tablespaceSYSAUX

/

remdataminingmodelcomponentstable

createtablemodeltab$

(

mod# numbernotnull,/*

model object id */

obj# numbernotnull,/*

table object id */

typ# numbernotnull/*

model table type */

)

storage(maxextentsunlimited)

tablespaceSYSAUX

/

createuniqueindexmodeltab$idx

onmodeltab$(mod#,typ#)

storage(maxextentsunlimited)

tablespaceSYSAUX

/

remdataminingmodelattributetable

createtablemodelatt$

(

mod# numbernotnull,/*

model object id */

namevarchar2(30)notnull,/*

attribute name */

atyp number,/*

attribute type */

dtyp numbernotnull,/*

data type */

lengthnumber,/*

data length */

precision# number,/*

precision */

scale number, /*

scale */

properties number/*

properties */

)

storage(maxextentsunlimited)

tablespaceSYSAUX

/

createindexmodelatt$idx

onmodelatt$(mod#)

storage(maxextentsunlimited)

tablespaceSYSAUX

/

remdataminingmodelsettingstable

createtablemodelset$

(

mod# numbernotnull,/*

model object id */

namevarchar2(30)notnull,/*

setting name */

value varchar2(4000),/*

setting value */

properties number/*

properties */

)

storage(maxextentsunlimited)

tablespaceSYSAUX

/

createindexmodelset$idx

onmodelset$(mod#)

storage(maxextentsunlimited)

tablespaceSYSAUX

/

Rem

RemSequenceforexport/import

createsequenceDM$EXPIMP_ID_SEQ

/

grantselectonDM$EXPIMP_ID_SEQtopublic

/

[oracle@felixadmin]$

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

例如:

进行一个10046trace:

00:56:54scott@felixSQL>alter

session set events '10046 tracename context forever,level 12';

Sessionaltered.

01:00:18scott@felixSQL>create

table felix2 as select * fromdba_objects;

Tablecreated.

01:00:39scott@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:48scott@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:13scott@felixSQL>selecttable_name,tablespace_namefromuser_tables;

TABLE_NAME TABLESPACE_NAME

------------------------------------------------------------ -----

DEPTUSERS

EMPUSERS

BONUSUSERS

SALGRADEUSERS

FELIX2USERS

常用的数据字典举例:

(1) DICT_COLUMNS

01:54:55scott@felixSQL>SELECTCOLUMN_NAME,COMMENTSFROMDICT_COLUMNSWHERETABLE_NAME='DICT';

COLUMN_NAMECOMMENTS

------------------------------ ----------------------------------------

TABLE_NAME Nameoftheobject

COMMENTSTextcommentontheobject

这个视图记录了字典的很重要的信息,例如找到具有较多字段的TOP 10字典视图:

scott@felixSQL>select*from(

selecttable_name,count(*)

fromdict_columns

groupbytable_name

orderby2desc)

whererownum<=10;

TABLE_NAMECOUNT(*)

------------------------------------------------------------ ----------

GV$SESSION98

V$SESSION

97

GV$ACTIVE_SESSION_HISTORY 97

DBA_HIST_ACTIVE_SESS_HISTORY97

V$ACTIVE_SESSION_HISTORY 96

GV$SQL 88

V$SQL 87

GV$SQLAREA 83

V$SQLAREA 82

DBA_HIST_SQLSTAT78

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

scott@felixSQL>selecttable_namefromdictwheretable_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

27rowsselected.

(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:33scott@felixSQL>selectobject_name,object_typefromobj;

OBJECT_NAMEOBJECT_TYPE

------------------------------ -------------------

PK_DEPTINDEX

DEPTTABLE

EMPTABLE

PK_EMP INDEX

BONUSTABLE

SALGRADETABLE

FELIX2TABLE

(3)*_SOURCE视图

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

02:06:47scott@felixSQL>descdba_source;

NameNull?Type

--------------------------------------

OWNER VARCHAR2(30)

NAMEVARCHAR2(30)

TYPEVARCHAR2(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:54scott@felixSQL>selectinst_id,instance_name,statusfromgv$instance;

INST_ID INSTANCE_NAME STATUS

---------- -------------------------------- ------------------------

1felixOPEN

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

02:41:12scott@felixSQL>selectinstance_number,instance_name,statusfromv$instance;

INSTANCE_NUMBER INSTANCE_NAMESTATUS

--------------- -------------------------------- ------------------------

1felixOPEN

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

V$视图的创建方式:

SQL>select*fromv$fixed_view_definitionwhereview_name='V$FIXED_TABLE';

VIEW_NAME

VIEW_DEFINITION

-----------------------------------------------------------------------------------

V$FIXED_TABLE

selectNAME,OBJECT_ID,TYPE,TABLE_NUMfromGV$FIXED_TABLEwhereinst_id=USERENV('Instance')

GV$视图的创建方式:

SQL>select*fromv$fixed_view_definitionwhereview_name='GV$FIXED_TABLE';

VIEW_NAME

VIEW_DEFINITION

-------------- --------------------------------------------------------------------------------

GV$FIXED_TABLE

selectinst_id,kqftanam,kqftaobj,'TABLE',indxfromx$kqftaunionallselecti

nst_id,kqfvinam,kqfviobj,'VIEW',65537fromx$kqfviunionallselectinst_id,k

qfdtnam,kqfdtobj,'TABLE',65537fromx$kqfdt

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

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

scott@felixSQL>selectcount(*)fromv$fixed_tablewherenamelike'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:58scott@felixSQL>selectVIEW_DEFINITIONfrom

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值