一,数据字典(Data Dictionary)
是Oracle数据库的一个重要组成成分,是元数据(Metadata)的存储地点。Oracle RDBMS使用数据字典记录和管理对象信息和安全信息等。
二,数据字典包括以下内容:
1,所有数据库Schema对象的定义(表、视图、索引、聚簇、同义词、序列、过程、函数、包、触发器等)
2,数据库的空间分配和使用情况
3,字段的缺省值
4,完整性约束信息
5,oracle用户名称、角色、权限等信息;
6,审计信息
7,其他数据库信息
三,数据字典有四部分组成:
内部RDBMS(X$)表、数据字典表、动态性能(v$)视图和数据字典视图
四,内部RDBMS(X$)表
1, X$表示oracle数据库的核心部分,这些表用于跟踪内部数据库信息,维持数据库的正常运行。
2,X$表是加密命令的,而且oracle文档不做说明,这部分只是是oracle公司的技术机密,oracle通过这些X$建立起其他大量视图,提供用户查询管理数据库之用。但是由于X$表记录了大量的有用信息,最为人所熟知的有X$BH、X$KSMSP等。
3,X$表是oracle数据库运行的基础,在数据库启动时由oracle应用程序动态创建。这部分表对数据库来说至关重要,oracle不允许SYSDBA之外的用户直接访问,显示授权不被允许。
发现、观察、研究X$表的一个好办法是借用Oracle的autotrace功能,当查询一些常用视图的时候,可以通过autotrace功能发现这些view的底层表。
4,autotrace
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
2,No 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数据库的状态展示出来。
1,GV$和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')
用于限制当前的实例信息。
2,Oracle提供了一些特殊视图用以记录其他视图的创建方式。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>
3,GV$视图和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_$视图,oracle把V$视图和普通用户隔离,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结果的一个子集。
3,DBA_类视图:包含了数据库所有相关对象的信息。
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$ksppi和x$ksppcv 两个X$表,x$ksppi和x$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/