我们所说的数据字典由四部分组成:( 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$的详细内容...