Chinaunix首页 | 论坛 | 博客
  • 博客访问: 233515
  • 博文数量: 57
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 674
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-30 22:48
个人简介

2014,换个角度,希望接下来的事情值得期待。

文章分类

全部博文(57)

文章存档

2015年(1)

2014年(55)

2013年(1)

我的朋友

分类: Oracle

2014-01-12 18:34:08

数据字典由表和视图组成,存储数据库结构信息的一些对象。比如创建者和创建时间信息,所属表空间,用户权限及所占空间大小等。它们可以
被查询,但是不能进行修改操作。数据字典存储于SYSTEM表空间。

数据字典通常是创建和安装数据库时被创建,其中的表不能被直接访问,但是可以访问基于表的视图。
一.数据字典包括:
1.1 数据库模式对象信息,如表,视图,索引和簇等。
1.2 分配的空间,以及使用的空间。
1.3 列的缺省值
1.4 用户名字
1.5 列的缺省值
1.6 用户及角色权限信息
1.7 用户访问或使用的审计信息
1.8 其它信息

二、数据字典分类
数据字典分为数据字典表和字典视图。
2.1 数据字典表
字典表存储的是系统数据,通过以"$"结尾,属于SYS用户,由脚本$ORACLE_HOME/rdbms/admin/sql.bsq创建。
数据字典表,只能Oracle内部进行修改。
2.2视图
分为动态视图和静态视图,视图由$ORACLE_HOME/rdbms/admin/catalog.sql创建。数据库升级时,需要执行这个脚本,重新创建动态视图。
2.2.1静态视图:
静态视图主要由user_*,all_*,dba_*三类构成。
user_*表示当前用户所拥有的对象的信息。
all_*存储了当前用户能访问的对象的信息,包括当前用户及有权限访问的用户对象。
dba_*存储了数据库所有对象的信息。一般需要有管理员权限。
由于视图由SYS用户创建,所以需要加上SYS访问,为了访问方便,ORALCE在每个字典的视图上建立的同名的公共同义词(public synonyms),这样就省去写SYS.麻烦。
常用的以user_*为前缀的对象包括 user_tables,user_indexes,user_views,user_objects,user_users等。
2.2.2动态视图:
除了静态视图,其他都是v$和gv$视图,这些视图会即时更新,从而反应内存和磁盘的变化情况。
v$视图基于x$虚拟视图,v$视图是SYS用户所拥有的,默认只有SYS用户和拥有DBA权限的用户可以看到所有视图。动态视图记录了当前数据库的变化情况,存在于数据库运行期间,
实际信息来自于内存和控制文件。可以使用动态视图来监控数据库运行情况。

常用的视图类别解释如下:
视图类别    描述
COL_PRIVS    包含了表的列权限,包括授予者、被授予者和权限 
EXTENTS    数据范围信息,比如数据文件,数据段名和大小等
INDEXES    索引信息,比如类型、唯一性和被涉及的表 
IND_COLUMNS    索引列信息,比如索引上的列的排序方式 
OBJECTS    对象信息,比如状态和 DDL time   
ROLE_PRIVS    角色权限,比如 GRANT 和 ADMIN 选项 
SEGMENTS    表和索引的数据段信息,比如 tablespace 和 storage 
SEQUECNCES    序列信息,比如序列的 cache、cycle 和 ast_number 
SOURCE    除触发器之外的所有内置过程、函数、包的源代码 
SYNONYMS    别名信息,比如引用的对象和数据库链接 db_link 
SYS_PRIVS    系统权限,比如 grantee、privilege、admin 选项 
TAB_COLUMNS    表和视图的列信息,包括列的数据类型 
TAB_PRIVS    表权限,比如授予者、被授予者
TABLES     表信息,比如表空间,存储参数和数据行的数量 
TRIGGERS    触发器信息,比如类型、事件、触发体(trigger body) 
USERS     用户信息,比如临时的和缺省的表空间 
VIEWS     视图信息,包括视图定义

其它非常用视图
USER_COL_PRIVS_MADE    用户授予其他用户的列权限 
USER_COL_PRIVS_RECD    用户获得的列权限 
USER_TAB_PRIVS_MADE    用户授予其他用户的表权限 
USER_TAB_PRIVS_RECD    用户获得的表权限

当数据库管理员启动实例时,ORACLE自动创建动态性能视图,停止时,又自动删除动态性能视图。数据字典信息从数据文件中获得,
而动态性能视图从SGA及控制文件中获得。可能通过动态性能视图来获得数据库相关性能数据情况,如内存使用,磁盘I/O

数据库实例位于不同状态时,动态性能视图的读取情况不同。
1.nomount状态。实例启动时,Oracle数据库会打开参数文件,分配SGA内存并启用后台进程,此时,控制文件没有读取,数据库没有加载,
因此动态性能视图的获取来源只有SGA,视图数据相对较少。
2.mount状态。数据库打开所有参数文件,因此控制文件的信息被收集。
3.open状态。此时数据库会打开所有数据库文件及重做日志,此时,才可以访问数据字典视图。

2.2.3 v$,v_$,gv$,x$视图
x$:包括特定实例的信息,如当前配置信息、实例会话,性能信息等。其只驻留于内存,在内存中进行实时维护,为SYS用户,并且只读,不能做DML
操作。x$不允许DBA之后的用户直接访问。关于x$创建信息可以通过bootstrap$表查看。bootstrap$实际存储的是数据字典的基表的定义。
v$是v_$的公共同义词,每个视图返回当前实例的信息。
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')


GV$视图,每个V$视图对应一个GV$视图,并行服务器下,可查询所限定实例中的V$视图的信息。GV$视图比V$视图多一个INST_ID字段,用来
获得实例号。
2.2.4 v$fixed_view_definition视图
用来查询获取组成V$视图的X$表的所有信息。可以通过VIEW_DEFINITION查询视图定义。
2.2.5对象或同义词判断 
SQL> select object_type from all_objects where object_name=upper('V$FIXED_TABLE');
 
OBJECT_TYPE
-------------------
SYNONYM
2.2.6常用动态视图
 1 v$sysstat  
 2 v$sesstat  
 3 v$sql & v$sql_plan  
 4 v$sqltext & v$sqlarea  
 5 v$session  
 6 v$session_wait & v$session_event  
 7 v$process  
 8 v$lock & v$locked_object  
 9 v$filestat  
 10 v$session_longops  
 11 v$latch$ v$latch_children  
 12 v$db_object_cache  
 13 v$open_cursor  
 14 v$parameter & v$system_parameter 
 15 v$rollstat  
 16 v$rowcache   
 17 v$segstat & v$segment_statistics  
 18 v$system_event 
 19 v$undostat   
 20 v$waitstat
 
 实例启动,先创建X$表,然后创建GV_$和V_$视图,再基于这两个视图创建GV$和V$同义词,通过V$FIXED_VIEW_DEFINITON查看。运行期间,动态性能实图保存在
 内存中。实例关闭时,自动删除动态性能实图。
 
2.2.6与性能相关的视图和参数。
v$sql:它通常与v$session一起使用获得当前会话的SQL执行情况。可以通过该视图查看正在执行的SQL及这条SQL运行了多长时间及等待事件等。

SQL> select sid from v$session;
 
       SID
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        21
 
       SID
----------
        22
        23
        24
        27
        29
        31
        33
        36
        38
        40
        42
        43
        46
        49
        51
SQL> select a.sql_text ,b.status,b.last_call_et,b.event from v$sql a join v$session b on(a.sql_id = b.sql_id) where b.sid=33;
 
SQL_TEXT                                                                         STATUS   LAST_CALL_ET EVENT
-------------------------------------------------------------------------------- -------- ------------ ------------------------------
 select a.sql_text ,b.status,b.last_call_et,b.event from v$sql a join v$session  ACTIVE              0 SQL*Net message from client
 
 2.2.7 使用V$SQL查看SQL执行时间等信息
对于已经执行完毕的会话,可以在V$SQL视图查看相关的CPU和执行时间信息。
SQL> select sql_text,
  2         cpu_time / (1000 * 1000) cpu_time,
  3         trunc(elapsed_time / (1000 * 1000)) elapsed_time,
  4         (cpu_time / elapsed_time / (1000 * 1000)) * 100 pct_ratio
  5    from v$sql
  6   where sql_text like 'select * from jerry.bigtab%';
 
SQL_TEXT                                                                           CPU_TIME ELAPSED_TIME  PCT_RATIO
-------------------------------------------------------------------------------- ---------- ------------ ----------
select * from jerry.bigtab                                                         0.173973            0 4.36246693


如果ELAPSED_TIME 时间多,而CPU_TIME时间少,说明此SQL处于等待状态。


因为ORACLE会动态的更新共享池信息,所以并非所有的SQL都能从V$SQL中获得。可以手工清理共享池信息,以便为新的
SQL提供共享池空间。
SQL> alter system flush shared_pool;
 
System altered


SQL解析时,会把硬解析过的SQL放进共享池,如果清空,则需要重新硬解析。
验证如下:
1.开户SQL_TRACE
2.完成一个事务
3.清空SHARED_POOL
4.再完成一条同样的事务。
5.关闭SQL_TRACE
6.查看TRACE文件
SQL> alter session set sql_trace=true;
 
Session altered


SQL>  alter session set tracefile_identifier='thiisonesqltrace';


Session altered.


SQL> alter session set events '10046 trace name context forever, level 12';


Session altered.
SQL>  create table testsqltrace (id number);


Table created.


SQL> insert into testsqltrace values(3);


1 row created.


SQL> commit;


Commit complete
SQL>  select address, hash_value, executions, sql_text
  2      from v$sql
  3     where upper(sql_text) like 'INSERT INTO TESTSQLTRACE VALUES(3)%';
 
ADDRESS  HASH_VALUE EXECUTIONS SQL_TEXT
-------- ---------- ---------- --------------------------------------------------------------------------------
3A906C34 3804506489          1 insert into testsqltrace values(3)


SQL> alter system flush shared_pool;


System altered.


SQL> insert into testsqltrace values(3);


1 row created.


SQL>  select address, hash_value, executions, sql_text
  2      from v$sql
  3     where upper(sql_text) like 'INSERT INTO TESTSQLTRACE VALUES(3)%';
 
ADDRESS  HASH_VALUE EXECUTIONS SQL_TEXT
-------- ---------- ---------- --------------------------------------------------------------------------------
3AA16CD4 3214544850          1 insert into testsqltrace values(3)


SQL> alter session set sql_trace=false;


Session altered.


SQL> alter session set events '10046 trace name context off';


Session altered.


2.2.8V$SQL_SHARED_CURSOR
用来存储SQL执行过程中游标信息。
SQL> show parameter cursor_sharing;
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
cursor_sharing                       string      EXACT


SQL>   select parsing_user_id,
  2           parsing_schema_id,
  3           sql_text,
  4           sql_id,
  5           child_address
  6      from v$sql
  7     where upper(sql_text) like 'INSERT INTO TESTSQLTRACE VALUES(3)%';
 
PARSING_USER_ID PARSING_SCHEMA_ID SQL_TEXT                                                                         SQL_ID        CHILD_ADDRESS
--------------- ----------------- -------------------------------------------------------------------------------- ------------- -------------
              0                 0 insert into testsqltrace values(3)                                               60scy5qztn3yk 31D16224
 
如果SQL_ID和SQL_TEXT相同,则表示SQL没能重用。 可以用如下SQL查询。
SQL> select * from v$sql_shared_cursor where sql_id='60scy5qztn3yk';
 
SQL_ID        ADDRESS  CHILD_ADDRESS CHILD_NUMBER UNBOUND_CURSOR SQL_TYPE_MISMATCH OPTIMIZER_MISMATCH OUTLINE_MISMATCH STATS_ROW_MISMATCH LITERAL_MISMATCH FORCE_HARD_PARSE EXPLAIN_PLAN_CURSOR BUFFERED_DML_MISMATCH PDML_ENV_MISMATCH INST_DRTLD_MISMATCH SLAVE_QC_MISMATCH TYPECHECK_MISMATCH AUTH_CHECK_MISMATCH BIND_MISMATCH DESCRIBE_MISMATCH LANGUAGE_MISMATCH TRANSLATION_MISMATCH BIND_EQUIV_FAILURE INSUFF_PRIVS INSUFF_PRIVS_REM REMOTE_TRANS_MISMATCH LOGMINER_SESSION_MISMATCH INCOMP_LTRL_MISMATCH OVERLAP_TIME_MISMATCH EDITION_MISMATCH MV_QUERY_GEN_MISMATCH USER_BIND_PEEK_MISMATCH TYPCHK_DEP_MISMATCH NO_TRIGGER_MISMATCH FLASHBACK_CURSOR ANYDATA_TRANSFORMATION INCOMPLETE_CURSOR TOP_LEVEL_RPI_CURSOR DIFFERENT_LONG_LENGTH LOGICAL_STANDBY_APPLY DIFF_CALL_DURN BIND_UACS_DIFF PLSQL_CMP_SWITCHS_DIFF CURSOR_PARTS_MISMATCH STB_OBJECT_MISMATCH CROSSEDITION_TRIGGER_MISMATCH PQ_SLAVE_MISMATCH TOP_LEVEL_DDL_MISMATCH MULTI_PX_MISMATCH BIND_PEEKED_PQ_MISMATCH MV_REWRITE_MISMATCH ROLL_INVALID_MISMATCH OPTIMIZER_MODE_MISMATCH PX_MISMATCH MV_STALEOBJ_MISMATCH FLASHBACK_TABLE_MISMATCH LITREP_COMP_MISMATCH PLSQL_DEBUG LOAD_OPTIMIZER_STATS ACL_MISMATCH FLASHBACK_ARCHIVE_MISMATCH LOCK_USER_SCHEMA_FAILED REMOTE_MAPPING_MISMATCH LOAD_RUNTIME_HEAP_FAILED HASH_MATCH_FAILED PURGED_CURSOR BIND_LENGTH_UPGRADEABLE
------------- -------- ------------- ------------ -------------- ----------------- ------------------ ---------------- ------------------ ---------------- ---------------- ------------------- --------------------- ----------------- ------------------- ----------------- ------------------ ------------------- ------------- ----------------- ----------------- -------------------- ------------------ ------------ ---------------- --------------------- ------------------------- -------------------- --------------------- ---------------- --------------------- ----------------------- ------------------- ------------------- ---------------- ---------------------- ----------------- -------------------- --------------------- --------------------- -------------- -------------- ---------------------- --------------------- ------------------- ----------------------------- ----------------- ---------------------- ----------------- ----------------------- ------------------- --------------------- ----------------------- ----------- -------------------- ------------------------ -------------------- ----------- -------------------- ------------ -------------------------- ----------------------- ----------------------- ------------------------ ----------------- ------------- -----------------------
60scy5qztn3yk 3AA16CD4 31D16224                 0 N              N                 N                  N                N                  N                N                N                   N                     N                 N                   N                 N                  N                   N             N                 N                 N                    N                  N            N                N                     N                         N                    N                     N                N                     N                       N                   N                   N                N                      N                 N                    N                     N                     N              N              N                      N                     N                   N                             N                 N                      N                 N                       N                   N                     N                       N           N                    N                        N                    N           N                    N            N                          N                       N                       N                        N                 N             N
 
如果其中有Y,就是不能重用的原因。


2.2.9 V$SESSION
本视图提供用户会话信息。machine是客户端机器名,username是连接用户名,program客户端程序名称。module是DBMS_ALLPLCATION_INFO.SET_MODULE给的执行程序名。
查询只适合CS架构,对于BS架构,则要在在应用服务器(WEBLOGIC,WEBSPHERE等)进行跟踪,确定用户信息。此视图主要用来查询用户状态,当前SQL,执行时间及等待
事件等。
last_call_et:执行时间,当SESSION处于ACTIVE状态时,表示SESSION变成ACTIVE到现在的时间。当SESSION处于INACTIVE状态时,表示SESSION变成INACTIVE到现在的时间。
SQL> select b.sid, a.sql_text, b.status, b.last_call_et, b.event
  2    from v$sql a
  3    join v$session b
  4      on (a.sql_id = b.sql_id)
  5  /
 
       SID SQL_TEXT                                                                         STATUS   LAST_CALL_ET EVENT
---------- -------------------------------------------------------------------------------- -------- ------------ ----------------------------------------------------------------
        33  select b.sid, a.sql_text, b.status, b.last_call_et, b.event   from v$sql a   jo ACTIVE              0 SQL*Net message from client
 
SQL> 
SQL> select b.sid, a.sql_text, b.status, b.last_call_et, b.event
  2    from v$sql a
  3    join v$session b
  4      on (a.sql_id = b.sql_id)
  5   where b.sid = '33';
 
       SID SQL_TEXT                                                                         STATUS   LAST_CALL_ET EVENT
---------- -------------------------------------------------------------------------------- -------- ------------ ----------------------------------------------------------------
        33  select b.sid, a.sql_text, b.status, b.last_call_et, b.event   from v$sql a   jo ACTIVE              0 SQL*Net message from client

如果在RAC状态,则要查询GV$SESSION视图,里面有INST_ID字段,用来区分不同的实例。


2.2.10V$SESSSTAT
用来查询某个SESSION所占用的资源统计数据。
SQL> select a.sid, b.name, a.value
  2    from v$sesstat a
  3    join v$statname b
  4      on (a.statistic# = b.statistic#)
  5     and a.sid = 33;
 
       SID NAME                                                                  VALUE
---------- ---------------------------------------------------------------- ----------
        33 OS CPU Qt wait time                                                       0
        33 logons cumulative                                                         1
        33 logons current                                                            1
        33 opened cursors cumulative                                              1868
        33 opened cursors current                                                    2
...................................................................................


2.2.11 v$session_wait
用来记录会话等待信息。
SQL> SELECT event,
  2         p1,
  3         p1text,
  4         p2,
  5         p2text,
  6         p3,
  7         p3text,
  8         wait_time,
  9         seconds_in_wait,
 10         state
 11    FROM v$session_wait
 12   WHERE sid = 33
 13  /
 
EVENT                                                                    P1 P1TEXT                                                                   P2 P2TEXT                                                                   P3 P3TEXT                                                            WAIT_TIME SECONDS_IN_WAIT STATE
---------------------------------------------------------------- ---------- ---------------------------------------------------------------- ---------- ---------------------------------------------------------------- ---------- ---------------------------------------------------------------- ---------- --------------- -------------------
SQL*Net message from client                                      1413697536 driver id                                                                 1 #bytes    

阅读(1773) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~