[AD]数据字典

 一,数据字典(Data Dictionary

Oracle数据库的一个重要组成成分,是元数据(Metadata)的存储地点。Oracle RDBMS使用数据字典记录和管理对象信息和安全信息等。

二,数据字典包括以下内容:

1所有数据库Schema对象的定义(表、视图、索引、聚簇、同义词、序列、过程、函数、包、触发器等)

2数据库的空间分配和使用情况

3字段的缺省值

4完整性约束信息

5oracle用户名称、角色、权限等信息;

6审计信息

7其他数据库信息

三,数据字典有四部分组成:

内部RDBMSX$)表、数据字典表、动态性能(v$)视图和数据字典视图

四,内部RDBMSX$)表

1, X$表示oracle数据库的核心部分,这些表用于跟踪内部数据库信息,维持数据库的正常运行。

2X$表是加密命令的,而且oracle文档不做说明,这部分只是是oracle公司的技术机密,oracle通过这些X$建立起其他大量视图,提供用户查询管理数据库之用。但是由于X$表记录了大量的有用信息,最为人所熟知的有X$BHX$KSMSP等。

3X$表是oracle数据库运行的基础,在数据库启动时由oracle应用程序动态创建。这部分表对数据库来说至关重要,oracle不允许SYSDBA之外的用户直接访问,显示授权不被允许。

发现、观察、研究X$表的一个好办法是借用Oracleautotrace功能,当查询一些常用视图的时候,可以通过autotrace功能发现这些view的底层表。

4autotrace

SQL> set autotrace trace explain;

SQL> select * from v$parameter;

Execution Plan

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

Plan hash value: 1128103955

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

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

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

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

|*  1 |  HASH JOIN        |          |     1 |   926 |     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 | 67700 |     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

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

SQL>

五,X$KVIT视图

X$KVIT其名称的含义为:[K]ernelLayerPerformanceLayer[V][I]nformation tables[T]ransitory

Instance parameters.

SQL> select * from v$version;

BANNER

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

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

PL/SQL Release 10.2.0.1.0 - Production

CORE    10.2.0.1.0      Production

TNS for Linux: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 - Production

SQL> select kvittag,kvitval,kvitdsc from X$kvit;

KVITTAG                                                             KVITVAL KVITDSC

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

ksbcpu                                                                    1 number of

logical CPUs in the system used by Oracle

ksbcpucore                                                                0 number of

physical CPU cores in the system used by Oracle

ksbcpusocket                                                              0 number of

physical CPU sockets in the system used by Oracle

ksbcpu_hwm                                                                1 high water

mark of number of CPUs used by Oracle

ksbcpucore_hwm                                                            0 high water

mark of number of CPU cores on system

ksbcpusocket_hwm                                                          0 high water

mark of number of CPU sockets on system

ksbcpu_actual                                                             1 number of

available CPUs in the system

ksbcpu_dr                                                                 1 CPU

dynamic reconfiguration supported

kcbnbh                                                                23453 number of

buffers

kcbldq                                                                   25 large

dirty queue if kcbclw reaches this

kcbfsp                                                                   40 Max

percentage of LRU list foreground can scan for free

 

KVITTAG                                                             KVITVAL KVITDSC

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

kcbcln                                                                    2 Initial

percentage of LRU list to keep clean

kcbnbf                                                                  750 number

buffer objects

kcbwst                                                                    0 Flag that

indicates recovery or db suspension

kcteln                                                                    0 Error Log

Number for thread open

kcvgcw                                                                    0 SGA:

opcode for checkpoint cross-instance call

kcvgcw                                                                    0 SGA:opcode

for pq checkpoint cross-instance call

17 rows selected.

SQL> 

1,脏缓冲区(Dirty Buffers)阀值(threshold)达到多少

kcbldq                         25 large  dirty queue if kcbclw reaches this

2No Free Buffer,也就是当进程扫描LUR一定数量的Block之后,

kcbfsp                                                                   40 Max

percentage of LRU list foreground can scan for free

如果还没有找到足够的Free空间,则触发DBWR执行写出。这些参数不能有参数调整,是数据库的内部限制。

六,数据字典表

数据字典表(Data Dictionary Table)用以存储表、索引、约束以及其他数据库结构的信息。这些对象通常以“$”结尾(如tab$,obj$,ts$等),在创建数据库的时候通过运行sql.bsq脚本来创建。该文件位于:$ORACLE_HOME/rdbms/admin目录下。

七,动态性能视图

动态性能(v$)视图(Dynamic Performance View)记录了数据库运行时信息和统计数据,大部分动态性能视图被实时更新以反映数据库当前状态。Oracle通过动态性能视图将oracle数据库的状态展示出来。

1GV$V$视图

在数据库启动时,oracle动态创建X$表,在此基础之上,oracle创建了GV$v$视图。从oracle 8i开始,GV$视图开始被引入,其含义为Global V$。除啦一些特例以外,每个v$视图都有一个对应的GV$视图存在。GV$视图的产生是为了满足OPS环境的需要,在OPS环境中,查询GV$视图返回所有实例信息。而每个V$视图,增加了INST_ID列的WHERE条件限制建立,只包含当前连接实例信息。

注意:每个视图都包含类似语句:where inst_id=USERENV('Instance')

用于限制当前的实例信息。

2Oracle提供了一些特殊视图用以记录其他视图的创建方式。v$fix_view_definition

就是其中之一。

SQL> select view_definition from v$fixed_view_definition where view_name='V

$FIXED_TABLE';

VIEW_DEFINITION

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

select  NAME , OBJECT_ID , TYPE , TABLE_NUM from GV$FIXED_TABLE where inst_id =

USERENV('Instance')

SQL> select view_definition from v$fixed_view_definition where view_name='GV

$FIXED_TABLE';

VIEW_DEFINITION

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

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

SQL>

3GV$视图和v$视图是数据库创建过程中建立起来的,内置数据库中,oracle通过v$fixed_view_definition视图为我们展现这些定义。在GV$V$之后,oracle建立了GV_$V_$视图,随后为这些视图建立了公共同义词。

4这些工作都是通过catalog.sql脚本(该脚本放在$ORACLE_HOME/rdbms/admin/目录下)实现的。

create or replace view v_$fixed_table as select * from v$fixed_table;

create or replace public synonym v$fixed_table for v_$fixed_table;

grant select on v_$fixed_table to select_catalog_role;

  

create or replace view gv_$fixed_table as select * from gv$fixed_table;

create or replace public synonym gv$fixed_table for gv_$fixed_table;

grant select on gv_$fixed_table to select_catalog_role;

从脚本看出来,第一个视图V_$GV_$视图基于V$GV$视图首先被创建,然后基于V_$GV_$视图的同义词被创建。

5通过V_$视图,oracleV$视图和普通用户隔离,V_$视图的权限可以授予其他用户,而oracle不允许任何对于V$视图的直接授权。

案例:

SQL> create user tianmao  identified by tianmao;

User created.

SQL> grant select on v$sga to tianmao;

grant select on v$sga to tianmao               *

ERROR at line 1:

ORA-02030: can only select from fixed tables/views

SQL> grant select on v_$sga to tianmao;

Grant succeeded.

SQL>

对于内部X$表及V$视图的限制,oracle是通过软件的机制实现的,而并非通过数据库权限控制。所以,实际上通常大部分用户访问v$对象,并不是视图,而是指向V_$视图的同义词;而V_$视图是基于真正的V$视图(这个视图是基于X$表建立的)创建的。

6在进行访问时,oracle访问view优先,然后是同义词。

案例:

SQL> show user;

USER is "TIANMAO"

SQL>

SQL> create table x$tianmao as select username from dba_users;

Table created.

SQL> create view v$tianmao as select * from x$tianmao;

View created.

SQL> create view v_$tianmao as select * from v$tianmao;

View created.

SQL> create public synonym v$tianmao for v_$tianmao;

Synonym created.

SQL>

SQL> show user;

USER is "SYS"

SQL>

SQL> create view v$tianmao as select username,user_id from dba_users;

View created.

SQL> desc v$tianmao;

 Name                                      Null?    Type

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

 USERNAME                                  NOT NULL VARCHAR2(30)

 USER_ID                                   NOT NULL NUMBER

SQL> drop view v$tianmao;

View dropped.

当删除了这个视图之后,再次访问时,oracle选择访问了v$tianmao同义词:

SQL> desc v$tianmao;

 Name                                      Null?    Type

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

 USERNAME                                  NOT NULL VARCHAR2(30)

SQL>

八,数据字典视图

数据字典视图是在X$表和数据字典表之上创建的视图,在创建数据库时由catalog.sql脚本(该脚本位于$ORACLE_HOME/rdbms/admin/目录下)创建。按照前缀的不同,数据字典视图通常被分为以下3类:

1, USER_类视图:包含了用户所拥有的相关对象信息。

通常USER_类视图不包含Owner字段,查询潜在的返回当前用户的对象信息。

crate or replace view USER_TABLES(....where o.owner#=userenv('SCHEMAID'))

注意到where条件中的这样的一个限制:

where o.owner#=userenv('SCHEMAID')

这就限制了当前查询返回当前用户的SCHEMA对象信息。

2, ALL_类视图:包含了用户有权限访问的所有对象的信息。

而对于ALL_TABLES视图,在Where子句中,关于用户部分,增加了这样的一个条件:

and(o.owner#=userenv('SCHEMAID'))

or o.obj# in

(select oa.obj#

from sys.objauth$ oa

where grantee# in (select kzrorol

from x$kzsro

))

这个条件扩展了关于用户有权访问的对象信息,所以实际上USER_TABLES的结果是ALL_TALBES结果的一个子集。

3DBA_类视图:包含了数据库所有相关对象的信息。

DBA_TABLES视图的Where条件中,没有关于Owner的限制,所以查询返回了数据库中的所有的表的信息。

4案例:

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

  COUNT(*)

----------

       613

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

  COUNT(*)

----------

       372

 

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

  COUNT(*)

----------

       396

SQL> select count(*) from v$fixed_table;

 

  COUNT(*)

----------

      1383

 

SQL> select * from  v$version;

BANNER

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

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

PL/SQL Release 10.2.0.1.0 - Production

CORE    10.2.0.1.0      Production

TNS for Linux: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 - Production

SQL>

5案例:

SQL> select view_definition from v$fixed_view_definition a where a.VIEW_NAME='V

$PARAMETER';

VIEW_DEFINITION

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

select  NUM , NAME , TYPE , VALUE , DISPLAY_VALUE, ISDEFAULT , ISSES_MODIFIABLE

, ISSYS_MODIFIABLE , ISINSTANCE_MODIFIABLE, ISMODIFIED , ISADJUSTED , ISDEPRECAT

ED, DESCRIPTION, UPDATE_COMMENT, HASH  from GV$PARAMETER where inst_id = USERENV

('Instance')

SQL> select view_definition from v$fixed_view_definition a  where a.VIEW_NAME='GV

$PARAMETER';

VIEW_DEFINITION

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

select x.inst_id,x.indx+1,ksppinm,ksppity,ksppstvl, ksppstdvl, ksppstdf,  decode

(bitand(ksppiflg/256,1),1,'TRUE','FALSE'),  decode(bitand(ksppiflg/65536,3),1,'I

MMEDIATE',2,'DEFERRED',                                  3,'IMMEDIATE','FALSE'),

  decode(bitand(ksppiflg,4),4,'FALSE',                                     decod

e(bitand(ksppiflg/65536,3), 0, 'FALSE', 'TRUE')),     decode(bitand(ksppstvf,7),

1,'MODIFIED',4,'SYSTEM_MOD','FALSE'),  decode(bitand(ksppstvf,2),2,'TRUE','FALSE

'),  decode(bitand(ksppilrmflg/64, 1), 1, 'TRUE', 'FALSE'),  ksppdesc, ksppstcmn

t, ksppihash  from x$ksppi x, x$ksppcv y where (x.indx = y.indx) and  ((translat

e(ksppinm,'_','#') not like '##%') and    ((translate(ksppinm,'_','#') not like

'#%')      or (ksppstdf = 'FALSE') or      (bitand(ksppstvf,5) > 0)))

SQL>

注:在这里可以看到GV$PARAMETER 来源于想x$ksppix$ksppcv 两个X$表,x$ksppix$ksppcv基本上包含了数据库参数,v$parameter展现的是不包含“_”开头的参数,以“_”开头的参数通常称为隐含参数,一般不为人知,不建议修改。

九,视图还是同义词

除了SYS用户以外,其他用户不能查询v$视图,v$视图也不能被授权给其他用户。

SQL> conn / as sysdba

Connected.

SQL> grant select on v$parameter to tianmao;

grant select on v$parameter to tianmao               *

ERROR at line 1:

ORA-02030: can only select from fixed tables/views

SQL> conn tianmao/tianmao

Connected.

SQL> desc sys.v$parameter;

ERROR:

ORA-04043: object sys.v$parameter does not exist

SQL> desc v$parameter;

 Name                                      Null?    Type

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

 NUM                                                NUMBER

 NAME                                               VARCHAR2(80)

 TYPE                                               NUMBER

 VALUE                                              VARCHAR2(512)

 DISPLAY_VALUE                                      VARCHAR2(512)

 ISDEFAULT                                          VARCHAR2(9)

 ISSES_MODIFIABLE                                   VARCHAR2(5)

 ISSYS_MODIFIABLE                                   VARCHAR2(9)

 ISINSTANCE_MODIFIABLE                              VARCHAR2(5)

 ISMODIFIED                                         VARCHAR2(10)

 ISADJUSTED                                         VARCHAR2(5)

 ISDEPRECATED                                       VARCHAR2(5)

 DESCRIPTION                                        VARCHAR2(255)

 UPDATE_COMMENT                                     VARCHAR2(255)

 HASH                                               NUMBER

SQL>

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

转载于:http://blog.itpub.net/29611940/viewspace-1143690/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值