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