好了,现在开始我们今天的正式内容: oracle 数据字典,动态性能视图和参数。
二. 数据字典
思考:Oracle 软件是由什么语言写的?
C语言。而给我们展现出来的一些安装界面都是外包给印度阿三写的。真正底层核心的C代码,都是在美国总部来写的。
我在这里给你们描述一个关于数据库比较抽象的概念,这个是Dave自己的理解。
数据库主要是为了存放数据,为了性能考虑,我们需要把部分数据放到内存。 也就是说数据库分为磁盘上的文件和内存中的数据。
我们做的操作都是在内存中完成的,那么如果有很多人同时来操作这些数据,就会导致不一致吧,因此我们需要一些机制来控制数据的读取和写入操作,怎么控制这些机制,就是由C语言来控制了。
这一点都能理解吧。 既然有这些机制,那么肯定就需要地方来存储相关的记录。 这些就是我们今天讲的主题:数据字典。
Oracle数据字典是由表和视图组成,存储有关数据库结构信息的一些数据库对象。数据库字典还描述了实际数据是如何组织的。比如一个表的创建者信息,创建时间信息,所属表空间信息,用户访问权限信息等。
对于数据字典,可以向处理其他数据库表或视图一样进行查询,但不能进行任何修改。
思考:数据字典存放位置?
数据字典存放在SYSTEM表空间中,可以访问数据字典来查看详细的信息,可以用SQL语句访问数据库数据字典。
思考:数据库字典什么时候创建的?
Oracle数据库字典通常是在创建和安装数据库时被创建的.
数据字典是Oracle数据库系统工作的基础,没有数据字典的支持,Oracle数据库系统就不能进行任何工作。
2.1 数据字典内容包括
1,数据库中所有模式对象的信息,如表、视图、簇、及索引等。
2,分配多少空间,当前使用了多少空间等。
3,列的缺省值。
4,约束信息的完整性。
5,Oracle用户的名字。
6,用户及角色被授予的权限。
7,用户访问或使用的审计信息。
8,其它产生的数据库信息。
所有数据字典都属于SYS用户
2.2 数据字典分为 数据字典表 和 数据字典视图
数据字典表里的数据是Oracle系统存放的系统数据,而普通表存放的是用户的数据。
为了方便的区别这些表,数据字典表的名字都是用"$"结尾,这些表属于SYS用户。
数据字典表由$ORACLE_HOME/rdbms/admin/sql.bsq 脚本创建,这个脚本里又调用了其他的脚本来创建这些数据字典表。
SYS用户下的这些数据字典表,存放在system 表空间下面,表名都用"$"结尾,为了便于用户对数据字典表的查询, Oracle对这些数据字典都分别建立了用户视图,这样即容易记住,还隐藏了数据字典表表之间的关系,Oracle针对这些对象的范围,分别把视图命名为DBA_XXXX, ALL_XXXX和USER_XXXX。
SQL> select * from v$version where rownum=1;
BANNER
--------------------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi
SQL> select count(1) from dba_objectswhere object_name like '%$'; --不准确
COUNT(1)
----------
1394
Oracle为了便于汇总数据字典表的信息,把所有的数据字典都汇集到dictionary表里了,通过对这个表的查询,我们可以很方便的找到数据库提供的数据字典。
SQL> desc dictionary
Name Null? Type
------------------------------------------------- ----------------------------
TABLE_NAME VARCHAR2(30)
COMMENTS VARCHAR2(4000)
SQL> select count(1) from dictionary; --准确
COUNT(1)
----------
1871
SQL> set pagesize 30
SQL> selectobject_type,count(1) from dba_objects where object_name like '%$' group by object_type order by 2 desc;
OBJECT_TYPE COUNT(1)
-------------------------------------------------------------------
LOB 557
TABLE 381
TYPE 252
INDEX 105
INDEXPARTITION 28
SEQUENCE 26
TABLEPARTITION 23
VIEW 15
SYNONYM 4
PACKAGEBODY 1
LOB PARTITION 1
PACKAGE 1
12 rowsselected.
2.2.2数据字典视图
动态性能视图由脚本:$ORACLE_HOME/rdbms/admin/catalog.sql 创建, 该脚本也只是一个总的调用,在该脚本里由调用了其他的脚本。
数据字典视图分2类:静态数据字典(静态性能视图) 和 动态数据字典(动态性能视图)
2.2.2.1 静态数据字典(静态性能视图)
静态数据字典中的视图分为三类,它们分别由三个前缀够成:user_*、 all_*、 dba_*。
(1) user_*:该视图存储了关于当前用户所拥有的对象的信息。(即所有在该用户模式下的对象)。
(2) all_*:该视图存储了当前用户能够访问的对象的信息, 而不是当前用户拥有的对象。(与user_*相比,all_* 并不需要拥有该对象,只需要具有访问该对象的权限即可)
(3)dba_*:该视图存储了数据库中所有对象的信息。(前提是当前用户具有访问这些数据库的权限,一般来说必须具有管理员权限)
这些视图由SYS用户创建的,所以使用需要加上SYS,为了方便, Oracle为每个数据字典表的视图头建立了同名字的公共同义词(public synonyms). 这样简单的处理就省去了写sys.的麻烦。
常用视图:
(1)user_tables:主要描述当前用户拥有的所有表的信息,主要包括表名、表空间名、簇名等。通过此视图可以清楚了解当前用户可以操作的表有哪些。
(2)user_indexes:查询该用户拥有哪些索引。
(3)user_views:查询该用户拥有哪些视图
(4)user_objects:查询该用户拥有哪些数据库对象,对象包括表、视图、存储过程、触发器、包、索引、序列、JAVA文件等。
(5)user_users:主要描述当前用户的信息,主要包括当前用户名、帐户id、帐户状态、表空间名、创建时间等。
(6)user_objects:查询某一用户下的所有表、过程、函数等信息。
--all_, dba_ 类似
2.2.2.2 动态数据字典(动态性能视图)
除了静态数据字典中三类视图,其他的字典视图中主要的是V$视图,之所以这样叫是因为他们都是以V$或GV$开头的。
这些视图会不断的进行更新,从而提供了关于内存和磁盘的运行情况,所以我们只能对其进行只读访问而不能修改它们。
V$视图是基于X$虚拟视图的。V$视图是SYS用户所拥有的,在缺省状况下,只有SYS用户和拥有DBA系统权限的用户可以看到所有的视图,没有DBA权限的用户可以看到USER_和ALL_视图,但不能看到DBA_视图。
动态性能表用于记录当前数据库的活动,只存于数据库运行期间,实际的信息都取自内存和控制文件。DBA可以使用动态视图来监视和调节数据。
2.3 视图家族
在Oracle的绝大多数数据字典视图中都有象DBA_TABLES,ALL_TABLES和USER_TABLES这样的视图家族。Oracle中有超过100个视图家族,下表列出了最重要和最常用的视图家族,需要注意的是每个视图家族都有一个DBA_,一个ALL_ 和一个USER_视图。
前面都可以加dba,user,all
2.4 查看数据字典
SQL> select *from dictionary;
SQL> selectcount(*) from dictionary;
COUNT(*)
----------
2592
三.Oracle 动态性能视图
3.1 什么是动态性能视图?
在Oracle 所有的操作中,Oracle会维护一些虚拟的表来记录数据库当前的状态。这些虚拟的表就叫做:动态性能视图(dynamic performance views)。
动态性能视图在数据库打开和使用时不断进行更新,记录的内容主要与性能有关,动态性能视图不允许用户直接进行修改。这些视图提供内部磁盘结构和内存结构方面的数据。用户可以对这些视图进行查询。
动态性能视图主要用在以下2个场景:
(1) OEM(Oracle Enterprise Manager) 使用动态性能视图获取数据库的信息
(2) DBA使用动态性能视图来监控性能及一些debug操作。
当我们使用DBCA创建实例的时候,Oracle 会自动使用catalog.sql脚本来创建数据字典,数据字典里包含视图和一定同义词。必须运行CATALOG.SQL 创建这些视图及同义词。升级系统也后要执行这个脚本.
当数据库管理员启动某个例程时,数据库会自动建立动态性能视图;
当停止某个例程时,数据库又会自动删除这些动态性能视图。
思考:数据字典表存在哪里?system表空间
动态性能视图存在哪里?内存中、控制文件
数据字典的信息是从数据文件中取得; 而动态性能视图的信息则是从SGA内存以及控制文件中取得。
数据库管理员利用这些动态性能视图,可以了解数据库运行的一些基本信息,为我们进行数据库维护以及数据库性能优化提供一些数据上的支持。
一般情况下,我们可以通过动态性能数据掌握两类重要的数据库运行信息。
(1)了解数据库运行相关的性能数据,如内存的使用量、磁盘排序发生的机率等等。
(2)取得与磁盘和内存结构相关的其他信息。
思考:数据可以启动到哪三种状态?
Nomount、Mount、Open
(1)数据库处于“NOMOUNT”状态:
数据库启动例程时,Oracle数据库会打开参数文件,分配SGA内存并启动后台进程。此时,其实数据库还没有挂栽。此时,动态性视图收集的信息来源只有是SGA,而不会从控制文件中收集相关的信息。所以,动态性能视图的数量要少得多。
比如: V$INSTANCE 和 V$BGPROCESS视图。
(2)当数据库处于MOUNT状态时:
数据库会根据初始化参数打开所有的控制文件。所以,当例程处于Mount状态时,动态性能视图其收集到的信息就要第一个状态多的多。因为此时,动态性能视图还会去收集控制文件的相关信息。不过,此时动态性能视图所收集到的资料还不是最全的。
比如: V$DATAFILE视图。
(3)当用户打开数据库时open:
Oracle系统会根据控制文件所记载的信息去打开所有的数据库文件以及重做日志。此时,数据库管理员除了可以从 SGA和控制文件中获取信息的动态性能视图外,还可能访问与Oracle数据库性能相关的动态性能视图,如会话等待时间等视图。
另外需要注意一点,就是只有在这个状态时,我们才能够访问数据库的数据字典视图(dictionary)。
思考:有没有视图查看到所有的动态性能视图?
可以使用V$FIXED_TABLE视图查看所有的动态性能视图。
SQL>select count(1) from V$FIXED_TABLE;
COUNT(1)
----------
1383
3.2 动态性能视图的内容
动态性能视图有时也称为:fixedviews。
因为DBA不能修改或者移除这些视图。 但是DBA可以查询这些视图,或者授权其他用户访问这些视图。
所有的动态性能视图,都属于SYS用户, 动态性能视图已V_$开头。 然后基于这些V_$视图创建同义词,同义词以V$开头,比如V$DATAFILE.
V_$ -》V$ (同义词)
大部分V$视图都有一个GV$视图与之对应。GV$视图用在RAC 环境下,其用来查询所有节点的信息。
动态性能视图也叫v$ 视图,它包含如下内容:
(1) system 和session 的参数
(2)内存的使用和分配
(3)文件的状态,包括RMAN 备份文件
(4) Jobs 和task的进程
(5)执行的SQL
(6)统计信息
3.3 V$, V_$, GV$, X$ 视图说明
3.3.1 X$ 表
X$表包含了特定实例的各方面的信息,是Oracle数据库的运行基础,如当前的配置信息,连接到实例的会话,以及丰富而有价值的性能信息。
X$表并不是驻留在数据库文件的永久表或临时表。 X$表仅仅驻留在内存中,当实例启动时,由Oracle应用程序动态创建,在内存中进行实时的维护。它们中的大多数至少需要装载或已经打开的数据库。
X$表为SYS用户所拥有,并且是只读的。 不能进行DML(更新,插入,删除)。X$表对数据库来说至关重要,所以Oracle不允许SYSDBA之外的用户直接访问,显示授权不被允许。
SQL> selectcount(*) from v$fixed_table where name like 'X$%';
COUNT(*)
----------
613
关于X$表,其创建信息我们也可以通过bootstrap$表查看,该表中记录了数据库启动的基本及驱动信息。
bootstrap$ 实际上存储的是数据字典的基表的定义,如OBJ$,C_OBJ$,TAB$等等。Oracle通过读取这些定义创建数据字典的基表,进而创建数据字典。
SQL> select * from bootstrap$;
3.3.2 V$ 同义词
动态性能视图由前缀V_$标识。这些视图的公用同义词具有前缀V$。
数据库管理员或用户应该只访问V$对象,而不是访问V_$对象。 一旦实例启动,从内存读取数据的 V$视图就可以访问了。
SQL> select count(*) from v$fixed_table where name like 'V$%';
COUNT(*)
----------
396
3.3.3 GV$ 视图
Rac 从oracle 8i开始,即从此时有了GV$之类的视图。
思考:GV$与v$视图的区别?
差一个字段 inst_id
在并行服务器环境下,可查询GV$视图从所有限定实例中检索V$视图的信息。V$视图和GV$视图是相同的,V$比GV$只是少了INST_ID字段。
SQL> selectcount(*) from v$fixed_table where name like 'GV$%';
COUNT(*)
----------
372
SQL> SELECT COUNT(*),SUBSTR(NAME,1,2) FROMV$FIXED_TABLE GROUP BY SUBSTR(NAME,1,2);
COUNT(*) SUBSTR(NAME,1,2)
---------- ------------------------
613 X$
396 V$
1 O$
1 GO
372 GV
3.3.4 V$FIXED_VIEW_DEFINITION 视图
通过V$FIXED_VIEW_DEFINITION 视图可以获取组成V$视图的底层X$表的所有信息。
SQL> descV$FIXED_VIEW_DEFINITION
Name Null? Type
------------------------------------------------- ----------------------------
VIEW_NAME VARCHAR2(30)
VIEW_DEFINITION VARCHAR2(4000)
SQL> selectcount(*) from V$FIXED_VIEW_DEFINITION;
COUNT(*)
----------
770
SQL> select *from v$fixed_view_definition where view_name like 'V$FIXED_TABLE';
VIEW_NAME VIEW_DEFINITION
---------------------------------------------------------------------------------------------------------------------------------
V$FIXED_TABLE select NAME , OBJECT_ID , TYPE , TABLE_NUM from GV$FIXED_TABLE where inst_id =USERENV('Instance')
SQL> select *from v$fixed_view_definition where view_name like 'V$PARAMETER';
VIEW_NAME VIEW_DEFINITION
---------------------------------------------------------------------------------------------------------------------------------
V$PARAMETER select NUM , NAME , TYPE , VALUE , DISPLAY_VALUE,ISDEFAULT , ISSES_MODIFIABLE, ISSYS_MODIFIABLE , ISINSTANCE_MODIFIABLE,ISMODIFIED , ISADJUSTED , ISDEPRECATED, DESCRIPTION, UPDATE_COMMENT, HASH from GV$PARAMETERwhere inst_id = USERENV('Instance')
SQL> select * from v$fixed_view_definition where view_name like'GV$FIXED_TABLE';
VIEW_NAME VIEW_DEFINITION
--------------------------------------------------------------------------------
GV$FIXED_TABLE selectinst_id,kqftanam, kqftaobj, 'TABLE', indx from x$kqftaunion all select inst_id,kqfvinam, kqfviobj, 'VIEW', 65537 from x$kqfvi union all select inst_id,kqfdtnam, kqfdtobj,'TABLE', 65537 from x$kqfdt
查询时,底层经过了三层转换:v$-->gv$-->x$
四.Oracle 参数分类和 参数的查看方法
Oracle数据库系统根据初始化参数文件init.ora中设置的参数来配置自身的启动,每个实例在启动之前,首先读取这些参数文件中设置的不同参数。
Oracle系统中的参数,根据系统使用情况可以简单分为两类:
(1)普通参数:也就是Oracle系统正常使用的一些参数,
(2)特殊参数:包括三种,过时参数、强调参数和隐藏参数。
随着Oracle数据库新版本的发布,相应每次都会增加或者删除一些参数。
4.1 过时参数和 强调参数
Oracle 数据库中,系统提供了几个视图可以查看系统参数的情况。视图 V$OBSOLETE_PARAMETER中含有所有的过时 (obsolete) 和强调 (underscored) 参数。
思考:什么是过时参数?
过时参数:在 Oracle 以前的版本中存在,但在新版本中已经淘汰了的参数,已经不再使用;
思考:什么是强调参数?
强调参数:就是在新版本中保留了下来,但是不希望用户使用的那些参数。
SQL> set pagesize 200
SQL> col name for a50
SQL> col ISSPECIFIE for a15
SQL> select name, isspecified fromv$obsolete_parameter;
Isspecified 表示我们这个参数是否在参数文件里配置了。 FALSE 表示没有。如果为YES,我们就需要注意了。因为这个参数是oracle 不建议配置的了,但我们还是配置了。
查询有没有使用过期参数
SQL> select name, isspecified fromv$obsolete_parameter where ISSPECIFIED='YES';
我们可以通过系统视图 X$KSPPO 来查看详细内容,该视图中包含一个名为 KSPPOFLAG 的字段,用来指明该参数在当前版本中是被丢弃还是被强调,假如该值为 1 ,则表示该参数已被丢弃,该值为 2 ,则表明该参数现为强调参数。
注:该视图只在 sys 用户下可以看到。
SQL> SELECT kspponm, DECODE (ksppoflg, 1, 'Obsolete', 2, 'Underscored')
FROM x$ksppo
ORDER BY kspponm;
执行如下SQL:
SQL> select ksppoflg,count(1) from x$ksppo group byksppoflg;
4.2 隐藏参数
Oracle 中的另一类参数就是:隐藏参数 (hidden parameters) ,这类参数是系统使用, Oracle 官方没有公布的参数。
这些参数在所有 Oracle 官方提供的文档中都没有介绍,他们的命名有一个共同特征就是都以 '_'作为参数的首字符.
可以使用x$ksppi, x$ksppcv 视图查看当前系统中的所有隐藏参数, 必须以sys用户登陆:
查看隐含参数
SELECTksppinm, ksppstvl, ksppdesc
FROM x$ksppi x, x$ksppcv y
WHERE x.indx = y.indx AND TRANSLATE (ksppinm,'_', '#') LIKE '#%';
或者用:
SELECT i.ksppinm name,
i.ksppdesc description,
CV.ksppstvl VALUE,
CV.ksppstdf isdefault,
DECODE (BITAND (CV.ksppstvf, 7),
1, 'MODIFIED',
4, 'SYSTEM_MOD',
'FALSE')
ismodified,
DECODE (BITAND (CV.ksppstvf, 2), 2,'TRUE', 'FALSE') isadjusted
FROM sys.x$ksppi i, sys.x$ksppcv CV
WHERE i.inst_id = USERENV ('Instance')
AND CV.inst_id = USERENV('Instance')
AND i.indx = CV.indx
AND i.ksppinm LIKE '/_%' ESCAPE '/'
ORDERBY REPLACE (i.ksppinm, '_', '');
SELECT DECODE (isdefault, 'TRUE', '# '),
DECODE (isdefault, 'TRUE', RPAD (name, 43), RPAD (name, 45)),
VALUE
FROM v$parameter
ORDER BY name;
在列出的参数中,前面有 #这个符号,表示该参数使用了系统中的默认值。