ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 深入浅出Oracle学习笔记(3)

深入浅出Oracle学习笔记(3)

原创 Linux操作系统 作者:gvora 时间:2009-04-30 10:34:13 0 删除 编辑

第三章       数据字典

数据字典由四部分组成:

1、内部RDBMS(X$)

X$Oracle数据库的核心部分,这些表用于跟踪内部数据库信息,维护数据库的正常运行。X$表是加密的,Oracle通过X$表建立起其他大量视图,提供用户查询管理数据库之用。X$表是Oracle数据库的运行基础,在数据库启动时由Oracle应用程序动态创建。Oracle不允许sysdba之外的用户直接访问X$表,显示授权不被允许。

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

SQL> set autotrace trace explain

SQL> select * from v$parameter;

 

Execution Plan

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

   0      SELECT STATEMENT ptimizer=CHOOSE

   1    0   MERGE JOIN

   2    1     FIXED TABLE (FULL) OF 'X$KSPPCV'

   3    1     FILTER

   4    3       SORT (JOIN)

   5    4         FIXED TABLE (FULL) OF 'X$KSPPI'

 

介绍X$KVIT,名称含义为:[K]ernel Layer Performance Layer [V] [I]nformation tables [T]ransitory Instance parameters,这个视图记录的是和实例相关的一些内部参数设置。

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

 

KVITTAG       KVITVAL KVITDSC

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

kcbnbh           3000 number of buffers

kcbldq             25 large dirty queue if kcbclw reaches this

kcbdsp             25 Max percentage of LRU list dbwriter can scan for dirty

kcbfsp             40 Max percentage of LRU list foreground can scan for free

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

 

kcbdsp             25 Max percentage of LRU list dbwriter can scan for dirty

触发DBWR写动作的条件之一:脏数据域值达到,从上面得知为25%

kcbfsp             40 Max percentage of LRU list foreground can scan for free

触发DBWR写动作的条件之二:No Free Buffer,也就是当进程扫描LRU一定数量的Block之后,如果还找不到足够的Free空间,则触发DBWR执行写出,从上面得知这个比例为40%

 

2、数据字典表

数据字典表用以存储表、索引、约束以及其他数据库结构的信息,这些对象通常以“$”结尾(如tab$obj$ts$等),在创建数据库的时候通过sql.bsq脚本来创建。

 

3、动态性能视图

动态性能视图记录了数据库运行时信息和统计数据,大部分动态性能视图被实时更新以反应数据库当前状态。

在数据库启动时,Oracle动态创建X$表,在此基础上创建了GV$V$视图。

GV$视图的产生是为了满足OPS环境的需要,在OPS环境中,查询GV$视图返回所有实例信息,而每个V$视图是基于GV$视图,增加了INST_ID列的where条件限制,只包含当前连接实例信息。

注意,每个V$视图都包含类似语句:where inst_id=userenv(‘Instance’)

 

Oracle提供了一些特殊视图用以记录其他视图的创建方式,V$FIXED_VIEW_DEFINITION就是其中之一。

SQL> select view_definition from v$fixed_view_definition

  2  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

  2  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

可以看出,GV$视图基于X$表创建,然后V$视图基于GV$视图创建。

 

GV$V$之后,Oracle建立了GV$V$视图,随后为这些视图建立了公用同义词。这些工作都是通过catalog.sql脚本实现的。

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

SQL> show user

USER "SYS"

SQL> grant select on v$sga to scott;

grant select on v$sga to scott

                *

ERROR 位于第 1 :

ORA-02030: 只能从固定的表/视图查询

 

SQL> grant select on v_$sga to scott;

授权成功。

实际上通常大部分用户访问的v$对象,并不是视图,而是指向v_$视图的同义词,而v_$视图是基于真正的v$视图(这个视图是基于x$表建立的)创建的。

在进行数据访问时,Oracle访问view优先,然后是同义词。

SQL> conn scott/tiger

已连接。

SQL> create view v_$gvora as select username from all_users;

视图已建立。

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

同义词已创建。

SQL> conn / as sysdba

已连接。

SQL> create view v$gvora as select username,user_id from user_users;

视图已建立。

SQL> desc v$gvora

 名称                                      是否为空? 类型

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

 USERNAME                                  NOT NULL VARCHAR2(30)

 USER_ID                                   NOT NULL NUMBER

SQL> drop view v$gvora;

视图已丢掉。

SQL> desc v$gvora

 名称                                      是否为空? 类型

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

 USERNAME                                  NOT NULL VARCHAR2(30)

 

4、数据字典视图

数据字典视图是在X$表和数据字典表之上创建的视图,在创建数据库时由catalog.sql脚本创建。

按照前缀的不同,数据字典视图通常被分成3类:

USER_类视图:包含了用户所拥有的相关对象信息,通过where o.owner#=userenv(‘SCHEMAID’)进行限制;

ALL_类视图:包含了用户有权限访问的所有对象的信息,这个条件扩展了用户有权限访问的对象信息;

DBA_类视图:包含了数据库所有相关对象的信息,没有关于owner的限制,查询返回数据库中所有表的信息。

 

数据字典视图的定义通过DBMS_METADATE.GET_DDL来得到:

SQL> select dbms_metadata.get_ddl('VIEW','DBA_USERS','SYS') from dual;

DBMS_METADATA.GET_DDL('VIEW','DBA_USERS','SYS')

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

  CREATE OR REPLACE FORCE VIEW "SYS"."DBA_USERS" ("USERNAME", "USER_ID", "PASSWO

PIRY_DATE", "DEFAULT_TABLESPACE", "TEMPORARY_TABLESPACE", "CREATED", "PROFILE",

"INITIAL_RSRC_CONSUMER_GROUP", "EXTERNAL_NAME") AS

  select u.name, u.user#, u.password,

…………………..

 

SQL> conn / as sysdba

已连接。

SQL> select * from v$version;

BANNER

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

Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production

PL/SQL Release 9.2.0.1.0 - Production

CORE    9.2.0.1.0       Production

TNS for 32-bit Windows: Version 9.2.0.1.0 - Production

NLSRTL Version 9.2.0.1.0 – Production

 

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

  COUNT(*)

----------

       394

 

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

  COUNT(*)

----------

       259

 

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

  COUNT(*)

----------

       259

 

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

  COUNT(*)

----------

       912

 

在非SYS用户下查询,当访问v$parameter对象时,访问的是视图还是同义词?

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

 

Oracle如何通过同义词定位对象?

使用10046事件进行跟踪

Alter session set events ‘10046 trace name context forever,level 12’;

Select count(*) from v$parameter;

Exit;

详细内容见书P105-P107

 

总结SQL语句中Oracle对于对象名的解析顺序:

Oracle首先查看在发出命令的用户模式中是否存在表或视图;

如果表或视图不存在,Oracle检查私有同义词是否存在;

如果私有同义词存在,将使用这个同义词所引用的对象;

如果私有同义词不存在,检查同名的公共同义词是否存在;

如果公共同义词存在,将使用这个同义词所引用的对象;

如果公共同义词不存在,Oracle返回消息“ORA_00942 table or view does not exist”。

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

请登录后发表评论 登录
全部评论

注册时间:2008-12-30

  • 博文量
    62
  • 访问量
    288406