我们常说的数据字典由以下四部分组成:
(1)内部RDBMS(X$)表
(2)数据字典表
(3)数据字典视图
(4)动态性能(v$)视图
一、内部RDBMS(X$)表
X$表是Oracle数据库的核心部分,用于跟踪数据库内部信息,维护数据库的正常运行。X$是加密命名的,而且Oracle官方文档不做说明;最为人所熟知的是X$BH、X$KSMSP等。
X$表是Oracle数据库的运行基础,在数据库启动时有Oracle应用程序自动创建。所以Oracle不允许SYSDBA以外的用户直接访问。
X$表的信息可以从v$fixed_table中查到,如下所示:
-
SQL>
-
SQL> select * from v$version;
-
-
BANNER
-
----------------------------------------------------------------
-
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
-
PL/SQL Release 10.2.0.4.0 - Production
-
CORE 10.2.0.4.0 Production
-
TNS for 64-bit Windows: Version 10.2.0.4.0 - Production
-
NLSRTL Version 10.2.0.4.0 - Production
-
-
SQL> select count(*) from v$fixed_table where name like '%X$%';
-
-
COUNT(*)
-
----------
-
617
-
SQL> select name from v$fixed_table where name like '%X$%' and rownum<10;
-
-
NAME
-
------------------------------
-
X$KQFTA
-
X$KQFVI
-
X$KQFVT
-
X$KQFDT
-
X$KQFCO
-
X$KQFOPT
-
X$KSLLT
-
X$KSLHOT
-
X$KSLLCLASS
-
-
已选择9行。
-
-
SQL>
一般而言,对于这种对象,进行观察、发现、研究X$表的好办法是借用Oracle的AUTOTRACE功能,当查询一些视图时,可以发现这些X$底层表。
-
SQL>
-
SQL> set autot traceonly
-
SQL> select * from v$instance;
-
-
-
执行计划
-
----------------------------------------------------------
-
Plan hash value: 2848324471
-
-
-------------------------------------------------------------------------------------
-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-
-------------------------------------------------------------------------------------
-
| 0 | SELECT STATEMENT | | 100 | 26600 | 0 (0)| 00:00:01 |
-
| 1 | MERGE JOIN CARTESIAN | | 100 | 26600 | 0 (0)| 00:00:01 |
-
| 2 | MERGE JOIN CARTESIAN| | 1 | 253 | 0 (0)| 00:00:01 |
-
|* 3 | FIXED TABLE FULL | X$KSUXSINST | 1 | 206 | 0 (0)| 00:00:01 |
-
| 4 | BUFFER SORT | | 1 | 47 | 0 (0)| 00:00:01 |
-
|* 5 | FIXED TABLE FULL | X$KVIT | 1 | 47 | 0 (0)| 00:00:01 |
-
| 6 | BUFFER SORT | | 100 | 1300 | 0 (0)| 00:00:01 |
-
| 7 | FIXED TABLE FULL | X$QUIESCE | 100 | 1300 | 0 (0)| 00:00:01 |
-
-------------------------------------------------------------------------------------
-
-
Predicate Information (identified by operation id):
-
---------------------------------------------------
-
-
3 - filter("KS"."INST_ID"=USERENV('INSTANCE'))
-
5 - filter("KVITTAG"='kcbwst')
-
-
-
统计信息
-
----------------------------------------------------------
-
164 recursive calls
-
0 db block gets
-
16 consistent gets
-
0 physical reads
-
0 redo size
-
1650 bytes sent via SQL*Net to client
-
491 bytes received via SQL*Net from client
-
2 SQL*Net roundtrips to/from client
-
2 sorts (memory)
-
0 sorts (disk)
-
1 rows processed
-
-
SQL>
二、数据字典表
数据字典表用以存储表、索引、约束以及其他数据库结构的信息。这些对象通常是以‘$’结尾(例如:TAB$、OBJ$、TS$等)。其中,.bsq文件是非常重要的文件,其中包含了数据字典的定义以及注释说明,每个视图深入学习oracle数据库的用户都应该仔细阅读该文件。该文件位于$ORACLE_HOME/rdbms/admin目录下。
在Windows下的目录下包含两个.bsq文件,如下所示:
-
C:\oracle\product\10.2.0\db_1\RDBMS\ADMIN>dir *.bsq
-
驱动器 C 中的卷没有标签。
-
卷的序列号是 A65D-DE73
-
-
C:\oracle\product\10.2.0\db_1\RDBMS\ADMIN 的目录
-
-
2008/08/26 05:24 1,958,338 recover.bsq
-
2007/04/04 19:25 453,859 sql.bsq
-
2 个文件 2,412,197 字节
-
0 个目录 5,909,614,592 可用字节
-
-
C:\oracle\product\10.2.0\db_1\RDBMS\ADMIN>
我们打开sql.bsq文件,可以看到我们熟悉的tab$等数据字典表的定义,截取部分内容显示如下:
-
......
-
rem !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IMPORTANT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
rem Whenever new column is created to store internal, user or kernel column
-
rem number, be sure to update the structure adtDT in atb.c so that those
-
rem columns will be updated properly during drop column.
-
rem !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
rem
-
create tablespace SYSTEM datafile "D_DBFN"
-
"D_DSTG" online
-
/
-
create rollback segment SYSTEM tablespace SYSTEM
-
storage (initial 50K next 50K)
-
/
-
create cluster c_obj# (obj# number)
-
pctfree 5 size 800 /* don't waste too much space */
-
/* A table of 32 cols, 2 index, 2 col per index requires about 2K.
-
* A table of 10 cols, 2 index, 2 col per index requires about 750.
-
*/
-
storage (initial 130K next 200k maxextents unlimited pctincrease 0)
-
/* avoid space management during IOR I */
-
/
-
create index i_obj# on cluster c_obj#
-
/
-
rem NOTE
-
rem Logminer/Streams uses contents of this table.
-
rem Please do not reuse any flags without verifying the impact of your
-
rem changes on inter-op.
-
create table tab$ /* table table */
-
( obj# number not null, /* object number */
-
/* DO NOT CREATE INDEX ON DATAOBJ# AS IT WILL BE UPDATED IN A SPACE
-
* TRANSACTION DURING TRUNCATE */
-
dataobj# number, /* data layer object number */
-
ts# number not null, /* tablespace number */
-
file# number not null, /* segment header file number */
-
block# number not null, /* segment header block number */
-
bobj# number, /* base object number (cluster / iot) */
-
tab# number, /* table number in cluster, NULL if not clustered */
-
cols number not null, /* number of columns */
-
clucols number,/* number of clustered columns, NULL if not clustered */
-
pctfree$ number not null, /* minimum free space percentage in a block */
-
pctused$ number not null, /* minimum used space percentage in a block */
-
initrans number not null, /* initial number of transaction */
-
maxtrans number not null, /* maximum number of transaction */
-
......
-
)
当创建一张数据表时,Oracle将会在后台执行一系列的内部操作,比如像obj$表中插入数据、向tab$表中记录数据、向col$表中记录字段信息、向con$记录约束信息、向seg$中记录数据段信息。
三、静态数据字典视图
由于X$表和数据字典表通常不能直接访问,Oracle创建了静态数据字典视图提供用户对于数据字典信息的访问,由于这些信息相对稳定、不能直接修改,所以又被称为静态数据字典视图。静态数据字典视图是由catalog.sql脚本创建(在$ORACLE_HOME/rdbms/admin下)
(1) USER_视图包含了用户所拥有的相关对象的信息,用户可以通过这个视图查询自己拥有的对象信息。
(2) ALL_类视图包含了用户有权限访问的所有对象的信息。
(3) DBA_类视图包含了数据库所拥有的所有相关对象的信息,用户需要select any table权限才能访问。
我们经常使用的user_table、user_indexes等视图都属于这类视图。
四、动态性能视图
动态性能视图(V$)(dynamicperformance view)记录了数据库运行时信息和统计数据,大部分动态性能视图被实时更新以反映数据库的当前状态。
(1)GV$和V$视图
数据库启动时,Oracle动态创建X$表,在此基础之上,Oracle创建了GV$和V$视图。从Oracle 8开始GV$视图开始被引入,其含义是Global,除一些特例之外,每个V$视图都有一个对应的GV$视图存在;其中,GV$视图的产生是为了满足OPS/RAC环境的需要。
以v$instance为例,由于我的测试环境是单实例,查询v$instance和gv$instance的输出结果是一样的。
-
SQL> select instance_name,status from v$instance;
-
-
INSTANCE_NAME STATUS
-
---------------- ------------
-
hoegh OPEN
-
-
SQL> select instance_name,status from gv$instance;
-
-
INSTANCE_NAME STATUS
-
---------------- ------------
-
hoegh OPEN
-
-
SQL>
(2)v$fixed_view_definition
ORACLE提供了一些特殊视图用以记录其他视图的创建方式,v$fixed_view_definition就是其中之一,从GV$INSTANCE和V$INSTANCE开始,我们来看一下GV$视图和v$视图的创建方式。
-
SQL> set pagesize 100
-
SQL> select*from v$fixed_view_definition where view_name='V$INSTANCE';
-
-
VIEW_NAME
-
------------------------------
-
VIEW_DEFINITION
-
--------------------------------------------------------------------------------
-
V$INSTANCE
-
select INSTANCE_NUMBER , INSTANCE_NAME , HOST_NAME , VERSION , STARTUP_TIME , S
-
TATUS , PARALLEL , THREAD# , ARCHIVER , LOG_SWITCH_WAIT , LOGINS , SHUTDOWN_PEND
-
ING, DATABASE_STATUS, INSTANCE_ROLE, ACTIVE_STATE, BLOCKED from GV$INSTANCE wher
-
e inst_id = USERENV('Instance')
-
-
-
SQL> select*from v$fixed_view_definition where view_name='GV$INSTANCE';
-
-
VIEW_NAME
-
------------------------------
-
VIEW_DEFINITION
-
--------------------------------------------------------------------------------
-
GV$INSTANCE
-
select ks.inst_id,ksuxsins,ksuxssid,ksuxshst,ksuxsver,ksuxstim,decode(ksuxssts,0
-
,'STARTED',1,'MOUNTED',2,'OPEN',3,'OPEN MIGRATE','UNKNOWN'),decode(ksuxsshr,0,'N
-
O',1,'YES',2,NULL),ksuxsthr,decode(ksuxsarc,0,'STOPPED',1,'STARTED','FAILED'),de
-
code(ksuxslsw,0,NULL,2,'ARCHIVE LOG',3,'CLEAR LOG',4,'CHECKPOINT', 5,'REDO
-
GENERATION'),decode(ksuxsdba,0,'ALLOWED','RESTRICTED'),decode(ksuxsshp,0,'NO','
-
YES'),decode(kvitval,0,'ACTIVE',2147483647,'SUSPENDED','INSTANCE RECOVERY'),deco
-
de(ksuxsrol,1,'PRIMARY_INSTANCE',2,'SECONDARY_INSTANCE','UNKNOWN'), decode(qui_s
-
tate,0,'NORMAL',1,'QUIESCING',2,'QUIESCED','UNKNOWN'), decode(bitand(ksuxsdst, 1
-
), 0, 'NO', 1, 'YES', 'NO') from x$ksuxsinst ks, x$kvit kv, x$quiesce qu where k
-
vittag = 'kcbwst'
-
-
-
SQL>
从查询结果可以看出,v$instance是从gv$instance中查询而来的。
Oracle的gv$视图和v$视图时在数据库创建过程中建立起来的,内置于数据库中,Oracle通过v$fixed_view_definition视图为用户展示这些定义。
(3)动态性能视图与数据库启动:
NOMOUNT阶段
在nomount阶段可以获取信息的视图主要有:V$PARAMETER、V$APPARAMETER、 V$SGA、 V$SGASTAT、 V$BH、V$INSTANCE、 V$OPTION、 V$PROCESS、 V$SESSION;
MOUNT阶段
可以获取信息的主要视图:V$DATABASE、 V$DATAFILE、 V$VERSION、V$PROCESS、 V$DATAFILE_HEADER;
OPEN阶段
在数据库OPEN之后,所有数据字典和动态性能视图都可以被查询。
hoegh
15.11.19
-- The End --
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28624789/viewspace-2096741/
,如需转载,请注明出处,否则将追究法律责任。