官网:
1.1.1.1Oracle的数据字典
数据字典(Data Dictionary)也就是通常所说的系统目录,它是Oracle数据库中最重要的组成部分。数据字典记录了数据库的系统信息,它是只读表和视图的集合,数据字典的所有者为SYS用户,所有的数据字典表和视图都被储存在该数据库的SYSTEM表空间中。用户只能在数据字典上执行查询操作,而其维护和修改是由系统自动完成的。数据字典中存放了数据库自身的很多信息,包括了用于描述数据库和它的所有对象的信息,所以,数据字典是每个Oracle数据库的核心。例如一个表的创建者信息,创建时间信息,所属表空间信息,用户访问权限信息等。
Oracle数据字典可以包括四个层次,分别为X$内部表、基础数据字典表、数据字典视图和动态性能视图。
一.内部RDBMS(X$)表
X$表是Oracle数据库的核心部分,用于跟踪数据库内部信息,维护数据库的正常运行。X$是加密命名的,而且oracle官方文档不做说明,例如,X$BH、X$KSMSP等。X$表是Oracle数据库的运行基础,在数据库启动时由Oracle应用程序自动创建。所以,Oracle不允许SYSDBA以外的用户直接访问,也不能授权给其他用户。一般而言,对于这种对象,进行观察、发现、研究X$表的好办法是借用Oracle的AUTOTRACE功能,当查询一些视图时,可以发现这些X$底层表,例如查询V$PARAMETER时。
普通用户如何查询X$内部表呢?以X$BH表为例,以SYS用户执行以下命令即可:
CREATE OR REPLACE VIEW BH AS SELECT * FROM
SYS.X$BH;
CREATE OR REPLACE PUBLIC SYNONYM X$BH FOR BH;
二.数据字典表
数据字典表用以存储表、索引、约束以及其他数据库结构的信息。这些对象通常是以“$”结尾(例如:TAB$、OBJ$、TS$等)。Bsq是非常重要的一个文件,其中包含了数据字典的定义以及注释说明,深入学习Oracle数据库的用户都应该仔细阅读该文件,该文件位于$ORACLE_HOME/rdbms/admin目录下(在Oracle 11g中bsq文件被分别归类到不通的.bsq文件)。这些数据字典表对于数据库的稳定运行生死攸关,所以通常Oracle不允许直接对数据字典进行操作。当用户执行DDL和DML操作时,在后台Oracle将这些操作解析为对于数据字典的自动执行。
三.静态数据字典视图
由于X$表和数据字典表通常不能直接访问,因此,Oracle创建了静态数据字典视图提供用户对于数据字典信息的访问,由于这些信息相对稳定、不能直接修改,所以又被称为静态数据字典视图。静态数据字典主要反应的是数据库中的对象信息。静态数据字典视图是由catalog.sql脚本创建(在$ORACLE_HOME/rdbms/admin下)。静态数据字典中的视图可以分为三类,它们分别由三个前缀构成:USER_*、ALL_*和DBA_*。
(1)USER_*:该类视图存储了关于当前用户所拥有的对象的信息,即所有在该用户模式下的对象,例如:USER_USERS、USER_TABLES、USER_VIEWS。
(2)ALL_*:该类视图存储了当前用户能够访问的对象的信息。(与USER_*相比,ALL_*并不需要拥有该对象,只需要具有访问该对象的权限即可),例如:ALL_USERS、ALL_TABLES、ALL_VIEWS。
(3)DBA_*:该类视图存储了数据库中所有对象的信息。(前提是当前用户具有访问这些数据库的权限,一般来说,必须具有管理员权限)。例如:DBA_USERS、DBA_TABLES、DBA_VIEWS。
这里要说明一下,并不是所有的对象都是有三层对象视图,有时候all_层视图是被省略掉的,例如dba_recyclebin,就没有对应的all_层视图。
四.动态性能视图
Oracle包含了一些潜在的由系统管理员如SYS维护的表和视图,由于当数据库运行的时候它们会不断进行更新,所以,称它们为动态数据字典,也称为动态性能视图(Dynamic Performance Views)。这些视图提供了关于内存和磁盘的运行情况,记录了数据库运行时信息和统计数据,大部分动态性能视图被实时更新以反映数据库的当前状态。所以,只能对其进行只读访问而不能修改它们。动态数据字典是依赖数据库运行的性能的,反映数据库运行的一些内在信息,所以,在访问这类数据字典时往往不是一成不变的。动态性能视图基于从数据库内存结构构建的虚拟表。因此,它们不是存储在数据库中的常规表。由于数据动态更新,所以,动态性能视图的读一致性不能保证。
SYS是这些动态性能表的所有者,这些表的名字都以V_$开头,基于这些表的视图被创建后,Oracle还会为视图创建公共同义词。同义词名称以V$开头,例如,视图V$DATAFILE包含数据库数据文件的信息,而V$FIXED_TABLE包含数据库中所有动态性能表和视图的信息。NOMOUNT状态不能查询所有的V$视图。因为动态性能视图不是真实表,所以数据依赖于数据库和实例的状态。例如,当数据库处于NOMOUNT时,可以查询V$INSTANCE和V$BGPROCEP。但是,在MOUNT数据库之前,不能查询V$DATAFILE。
数据字典基表是在任何Oracle数据库中创建的第一个对象。数据库的所有数据字典表和视图都存储在系统表空间中。所以,数据字典视图是受读一致性的影响的。因为当数据库打开时,系统表空间总是联机的,所以当数据库打开时,数据字典总是可用的。总之,运用好数据字典技术,可以让数据库开发人员能够更好地了解数据库的全貌,这样对于数据库优化、管理等有极大的帮助。
v$动态视图是描述Oracle当前运行状态的一系列视图集合。这部分视图的特点是以v$开头,描述系统当前状态信息。常见常用的如V$SESSION、V$SESSION_WAIT(Oracle 10g后,其中内容融入到V$SESSION中)、V$LOCK和V$SYSSTAT等。只有赋予了SELECT ANY DICTIONARY权限的用户才可以查询所有的V$视图。
V$视图传统上是代表系统当前状态的描述,也就是即时性视图。虽然可以描述当前系统中发生的瓶颈或者性能问题,但是当瓶颈接触之后,很难发现和分析过去一个事件点的系统状态和问题SQL。同时,如果需要对运行时间段的情况进行分析,采用时间段镜像snap技术也存在一些偶然性。
从Oracle 10g开始,V$动态视图进入了一个新的时代,可以保存V$SESSION的历史信息。ASH(Active Session History)技术就是每个一个间隔的时间段,保存当前动态视图的镜像进行保存,这些信息保存7天。借助ASH技术,Oracle提出了基于历史进行分析的AWR(Automatic
Workload Report)报表。最后,从性能主动优化的出发点,提出了ADDM(Automatic
Database Diagnostic Monitor)报告,提供智能化的数据库优化提示。这些方便的功能特性,全都是基于动态视图。v$动态视图主要是针对SGA和数据库实例进程的显示。在这个过程中,Oracle使用了DMA(Direct Memory Access)技术,可以高效的获取这些分析数据。
数据库启动时,Oracle动态创建X$表,在此基础之上,Oracle创建了GV$和V$视图。从Oracle 8开始GV$视图开始被引入,其含义是Global,除一些特例之外,每个V$视图都有一个对应的GV$视图存在;GV$视图的产生是为了满足OPS/RAC环境的需要;每个V$视图都包含如下类似语句,用于限制返回当前实例的信息:
Where inst_id=USERENV('Instance');
下面介绍几个与系统数据字典视图定义有关的几个视图,而其它的视图学习也可以根据下面这几个视图来学习:
(一)DICTIONARY和DICT_COLUMNS
lDICTIONARY视图记录了全部数据字典表的名称和解释,它有一个同义词DICT。
lDICT_COLUMNS视图记录了全部数据字典表里字段名称和解释。
如果想查询跟索引有关的数据字典,那么可以使用如下SQL语句:
SELECT * FROM DICTIONARY WHERE INSTR(COMMENTS,
'index') > 0;
如果想知道数据字典中的USER_INDEXES视图中各字段的详细含义,那么可以用如下SQL语句:
SELECT COLUMN_NAME, COMMENTS
FROM
DICT_COLUMNS
WHERE
TABLE_NAME = 'USER_INDEXES';
依此类推,就可以轻松知道数据字典的详细名称和解释,不用查看Oracle的其它文档资料了。当然上面的结果也可以用如下语句来查询:
SELECT * FROM DBA_COL_COMMENTS UCC WHERE
UCC.TABLE_NAME='USER_INDEXES';
SELECT * FROM DBA_TAB_COMMENTS UTC WHERE
UTC.TABLE_NAME='USER_INDEXES';
(二)V$FIXED_TABLE和V$FIXED_VIEW_DEFINITION
面试官可能会这样问:“在Oracle中,哪个视图可以查询数据中所有底层的表?”。答案就是V$FIXED_TABLE。V$FIXED_TABLE可以查询数据库中所有底层的表。V$FIXED_TABLE视图显示数据库中所有动态性能表、视图和导出表。由于某些V$表(例如V$ROLLNAME)涉及底层的表,因此,没有列出。另外,V$FIXED_VIEW_DEFINITION这个视图包含所有固定视图(以V$起头的视图)的定义,如下所示:
SYS@ORALHRDB1> DESC V$FIXED_TABLE
Name Null?
Type
-----------------------------------------
-------- ----------------------------
NAME
VARCHAR2(30)
OBJECT_ID
NUMBER
TYPE VARCHAR2(5)
TABLE_NUM
NUMBER
SYS@ORALHRDB1>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')
SYS@ORALHRDB1> 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
可以看到底层的表主要由x$kqfta和x$kqfdt组成,而x$kqfvi主要是视图的定义。
下表给出了一些常见的数据字典及其解释:
表 STYLEREF 1 \s3-SEQ表\* ARABIC \s 115常见的数据字典
视图名称
解释
视图名称
解释
DBA_TABLES(TABS)
所有用户(当前用户)的所有表的信息
DBA_FREE_SPACE
记录系统表空间的自由空间的信息
DBA_TAB_COLUMNS(COLS)
所有用户(当前用户)的表的列的信息
V$CONTROLFILE
记录系统控制文件的基本信息
DBA_VIEWS
所有用户的所有视图信息
V$PARAMETER
记录系统各参数的基本信息
DBA_SYNONYMS(SYN)
所有用户(当前用户)同义词信息
V$CONTROLFILE_RECORD_SECTION
记录系统控制运行的基本信息
DBA_SEQUENCES(SEQ)
所有用户(当前用户)序列信息
V$DATAFILE
记录来自控制文件的数据文件信息
DBA_CONSTRAINTS
用户的表的约束信息
V$FILESTAT
记录数据文件读写的基本信息
DBA_INDEXES(IND)
所有用户(当前用户)索引的简要信息
V$DATAFILE_HEADER
记录数据文件头部的基本信息
DBA_IND_COLUMNS
所有用户索引的列信息
V$THREAD
记录日志线程的基本信息
DBA_TRIGGERS
所有用户触发器信息
V$LOG
记录日志文件的基本信息
DBA_SOURCE
所有用户存储过程信息
V$LOGFILE
记录日志文件的概要信息
DBA_SEGMENTS
所有用户段(表,索引及Cluster)使用空间的信息
V$ARCHIVED_LOG
记录归档日志文件的基本信息
DBA_EXTENTS
所有用户段的扩展段信息
V$ARCHIVE_DEST
记录归档日志的路径信息
DBA_OBJECTS
所有用户对象的基要信息
V$INSTANCE
记录当前实例的基本信息
CAT
当前用户可以访问的所有基表
V$SYSTEM_PARAMETER
显示实例当前有效的参数信息
TAB
当前用户创建的所有基表,视图,同义词等
V$SGA
显示SGA区的大小信息
DICT
构成数据字典的所有表的信息
V$SGASTAT
记录SGA使用统计详细信息
V$DATABASE
记录系统运行的情况
V$DB_OBJECT_CACHE
记录对象缓存大小信息
DBA_TABLESPACES
记录系统表空间的基本信息
V$BGPROCESS
显示后台进程信息
DBA_DATA_FILES
记录系统数据文件及表空间的基本信息
V$SESSION
显示当前会话信息
V$SORT_USAGE
显示临时段的大小及会活、可以看出哪些进程硬盘排序
V$FIXED_TABLE
列出当前发行的固定对象的说明
V$SQLAREA
列出共享区的SQL使用统计
V$LATCH
列出锁存器的统计数据
V$SQLTEXT
在SGA中属于共享SQL游标的SQL语句内容
V$LIBRARYCHCHE
有关库缓存性能的统计数据
V$SYSSTAT
包括基本的实例统计数据
V$ROLLSTAT
列出联机的回滚段的名字
V$SYSTEM_EVENT
包括一个事件的总等待时间
V$ROWCACHE
显示活动数据字典的统计
V$WAITSTAT
列出块竞争统计数据,只有当时间统计数据参数被“使能”时系统才能对其更新
真题1、如何列举某个用户下所有表的注释及列的注释?
答案:可以使用DBA_TAB_COMMENTS视图来查询表的注释,使用DBA_COL_COMMENTS视图来查询列的注释。它们的示例分别如下所示:
某个用户下所有表的注释:
SELECT D.OWNER, D.TABLE_NAME, D.COMMENTS
FROM
DBA_TAB_COMMENTS D
WHERE
D.OWNER = 'LHR'
AND
D.COMMENTS IS NOT NULL;
其结果如下所示:
某个用户下某个表的所有列的注释:
SELECT D.OWNER, D.TABLE_NAME,D.COLUMN_NAME,
D.COMMENTS
FROM
DBA_COL_COMMENTS D
WHERE
D.OWNER = 'LHR'
AND
D.TABLE_NAME='CMMND_INFO_HSTRY'
AND
D.COMMENTS IS NOT NULL;
其结果如下所示:
真题2、如何查找存储过程或视图中引用了哪些基表?
答案:可以查询DBA_DEPENDENCIES视图,该视图记录了对象与对象之间的依赖关系,NAME列为当前对象,而REFERENCED_NAME为其依赖的基对象。所以,该视图也可以查询某个表被哪些对象所引用,从而知道该表是否可以被删除。
下例展示了DBA_SQL_PLAN_BASELINES视图依赖的对象:
SH@PROD1> SELECT D.OWNER,
2 D.NAME,
3 D.TYPE,
4 D.REFERENCED_OWNER,
5 D.REFERENCED_NAME,
6 D.REFERENCED_TYPE
7 FROM DBA_DEPENDENCIES D
8 WHERE D.NAME = 'DBA_SQL_PLAN_BASELINES';
OWNER NAME TYPE REFERENCED_OWNER REFERENCED_NAME REFERENCED_TYPE
---------
------------------------------ ------------------
------------------------------ -------------------------- ------------------
PUBLIC DBA_SQL_PLAN_BASELINES SYNONYM SYS DBA_SQL_PLAN_BASELINES VIEW
SYS DBA_SQL_PLAN_BASELINES VIEW SYS SQLOBJ$AUXDATA TABLE
SYS DBA_SQL_PLAN_BASELINES VIEW SYS SQLOBJ$ TABLE
SYS DBA_SQL_PLAN_BASELINES VIEW SYS SQL$TEXT TABLE
可以看到,公共同义词DBA_SQL_PLAN_BASELINES依赖于和其同名的视图,而DBA_SQL_PLAN_BASELINES视图依赖于SYS.SQLOBJ$AUXDATA、SYS.SQLOBJ$和SYS.SQL$TEXT这3个基表。
Oracle数据字典
http://blog.csdn.net/haiross/article/details/41246241
http://blog.itpub.net/26026406/viewspace-709306/
数据字典是Oracle数据库安装之后,自动创建的一系列数据库对象。数据字典是Oracle数据库对象结构的元数据信息。熟悉和深入研究数据字典对象,可以很大程度的帮助我们了解Oracle内部机制。
Oracle字典视图包括四个层次,分别为X$内部表、基础数据字典表、数据字典视图和动态性能视图。
一.内部RDBMS(X$)表
X$表是的核心部分,用于跟踪数据库内部信息,维护数据库的正常运行。X$是加密命名的,而且oracle官方文档不做说明;最为人所熟知的是X$BH、X$KSMSP等;
X$表是oracle数据库的运行基础,在数据库启动时有oracle应用程序自动创建。所以oracle不允许SYSDBA以外的用户直接访问,也不能授权给其他用户。
一般而言,对于这种对象,进行观察、发现、研究X$表的好办法是借用oracle的AUTOTRACE功能,当查询一些视图时,可以发现这些X$底层表;
如下:
23:26:35scott@felixSQL>setautot traceonly;
23:47:54scott@felixSQL>select*fromv$parameter;
347rowsselected.
ExecutionPlan
----------------------------------------------------------
Planhashvalue:1128103955
------------------------------------------------------------------------------
|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|
------------------------------------------------------------------------------
|0|SELECTSTATEMENT||1|4414|1(100)|00:00:01|
|*1|HASHJOIN||1|4414|1(100)|00:00:01|
|*2|FIXEDTABLEFULL|X$KSPPI|1|249|0(0)|00:00:01|
|3|FIXEDTABLEFULL|X$KSPPCV|100|406K|0(0)|00:00:01|
------------------------------------------------------------------------------
Predicate Information(identifiedbyoperationid):
---------------------------------------------------
1-access("X"."INDX"="Y"."INDX")
filter(TRANSLATE("KSPPINM",'_','#')NOTLIKE'#%'OR
"KSPPSTDF"='FALSE'ORBITAND("KSPPSTVF",5)>0)
2-filter("X"."INST_ID"=USERENV('INSTANCE')AND
BITAND("KSPPIFLG",268435456)=0ANDTRANSLATE("KSPPINM",'_','#')NOT
LIKE'##%')
Statistics
----------------------------------------------------------
8recursive calls
0dbblockgets
2consistentgets
0physicalreads
0redosize
38375bytes sent viaSQL*Nettoclient
776bytes received viaSQL*Netfromclient
25SQL*Net roundtripsto/fromclient
0sorts(memory)
0sorts(disk)
347rowsprocessed
再看这个X$KVIT([K]ernel Layer Performance Layer[V][I]nformation tables [T]ransitory Instance parameter)这个视图记录的是和实例相关的一些内部参数设置,可以看到一些很有意思的内容;
selectkvittag,kvitval,kvitdscfromx$kvit;
二:数据字典表:
数据字典表用以存储表、索引、约束以及其他数据库结构的信息。这些对象通常是以‘$’结尾(例如:TAB$、OBJ$、TS$等)
Bsq是非常重要的一个文件,其中包含了数据字典的定义以及注释说明,每个视图深入学习oracle数据库的用户都应该仔细阅读以下该文件该文件位于$ORACLE_HOME/rdbms/admin目录下:(在11g中bsq文件被分别归类到不通的.bsq文件)。
[oracle@felixadmin]$ pwd
$ORACLE_HOME/rdbms/admin
[oracle@felixadmin]$ ls-l*.bsq
-rw-r--r-- 1 oracle oinstall25905 Mar 19 2009 daw.bsq
-rw-r--r-- 1 oracle oinstall91730 Jul 22 2011 dcore.bsq
-rw-r--r-- 1 oracle oinstall2832 Oct 23 2006 ddm.bsq
-rw-r--r-- 1 oracle oinstall674 Jul 14 2008 ddst.bsq
-rw-r--r-- 1 oracle oinstall17993 Feb 23 2010 denv.bsq
-rw-r--r-- 1 oracle oinstall1364 Oct 31 2005 dexttab.bsq
-rw-r--r-- 1 oracle oinstall4937 Oct 31 2005 dfmap.bsq
-rw-r--r-- 1 oracle oinstall728 Oct 31 2005 djava.bsq
-rw-r--r-- 1 oracle oinstall33697 Apr 26 2011 dlmnr.bsq
-rw-r--r-- 1 oracle oinstall9632 Dec 8 2009 dmanage.bsq
-rw-r--r-- 1 oracle oinstall25509 Jun 8 2007 dobj.bsq
-rw-r--r-- 1 oracle oinstall32867 May 18 2011 doptim.bsq
-rw-r--r-- 1 oracle oinstall47093 Nov 12 2009 dpart.bsq
-rw-r--r-- 1 oracle oinstall16679 Jan 8 2007 dplsql.bsq
-rw-r--r-- 1 oracle oinstall17811 Oct 9 2009 drac.bsq
-rw-r--r-- 1 oracle oinstall128181 May 13 2011 drep.bsq
-rw-r--r-- 1 oracle oinstall139898 Jun 11 2010 dsec.bsq
-rw-r--r-- 1 oracle oinstall17751 Mar 9 2009 dsqlddl.bsq
-rw-r--r-- 1 oracle oinstall19958 Jul 30 2008 dsummgt.bsq
-rw-r--r-- 1 oracle oinstall15830 Apr 29 2011 dtools.bsq
-rw-r--r-- 1 oracle oinstall5474 Oct 31 2006 dtxnspc.bsq
-rw-r--r-- 1 oracle oinstall 2495314 Sep172011 recover.bsq
-rw-r--r-- 1 oracle oinstall53130 Jul 14 2008 sql.bsq
这些数据字典表对于数据库的稳定运行生死攸关,所以通常oracle不允许直接对数据字典进行操作。当用户执行DDL和DML操作时,在后台oracle讲这些操作解析为对于数据字典的自动执行。
以下是某个bsq的内容:
[oracle@felixadmin]$ cat ddm.bsq
rempstengar05/22/06-addaudit$columntomodel$
remmmcracke03/14/05-creation
remdataminingmodeltable
createtablemodel$
(
obj#numbernotnull,/* unique model object id */
funcnumber,/* mining function (bit flags)*/
algnumber,/* mining algorithm (bit flags)*/
bdurnumber,/* time to build */
msizenumber,/* size of model (MB) */
versionnumber,/* model version */
audit$varchar2("S_OPFL")notnull/* auditing options */
)
storage(maxextentsunlimited)
tablespaceSYSAUX
/
createuniqueindexmodel$idx
onmodel$(obj#)
storage(maxextentsunlimited)
tablespaceSYSAUX
/
remdataminingmodelcomponentstable
createtablemodeltab$
(
mod#numbernotnull,/* model object id */
obj#numbernotnull,/* table object id */
typ#numbernotnull/* model table type */
)
storage(maxextentsunlimited)
tablespaceSYSAUX
/
createuniqueindexmodeltab$idx
onmodeltab$(mod#,typ#)
storage(maxextentsunlimited)
tablespaceSYSAUX
/
remdataminingmodelattributetable
createtablemodelatt$
(
mod#numbernotnull,/* model object id */
namevarchar2(30)notnull,/* attribute name */
atypnumber,/* attribute type */
dtypnumbernotnull,/* data type */
lengthnumber,/* data length */
precision#number,/* precision */
scalenumber,/* scale */
propertiesnumber/* properties */
)
storage(maxextentsunlimited)
tablespaceSYSAUX
/
createindexmodelatt$idx
onmodelatt$(mod#)
storage(maxextentsunlimited)
tablespaceSYSAUX
/
remdataminingmodelsettingstable
createtablemodelset$
(
mod#numbernotnull,/* model object id */
namevarchar2(30)notnull,/* setting name */
valuevarchar2(4000),/* setting value */
propertiesnumber/* properties */
)
storage(maxextentsunlimited)
tablespaceSYSAUX
/
createindexmodelset$idx
onmodelset$(mod#)
storage(maxextentsunlimited)
tablespaceSYSAUX
/
Rem
RemSequenceforexport/import
createsequenceDM$EXPIMP_ID_SEQ
/
grantselectonDM$EXPIMP_ID_SEQtopublic
/
[oracle@felixadmin]
或者再例如:当创建一张数据表时,oracle将会在后台执行一系列的内部操作,比如像OBJ$表中插入数据、向tab$表中记录数据、向col$表中记录字段信息、向con$记录约束信息、向seg$中记录数据段信息。
例如:
进行一个10046trace:
00:56:54scott@felixSQL>alter session set events '10046 tracename context forever,level 12';
Sessionaltered.
01:00:18scott@felixSQL>create table felix2 as select * fromdba_objects;
Tablecreated.
01:00:39scott@felixSQL>select value from v$diag_info wherename='Default Trace File';
VALUE
-----------------------------------------------------------------------------------/u01/app/oracle/diag/rdbms/felix/felix/trace/felix_ora_19538.trc
摘录一些跟踪文件信息,下面这个是前台的DDL语句在后台是怎样被转化成一系列的DML语句进行执行的,首先记录的是创建语句:
[oracle@felix ~]$ cat/u01/app/oracle/diag/rdbms/felix/felix/trace/felix_ora_19538.trc| grep create
createtable felix2 as select * from dba_objects
m_stmt:='call mderr.raise_md_error(''MD'',''SDO'', -13391, ''GeoRaster reserved names cannot be used to create regulartriggers.'')';
m_stmt:='beginSDO_GEOR_UTL.createDMLTrigger(:1,:2); end;';
然后是向obj$、con$、seg$、tab$、col$表中增加信息:
[oracle@felix ~]$ cat/u01/app/oracle/diag/rdbms/felix/felix/trace/felix_ora_19538.trc| grep insert
m_stmt:='insert into sdo_geor_ddl__table$$values (1)';
m_stmt:='insert into sdo_geor_ddl__table$$values (2)';
insertintoobj$(owner#,name,namespace,obj#,type#,ctime,mtime,stime,status,remoteowner,linkname,subname,dataobj#,flags,oid$,spare1,spare2,spare3)values(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,:17,:18)
insertintoseg$(file#,block#,type#,ts#,blocks,extents,minexts,maxexts,extsize,extpct,user#,iniexts,lists,groups,cachehint,hwmincr,spare1,scanhint,bitmapranges)values(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,DECODE(:17,0,NULL,:17),:18,:19)
insertintotab$(obj#,ts#,file#,block#,bobj#,tab#,intcols,kernelcols,clucols,audit$,flags,pctfree$,pctused$,initrans,maxtrans,rowcnt,blkcnt,empcnt,avgspc,chncnt,avgrln,analyzetime,samplesize,cols,property,degree,instances,dataobj#,avgspc_flb,flbcnt,trigflag,spare1,spare6)values(:1,:2,:3,:4,decode(:5,0,null,:5),decode(:6,0,null,:6),:7,:8,decode(:9,0,null,:9),:10,:11,:12,:13,:14,:15,:16,:17,:18,:19,:20,:21,:22,:23,:24,:25,decode(:26,1,null,:26),decode(:27,1,null,:27),:28,:29,:30,:31,:32,:33)
insertintocol$(obj#,name,intcol#,segcol#,type#,length,precision#,scale,null$,offset,fixedstorage,segcollength,deflength,default$,col#,property,charsetid,charsetform,spare1,spare2,spare3)values(:1,:2,:3,:4,:5,:6,decode(:5,182/*DTYIYM*/,:7,183/*DTYIDS*/,:7,decode(:7,0,null,:7)),decode(:5,2,decode(:8,-127/*MAXSB1MINAL*/,null,:8),178,:8,179,:8,180,:8,181,:8,182,:8,183,:8,231,:8,null),:9,0,:10,:11,decode(:12,0,null,:12),:13,:14,:15,:16,:17,:18,:19,:20)
oracle通过将DDL解析为dml操作,并将这些操作记录在数据字典表中,通过将这些信息反向解析,可以得到原始的创建语句。
三:静态数据字典视图:
由于X$表和数据字典表通常不能直接访问,oracle创建了静态数据字典视图提供用户对于数据字典信息的访问,由于这些信息相对稳定、不能直接修改,所以又被称为静态数据字典视图。静态数据字典视图是由catalog.sql脚本创建(在$ORACLE_HOME/rdbms/admin下)
(1)USER_视图包含了用户所拥有的相关对象的信息,用户可以通过这个视图查询自己拥有的对象信息。
(2)ALL_类视图包含了用户有权限访问的所有对象的信息。
(3)DBA_类视图包含了数据库所拥有的所有相关对象的信息,用户需要select any table权限才能访问。
这里要说明一下,并不是所有的对象都是有三层对象视图,有时候all_层视图是被省略掉的。比如我们之前在闪回中介绍的dba_recyclebin,就没有对应的all_层视图。
01:31:13scott@felixSQL>selecttable_name,tablespace_namefromuser_tables;
TABLE_NAMETABLESPACE_NAME
------------------------------------------------------------ -----
DEPTUSERS
EMPUSERS
BONUSUSERS
SALGRADEUSERS
FELIX2USERS
常用的数据字典举例:
(1)DICT_COLUMNS
01:54:55scott@felixSQL>SELECTCOLUMN_NAME,COMMENTSFROMDICT_COLUMNSWHERETABLE_NAME='DICT';
COLUMN_NAMECOMMENTS
------------------------------ ----------------------------------------
TABLE_NAMENameoftheobject
COMMENTSTextcommentontheobject
这个视图记录了字典很重要的信息,例如找到具有较多字段的TOP 10字典视图:
scott@felixSQL>select * from(
select table_name,count(*)
from dict_columns
group by table_name
order by 2 desc)
where rownum<=10;
TABLE_NAMECOUNT(*)
------------------------------------------------------------ ----------
GV$SESSION98
V$SESSION97
GV$ACTIVE_SESSION_HISTORY97
DBA_HIST_ACTIVE_SESS_HISTORY97
V$ACTIVE_SESSION_HISTORY96
GV$SQL88
V$SQL87
GV$SQLAREA83
V$SQLAREA82
DBA_HIST_SQLSTAT78
而通过DICT视图可以很快的找到这些和COLUMN有关的视图:
scott@felixSQL>selecttable_namefromdictwheretable_namelike'DBA%COLUMNS';
TABLE_NAME
------------------------------------------------------------
DBA_APPLY_CONFLICT_COLUMNS
DBA_APPLY_DML_CONF_COLUMNS
DBA_APPLY_KEY_COLUMNS
DBA_APPLY_TABLE_COLUMNS
DBA_AUDIT_POLICY_COLUMNS
DBA_CLU_COLUMNS
DBA_COMPARISON_COLUMNS
DBA_CONS_COLUMNS
DBA_CONS_OBJ_COLUMNS
DBA_CUBE_DIM_VIEW_COLUMNS
DBA_CUBE_HIER_VIEW_COLUMNS
DBA_CUBE_VIEW_COLUMNS
DBA_ENCRYPTED_COLUMNS
DBA_IND_COLUMNS
DBA_JOIN_IND_COLUMNS
DBA_LOG_GROUP_COLUMNS
DBA_OLDIMAGE_COLUMNS
DBA_PART_KEY_COLUMNS
DBA_PUBLISHED_COLUMNS
DBA_REPFLAVOR_COLUMNS
DBA_REPKEY_COLUMNS
DBA_STREAMS_COLUMNS
DBA_STREAMS_KEEP_COLUMNS
DBA_SUBPART_KEY_COLUMNS
DBA_SUBSCRIBED_COLUMNS
DBA_TAB_COLUMNS
DBA_UPDATABLE_COLUMNS
27rowsselected.
(2)OBJ$/DBA_OBJECTS/OBJ
OBJ$是一个底层的数据字典表,其中记录了数据库中所有对象的信息,DBA_OBJECTS基于OBJ$建立,一脉相承地,ALL_OBJECTS和USER_OBJECTS视图也随之建立;
OBJ是对于USER_OBJECTS建立的同义词,其创建语法如下:
CREATE PUBLICSYNONYM OBJ FIR SYS.USER_OBJECTS;
02:02:33scott@felixSQL>selectobject_name,object_typefromobj;
OBJECT_NAMEOBJECT_TYPE
------------------------------ -------------------
PK_DEPTINDEX
DEPTTABLE
EMPTABLE
PK_EMPINDEX
BONUSTABLE
SALGRADETABLE
FELIX2TABLE
(3)*_SOURCE视图
DBA_SOURCE/ALL_SOURCE/USER_SOURCE用于保存存储对象的源码。这类视图存储的对象包括function//packge/packgebody/procedure/trigger/type/typebody等;
02:06:47scott@felixSQL>descdba_source;
NameNull?Type
--------------------------------------
OWNERVARCHAR2(30)
NAMEVARCHAR2(30)
TYPEVARCHAR2(12)
LINENUMBER
TEXTVARCHAR2(4000)
通过TEXT字段能够获得相关对象创建的脚本;
四:动态性能视图:
动态性能视图(V$)(dynamicperformance view)记录了数据库运行时信息和统计数据,大部分动态性能视图被实时更新以反映数据库的当前状态。
v$动态视图是描述Oracle当前运行状态的一系列视图集合。这部分视图的特点是以v$开头,描述系统当前状态信息。常见常用的如v$session、v$session_wait(10g后,其中内容融入到v$session中)、v$lock和v$sysstat等。
v$视图传统上是代表系统当前状态的描述,也就是即时性视图。虽然可以描述当前系统中发生的瓶颈或者性能问题,但是当瓶颈接触之后,很难发现和分析过去一个事件点的系统状态和问题SQL。同时,如果需要对运行时间段的情况进行分析,采用时间段镜像snap技术也存在一些偶然性。
从oracle10g开始,v$动态视图进入了一个新的时代,可以保存v$session的历史信息。ASH(Active Session History)技术就是每个一个间隔的时间段,保存当前动态视图的镜像进行保存,这些信息保存7天。借助ASH技术,Oracle提出了基于历史进行分析的AWR(Automatic Workload Report)报表。最后,从性能主动优化的出发点,提出了ADDM(Automatic Database Diagnostic Monitor)报告,提供智能化的数据库优化提示。这些方便的功能特性,全都是基于动态视图。
v$动态视图主要是针对SGA和数据库实例进程的显示。在这个过程中,Oracle使用了DMA(Direct Memory Access)技术,可以高效的获取这些分析数据。
(1)GV$和V$视图
数据库启动时,oracle动态创建X$表,在此基础之上,oracle创建了GV$和V$视图。从oracle 8开始GV$视图开始被引入,其含义是Global,除一些特例之外,每个V$视图都有一个对应的GV$视图存在;GV$视图的产生是为了满足OPS/RAC环境的需要;每个V$视图都包含如下类似语句,用于限制返回当前实例的信息:
Where inst_id=USERENV('Instance');
用单实例进行如下(如果是rac环境的话返回的是多个实例名称):
02:41:54scott@felixSQL>selectinst_id,instance_name,statusfromgv$instance;
INST_ID INSTANCE_NAME STATUS
---------- -------------------------------- ------------------------
1felixOPEN
而V$视图只会返回本实例上的实例名:
02:41:12scott@felixSQL>selectinstance_number,instance_name,statusfromv$instance;
INSTANCE_NUMBER INSTANCE_NAMESTATUS
--------------- -------------------------------- ------------------------
1felixOPEN
ORACLE提供了一些特殊视图用以记录其他视图的创建方式,v$fixed_view_definition就是其中之一,从GV$FIXED_TABLE和V$FIXED_TABLE开始,我们来看一下GV$视图和v$视图的创建方式:
V$视图的创建方式:
SQL>select*fromv$fixed_view_definitionwhereview_name='V$FIXED_TABLE';
VIEW_NAMEVIEW_DEFINITION
-----------------------------------------------------------------------------------
V$FIXED_TABLEselectNAME,OBJECT_ID,TYPE,TABLE_NUMfromGV$FIXED_TABLEwhereinst_id=USERENV('Instance')
GV$视图的创建方式:
SQL>select*fromv$fixed_view_definitionwhereview_name='GV$FIXED_TABLE';
VIEW_NAMEVIEW_DEFINITION
-------------- --------------------------------------------------------------------------------
GV$FIXED_TABLEselectinst_id,kqftanam,kqftaobj,'TABLE',indxfromx$kqftaunionallselecti
nst_id,kqfvinam,kqfviobj,'VIEW',65537fromx$kqfviunionallselectinst_id,k
qfdtnam,kqfdtobj,'TABLE',65537fromx$kqfdt
总结一下:oracle的gv$视图和v$视图时在数据库创建过程中建立起来的,内置于数据库中,oracle通过v$fixed_view_definition视图为用户展示这些定义;
另外X$表的信息可以从v$fixed_table中查到:
scott@felixSQL>selectcount(*)fromv$fixed_tablewherenamelike'X$%';
COUNT(*)
----------
970
动态性能视图与数据库启动:
(1)NOMOUNT
在nomount阶段可以获取信息的视图主要有:V$PARAMETER、V$APPARAMETER、V$SGA、V$SGASTAT、V$BH、V$INSTANCE、V$OPTION、V$PROCESS、V$SESSION;
(2)mount阶段
可以获取信息的主要视图:V$DATABASE、V$DATAFILE、V$VERSION、V$PROCESS、V$DATAFILE_HEADER。
(3)OPEN阶段
在数据库OPEN之后,所有数据字典和动态性能视图都可以被查询;
V$PARAMETER结构:
03:46:58scott@felixSQL>selectVIEW_DEFINITIONfromv$fixed_view_definitionwhereview_name='V$PARAMETER';
VIEW_DEFINITION
--------------------------------------------------------------------------------
selectNUM,NAME,TYPE,VALUE,DISPLAY_VALUE,ISDEFAULT,ISSES_MODIFIABLE
,ISSYS_MODIFIABLE,ISINSTANCE_MODIFIABLE,ISMODIFIEDISADJUSTED,ISDEPRECAT
ED,ISBASIC,DESCRIPTION,UPDATE_COMMENT,HASHfromGV$PARAMETERwhereinst_id
=USERENV('Instance')
这里清晰的看到,V$PARAMETER视图是由GV$PARAMETER创建的
SQL>selectVIEW_DEFINITIONfromv$fixed_view_definitionwhereview_name='GV$PARAMETER';
VIEW_DEFINITION
--------------------------------------------------------------------------------
selectx.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'),decode(bitand(ksppi
lrmflg/268435456,1),1,'TRUE','FALSE'),ksppdesc,ksppstcmnt,ksppihashfro
mx$ksppi x, x$ksppcv ywhere(x.indx=y.indx)andbitand(ksppiflg,268435456)
=0and((translate(ksppinm,'_','#')notlike'##%')and((translate(ksppinm
,'_','#')notlike'#%')or(ksppstdf='FALSE')or(bitand(ksppstvf,5
)>0)))
在这里可以看到GV$PARAMETER来源于X$KSSPI和X$KSPPCV两个表。这两个表基本上包含所有数据库参数
一、数据字典
数据字典是oracle存放有关数据库信息的地方,几乎所有的系统信息和对象信息都可在数据字典中进行查询。数据字典是oracle数据库系统的信息核心,它是一组提供有关数据库信息的表和视图的集合,这些表和视图是只读的。它是随着数据库的建立而建立的,当数据库执行特定动作时数据字典也会自动更新。数据一览与数据字典来记录、校验和管理正在进行的操作。
oracle中、sys用户是数据字典的拥有者,数据字典保证在所有数据库的系统表空间system内,任何用户都无权更改sys模式下的模式对象或数据字典中的行。也就是说数据字典只能查询,不能手动进行修改。
数据字典用途
oracle通过存取数据字典从而比较方便地获取有关用户某事对象和存储结构等信息。当系统执行了DDL语句后,oracle会及时修改数据字典。任何用户只能以读的形式使用数据字典获取数据库信息。
数据字典存储的信息
数据用户的名称
为用户授予的权限和角色
模式对象的名称,如 tables,views,indexex,procedures,functions,packages,triggers等。
完整性约束的具体信息;
每个字段的默认值;
数据库空间的使用情况;
审计功能,在Oracle_Home\productdb_l\rdbms\admin目录下的文件cataudit.sql就是用于为审计创建数据字典视图的脚步。
对象与用户的严格管理(适用于高度机密管理);
其他一般数据库信息。
三种前缀的数据字典视图
user_ :任何用户都可以读取的视图,每个用户读取的都不一样,它只提供当前用户某事下的对象信息。如查询当前模式下的所有对象select object_name, object_type from user_objects;
all_ :所有用户都可读取的用户视图,它提供与用户有关的对象信息。如查询当前用户可访问的所有对象
select owner, object_name, object_type from all_objects;
dba_:提供了只有数据库管理员才可读取的视图,包括所有用户视图中的对象信息。如select owner, object_name, object_type from sys.dba_objects;
二、数据字典相关查询
1、 查询用户
select username from dba_users; --只有管理员权限的用户才能查询 select username from all_users; --当前或任何用户都可使用 --查看当前用户的默认表空间 select username, default_tablespace fromuser_users;--当前用户角色 select * fromuser_role_privs;--当前用户的系统权限和表级权限 select * fromuser_sys_privs;select * from user_tab_privs;
2、查询 表空间 (拥有DBA权限的用户才能查询)
select * fromdba_data_files;select * from dba_tablespaces; --表空间 select tablespace_name, sum(bytes), sum(blocks) from dba_free_space group by tablespace_name; --空闲表空间 select * from dba_data_files where tablespace_name='USERS'; --表空间对于的数据文件 select * from dba_segments where tablespace_name='USERS';--查询用户模式对象所使用过的正在使用空间大小 select name, type, source_size, code_size from user_object_size;
3、查询数据库对象(拥有DBA权限的用户才能查询)
select * fromdba_objectsselect * from dba_objects where object_type = upper('package body');select * from dba_objects where OBJECT_TYPE='TABLE' and OWNER='SCOTT'
可根据拥有者查询下列对象类型(object_type)
cluster databaselink
function index
library package
package body procedure
sequence synonym
table trigger
type undefined
view
4、查询表
--表使用的extent的信息。segment_type='ROLLBACK'
select * fromdba_tables;select extent_id, bytes from dba_extents where segment_name='CUSTOMERS' and segment_type='TABLE' order byextent_id;--查看回滚段的空间分配信息列信息 SELECT * FROM user_tab_columns; select distinct table_name from user_tab_columns where column_name='ID';--查看当前用户下所有的表 select * fromuser_tables;--查看名称包含log字符的表 select object_name, object_id from user_objects where instr(object_name, 'LOG') > 0;--查看某表的创建时间 select object_name, created from user_objects where object_name = upper('&table_name');--查看某表的大小 select sum(bytes)/(1024*1024) as "size(M)" from user_segments where segment_name = upper('&table_name');--查看放在oracle的内存的表 select table_name, cache from user_tables where instr(cache, 'Y') > 0;
5、查询索引
select * from dba_indexes; --索引,包括主键索引 select * fromall_indexes;select * from dba_ind_columns; --索引列 select i.index_name, i.uniqueness, c.column_name from user_indexes i, user_ind_columns c where i.index_name=c.index_name and i.table_name = 'PERSON'; --连接使用 --查看索引个数和类别 select index_name, index_type, table_name from user_indexes order bytable_name;--查看索引被索引的字段 select * from user_ind_columns where index_name=upper('&index_name');--查看索引的大小 select sum(bytes)/(1024*1024) as "size(M)" from user_segments where segment_name = upper('&index_name');
6、查询序列
select * fromdba_sequences;select * fromall_sequences;
查看序列号,last_number是当前值select * from user_sequences;
7、查询视图
select * fromdba_views;select * from all_views;
可用目录desc all_views;来查看视图结构
其中,Text列可用于查询视图生产的脚本。
--查询当前用户视图的名称 select view_name fromuser_views;--查询创建视图的select语句 select view_name, text_length fromuser_views;set long 2000;--可以根据视图的text_length 值设定set long的大小 select text from user_views where view_name = upper('&view_name');
8、查询聚簇
select * from dba_clusters;
9、查询快照
select * from dba_snapshots;
快照、分区应存在相对应的表空间
10、查询同义词
select * from dba_synonyms where table_owner='SCOTT';select * from ALL_synonyms where table_owner='SYSTEM';
如果用户表可以被访问,那么同义词也可以被访问,用户表不能被访问,则同义词也不能被访问。
11、查询数据库链
select * from dba_db_links;
12、查询触发器(12)
select * from dba_triggers;
存储过程,函数从dba_objects查找
查询文本select text from user_source where name = 'PRO_PERSON_FINDBYID';
oracle总是将存储过程,函数放在system表空间。
13、查看函数和过程的状态
select object_name, status from user_objects where object_type='FUNCTION';select object_name, status from user_objects where object_type='PROCEDURE';--查看源代码 select * from all_source where owner='WUXX' and name=upper('&plsql_name');
14、查询约束
约束是和表关联的,可以在create table或alter table table_name add/drop/modify 来建立、修改、删除约束。
可以临时禁止约束,如:
alter table book_example
disable constraint book_example_l;
数据完整性约束
select constraint_name, constraint_type, table_name from dba_constraints;
15、查询回滚段
在所有的修改结果存入磁盘前,回滚段中保持恢复该事务所需的全部信息,必须以数据库发送的事务来相应确定其大小。(DML语句才可回滚,create, drop, truncate等DDL不能回滚)
回滚段数量=并发事务/4,但不能超过50个;是每个回滚段大小足够处理一个完整的事物;
create rollbacksegment r05 tablespace rbs;create rollback segment rbs_cvt tablespace rbs storage(initial 1M next 500k);
16、查询作业
select job, broken, next_date, interval, what fromuser_jobs;select job, broken, next_date, interval, what fromdba_jobs;--正在运行的作业 select * from dba_jobs_running;
使用包exec dbms_job.sumit(:v_num, 'a;', sysdate, 'sysdate +(10/(24*60*60))');加入作业。间隔10秒
使用包exec dbms_job.sumit(:v_num, 'a;', sysdate, 'sysdate +(10/(24*60))');加入作业。间隔11分
使用表exec dbms_job.remove(21)删除21号作业。
其他信息查询
查询优化模式对象使用过的或正在使用的空间大小
select name, type, source_size, code_size from user_object_size;
查询字段的默认值
select table_name, column_name, data_default, low_value, hight_value from dba_tab_columns;