我们所说的数据字典由四部分组成:( 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: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| fixedtablefull| x$ksppi | 1| 249| 0 (0)|00:00:01|
| 3| fixedtablefull| 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 textcommentontheobject
这个视图记录了字典的很重要的信息,例如找到具有较多字段的top 10字典视图:
scott@felixsql>select*from(
select table_name,count(*)
from dict_columns
groupby table_name
orderby2desc)
whererownum10;
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_definition