Oracle的4类数据字典

    我们常说的数据字典由以下四部分组成:

    (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中查到,如下所示:


点击(此处)折叠或打开

  1. SQL>
  2. SQL> select * from v$version;

  3. BANNER
  4. ----------------------------------------------------------------
  5. Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
  6. PL/SQL Release 10.2.0.4.0 - Production
  7. CORE 10.2.0.4.0 Production
  8. TNS for 64-bit Windows: Version 10.2.0.4.0 - Production
  9. NLSRTL Version 10.2.0.4.0 - Production

  10. SQL> select count(*) from v$fixed_table where name like '%X$%';

  11.   COUNT(*)
  12. ----------
  13.        617
  14. SQL> select name from v$fixed_table where name like '%X$%' and rownum<10;

  15. NAME
  16. ------------------------------
  17. X$KQFTA
  18. X$KQFVI
  19. X$KQFVT
  20. X$KQFDT
  21. X$KQFCO
  22. X$KQFOPT
  23. X$KSLLT
  24. X$KSLHOT
  25. X$KSLLCLASS

  26. 已选择9行。

  27. SQL>
    一般而言,对于这种对象,进行观察、发现、研究X$表的好办法是借用Oracle的AUTOTRACE功能,当查询一些视图时,可以发现这些X$底层表。

点击(此处)折叠或打开

  1. SQL>
  2. SQL> set autot traceonly
  3. SQL> select * from v$instance;


  4. 执行计划
  5. ----------------------------------------------------------
  6. Plan hash value: 2848324471

  7. -------------------------------------------------------------------------------------
  8. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  9. -------------------------------------------------------------------------------------
  10. | 0 | SELECT STATEMENT | | 100 | 26600 | 0 (0)| 00:00:01 |
  11. | 1 | MERGE JOIN CARTESIAN | | 100 | 26600 | 0 (0)| 00:00:01 |
  12. | 2 | MERGE JOIN CARTESIAN| | 1 | 253 | 0 (0)| 00:00:01 |
  13. |* 3 | FIXED TABLE FULL | X$KSUXSINST | 1 | 206 | 0 (0)| 00:00:01 |
  14. | 4 | BUFFER SORT | | 1 | 47 | 0 (0)| 00:00:01 |
  15. |* 5 | FIXED TABLE FULL | X$KVIT | 1 | 47 | 0 (0)| 00:00:01 |
  16. | 6 | BUFFER SORT | | 100 | 1300 | 0 (0)| 00:00:01 |
  17. | 7 | FIXED TABLE FULL | X$QUIESCE | 100 | 1300 | 0 (0)| 00:00:01 |
  18. -------------------------------------------------------------------------------------

  19. Predicate Information (identified by operation id):
  20. ---------------------------------------------------

  21.    3 - filter("KS"."INST_ID"=USERENV('INSTANCE'))
  22.    5 - filter("KVITTAG"='kcbwst')


  23. 统计信息
  24. ----------------------------------------------------------
  25.         164 recursive calls
  26.           0 db block gets
  27.          16 consistent gets
  28.           0 physical reads
  29.           0 redo size
  30.        1650 bytes sent via SQL*Net to client
  31.         491 bytes received via SQL*Net from client
  32.           2 SQL*Net roundtrips to/from client
  33.           2 sorts (memory)
  34.           0 sorts (disk)
  35.           1 rows processed

  36. SQL>

二、数据字典表

    数据字典表用以存储表、索引、约束以及其他数据库结构的信息。这些对象通常是以‘ $ ’结尾(例如: TAB$ OBJ$ TS$ 等)。其中, .bsq 文件是非常重要的文件,其中包含了数据字典的定义以及注释说明,每个视图深入学习 oracle 数据库的用户都应该仔细阅读该文件。该文件位于 $ORACLE_HOME/rdbms/admin 目录下。
   
Windows 下的目录下包含两个 .bsq 文件,如下所示:

点击(此处)折叠或打开

  1. C:\oracle\product\10.2.0\db_1\RDBMS\ADMIN>dir *.bsq
  2.  驱动器 C 中的卷没有标签。
  3.  卷的序列号是 A65D-DE73

  4.  C:\oracle\product\10.2.0\db_1\RDBMS\ADMIN 的目录

  5. 2008/08/26 05:24 1,958,338 recover.bsq
  6. 2007/04/04 19:25 453,859 sql.bsq
  7.                2 个文件 2,412,197 字节
  8.                0 个目录 5,909,614,592 可用字节

  9. C:\oracle\product\10.2.0\db_1\RDBMS\ADMIN>
    我们打开sql.bsq文件,可以看到我们熟悉的tab$等数据字典表的定义,截取部分内容显示如下:

点击(此处)折叠或打开

  1. ......
  2. rem !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IMPORTANT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  3. rem Whenever new column is created to store internal, user or kernel column
  4. rem number, be sure to update the structure adtDT in atb.c so that those
  5. rem columns will be updated properly during drop column.
  6. rem !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  7. rem
  8. create tablespace SYSTEM datafile "D_DBFN"
  9. "D_DSTG" online
  10. /
  11. create rollback segment SYSTEM tablespace SYSTEM
  12. storage (initial 50K next 50K)
  13. /
  14. create cluster c_obj# (obj# number)
  15. pctfree 5 size 800 /* don't waste too much space */
  16. /* A table of 32 cols, 2 index, 2 col per index requires about 2K.
  17. * A table of 10 cols, 2 index, 2 col per index requires about 750.
  18. */
  19. storage (initial 130K next 200k maxextents unlimited pctincrease 0)
  20. /* avoid space management during IOR I */
  21. /
  22. create index i_obj# on cluster c_obj#
  23. /
  24. rem NOTE
  25. rem Logminer/Streams uses contents of this table.
  26. rem Please do not reuse any flags without verifying the impact of your
  27. rem changes on inter-op.
  28. create table tab$ /* table table */
  29. ( obj# number not null, /* object number */
  30. /* DO NOT CREATE INDEX ON DATAOBJ# AS IT WILL BE UPDATED IN A SPACE
  31. * TRANSACTION DURING TRUNCATE */
  32. dataobj# number, /* data layer object number */
  33. ts# number not null, /* tablespace number */
  34. file# number not null, /* segment header file number */
  35. block# number not null, /* segment header block number */
  36. bobj# number, /* base object number (cluster / iot) */
  37. tab# number, /* table number in cluster, NULL if not clustered */
  38. cols number not null, /* number of columns */
  39. clucols number,/* number of clustered columns, NULL if not clustered */
  40. pctfree$ number not null, /* minimum free space percentage in a block */
  41. pctused$ number not null, /* minimum used space percentage in a block */
  42. initrans number not null, /* initial number of transaction */
  43. maxtrans number not null, /* maximum number of transaction */
  44. ......
  45. )

当创建一张数据表时,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)记录了数据库运行时信息和统计数据,大部分动态性能视图被实时更新以反映数据库的当前状态。

1GV$V$视图

    数据库启动时,Oracle动态创建X$表,在此基础之上,Oracle创建了GV$V$视图。从Oracle 8开始GV$视图开始被引入,其含义是Global,除一些特例之外,每个V$视图都有一个对应的GV$视图存在;其中,GV$视图的产生是为了满足OPS/RAC环境的需要
   以v$instance为例,由于我的测试环境是单实例,查询v$instance和gv$instance的输出结果是一样的。

点击(此处)折叠或打开

  1. SQL> select instance_name,status from v$instance;

  2. INSTANCE_NAME STATUS
  3. ---------------- ------------
  4. hoegh OPEN

  5. SQL> select instance_name,status from gv$instance;

  6. INSTANCE_NAME STATUS
  7. ---------------- ------------
  8. hoegh OPEN

  9. SQL>

2v$fixed_view_definition

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

点击(此处)折叠或打开

  1. SQL> set pagesize 100
  2. SQL> select*from v$fixed_view_definition where view_name='V$INSTANCE';

  3. VIEW_NAME
  4. ------------------------------
  5. VIEW_DEFINITION
  6. --------------------------------------------------------------------------------
  7. V$INSTANCE
  8. select INSTANCE_NUMBER , INSTANCE_NAME , HOST_NAME , VERSION , STARTUP_TIME , S
  9. TATUS , PARALLEL , THREAD# , ARCHIVER , LOG_SWITCH_WAIT , LOGINS , SHUTDOWN_PEND
  10. ING, DATABASE_STATUS, INSTANCE_ROLE, ACTIVE_STATE, BLOCKED from GV$INSTANCE wher
  11. e inst_id = USERENV('Instance')


  12. SQL> select*from v$fixed_view_definition where view_name='GV$INSTANCE';

  13. VIEW_NAME
  14. ------------------------------
  15. VIEW_DEFINITION
  16. --------------------------------------------------------------------------------
  17. GV$INSTANCE
  18. select ks.inst_id,ksuxsins,ksuxssid,ksuxshst,ksuxsver,ksuxstim,decode(ksuxssts,0
  19. ,'STARTED',1,'MOUNTED',2,'OPEN',3,'OPEN MIGRATE','UNKNOWN'),decode(ksuxsshr,0,'N
  20. O',1,'YES',2,NULL),ksuxsthr,decode(ksuxsarc,0,'STOPPED',1,'STARTED','FAILED'),de
  21. code(ksuxslsw,0,NULL,2,'ARCHIVE LOG',3,'CLEAR LOG',4,'CHECKPOINT', 5,'REDO
  22.  GENERATION'),decode(ksuxsdba,0,'ALLOWED','RESTRICTED'),decode(ksuxsshp,0,'NO','
  23. YES'),decode(kvitval,0,'ACTIVE',2147483647,'SUSPENDED','INSTANCE RECOVERY'),deco
  24. de(ksuxsrol,1,'PRIMARY_INSTANCE',2,'SECONDARY_INSTANCE','UNKNOWN'), decode(qui_s
  25. tate,0,'NORMAL',1,'QUIESCING',2,'QUIESCED','UNKNOWN'), decode(bitand(ksuxsdst, 1
  26. ), 0, 'NO', 1, 'YES', 'NO') from x$ksuxsinst ks, x$kvit kv, x$quiesce qu where k
  27. vittag = 'kcbwst'


  28. SQL>
    从查询结果可以看出,v$instance是从gv$instance中查询而来的。 Oracle gv$ 视图和 v$ 视图时在数据库创建过程中建立起来的,内置于数据库中, Oracle 通过 v$fixed_view_definition 视图为用户展示这些定义。


3动态性能视图与数据库启动:

 NOMOUNT阶段

nomount阶段可以获取信息的视图主要有:V$PARAMETERV$APPARAMETER V$SGA V$SGASTAT V$BHV$INSTANCE V$OPTION V$PROCESS V$SESSION

MOUNT阶段

可以获取信息的主要视图:V$DATABASE V$DATAFILE V$VERSIONV$PROCESS V$DATAFILE_HEADER

OPEN阶段

在数据库OPEN之后,所有数据字典和动态性能视图都可以被查询。



hoegh
15.11.19
-- The End --


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30162081/viewspace-1841150/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30162081/viewspace-1841150/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值