好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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 : 35 scott @ felix SQL > set autot traceonly ;

23 : 47 : 54 scott @ felix SQL > select * from v$parameter ;

347 rows selected.

Execution Plan

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

Plan hash value : 1128103955

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

| Id | Operation | Name | Rows | Bytes | Cost (% CPU )| Time |

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

| 0 | SELECT STATEMENT | | 1 | 4414 | 1 ( 100 )| 00 : 00 : 01 |

|* 1 | HASH JOIN | | 1 | 4414 | 1 ( 100 )| 00 : 00 : 01 |

|* 2 | FIXED TABLE FULL | X$KSPPI | 1 | 249 | 0 ( 0 )| 00 : 00 : 01 |

| 3 | FIXED TABLE FULL | X$KSPPCV | 100 | 406 K | 0 ( 0 )| 00 : 00 : 01 |

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

Predicate Information ( identified by operation id ):

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

1 - access ( "X"."INDX" = "Y"."INDX" )

filter ( TRANSLATE ( "KSPPINM" , '_' , '#' ) NOT LIKE '#%' OR

"KSPPSTDF" = 'FALSE' OR BITAND ( "KSPPSTVF" , 5 )> 0 )

2 - filter ( "X"."INST_ID" = USERENV ( 'INSTANCE' ) AND

BITAND ( "KSPPIFLG" , 268435456 )= 0 AND TRANSLATE ( "KSPPINM" , '_' , '#' ) NOT

LIKE '##%' )

Statistics

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

8 recursive calls

0 db block gets

2 consistent gets

0 physical reads

0 redo size

38375 bytes sent via SQL * Net to client

776 bytes received via SQL * Net from 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 , kvitdsc from x$kvit ;

数据字典表:

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

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

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

[oracle @ felix admin ]$ pwd

/ u01 / app / oracle / product / 11.2 .0 / db_1 / rdbms / admin

[oracle @ felix admin ]$ 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 @ felix admin ]$ cat ddm.bsq

rem pstengar 05 / 22 / 06 - add audit$ column to model$

rem mmcracke 03 / 14 / 05 - creation

rem data mining model table

create table model$

(

obj# number not null , /* 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" ) not null /* auditing options */

)

storage ( maxextents unlimited )

tablespace SYSAUX

/

create unique index model$idx

on model$ ( obj# )

storage ( maxextents unlimited )

tablespace SYSAUX

/

rem data mining model components table

create table modeltab$

(

mod# number not null , /* model object id */

obj# number not null , /* table object id */

typ# number not null /* model table type */

)

storage ( maxextents unlimited )

tablespace SYSAUX

/

create unique index modeltab$idx

on modeltab$ ( mod# , typ# )

storage ( maxextents unlimited )

tablespace SYSAUX

/

rem data mining model attribute table

create table modelatt$

(

mod# number not null , /* model object id */

name varchar2 ( 30 ) not null , /* attribute name */

atyp number , /* attribute type */

dtyp number not null , /* data type */

length number , /* data length */

precision# number , /* precision */

scale number , /* scale */

properties number /* properties */

)

storage ( maxextents unlimited )

tablespace SYSAUX

/

create index modelatt$idx

on modelatt$ ( mod# )

storage ( maxextents unlimited )

tablespace SYSAUX

/

rem data mining model settings table

create table modelset$

(

mod# number not null , /* model object id */

name varchar2 ( 30 ) not null , /* setting name */

value varchar2 ( 4000 ), /* setting value */

properties number /* properties */

)

storage ( maxextents unlimited )

tablespace SYSAUX

/

create index modelset$idx

on modelset$ ( mod# )

storage ( maxextents unlimited )

tablespace SYSAUX

/

Rem

Rem Sequence for export / import

create sequence DM$EXPIMP_ID_SEQ

/

grant select on DM$EXPIMP_ID_SEQ to public

/

[oracle @ felix admin ]$

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

例如:

进行一个 10046trace :

00 : 56 : 54 scott @ felix SQL > alter session set events '10046 tracename context forever,level 12';

Session altered.

01 : 00 : 18 scott @ felix SQL > create table felix2 as select * fromdba_objects;

Table created.

01 : 00 : 39 scott @ felix SQL > 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 @ felix SQL >

摘录一些跟中文件信息,下面这个是前台的 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)' ;

insert into obj$ ( 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 )

insert into seg$ ( 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 )

insert into tab$ ( 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 )

insert into col$ ( 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 @ felix SQL > select table_name , tablespace_name from user_tables ;

TABLE_NAME TABLESPACE_NAME

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

DEPT USERS

EMP USERS

BONUS USERS

SALGRADE USERS

FELIX2 USERS

常用的数据字典举例:

(1) DICT_COLUMNS

01 : 54 : 55 scott @ felix SQL > SELECT COLUMN_NAME , COMMENTS FROM DICT_COLUMNS WHERE TABLE_NAME = 'DICT' ;

COLUMN_NAME COMMENTS

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

TABLE_NAME Name of the object

COMMENTS Text comment on the object

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

scott @ felix SQL > select * from (

select table_name , count (*)

from dict_columns

group by table_name

order by 2 desc )

where rownum 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 @ felix SQL > select table_name from dict where table_name like '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

27 rows 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 @ felix SQL > select object_name , object_type from 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 @ felix SQL > 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 @ felix SQL > select inst_id , instance_name , status from gv$instance ;

INST_ID INSTANCE_NAME STATUS

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

1 felix OPEN

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

02 : 41 : 12 scott @ felix SQL > select instance_number , instance_name , status from 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_NUM from GV$FIXED_TABLE where 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' , indx from x$kqfta union all select i

nst_id , kqfvinam , kqfviobj , 'VIEW' , 65537 from x$kqfvi union all select inst_id , k

qfdtnam , kqfdtobj , 'TABLE' , 65537 from x$kqfdt

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

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

scott @ felix SQL > select count (*) from v$fixed_table where name like '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 @ felix SQL > select VIEW_DEFINITION from v$fixed_view_definition<

查看更多关于oracle数据字典详解:内部RDBMS(X$)表、数据字典表、动态性能(v$的详细内容...

  阅读:41次