Oracle的4類資料字典

bitifi發表於2016-03-01
    我們常說的資料字典由以下四部分組成:

    (1)內部RDBMS(X$)

    (2)資料字典表

    (3)資料字典檢視

    (4)動態效能(v$)檢視

一、內部RDBMS(X$)表  

   X$表是Oracle資料庫的核心部分,用於跟蹤資料庫內部資訊,維護資料庫的正常執行。X$是加密命名的,而且Oracle官方文件不做說明;最為人所熟知的是X$BHX$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中查詢而來的。Oraclegv$檢視和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/30496894/viewspace-2020779/,如需轉載,請註明出處,否則將追究法律責任。

相關文章