Oracle数据库在创建的时候,会创建一些内建的数据库对象,可以被粗略的氛围四类:
1、数据字典;2、动态性能视图;3、PL/SQL包;4、数据库事件触发器。该笔记就对1、2两项及数据字典和动态性能视图做简要的介绍并介绍常用的一些数据字典和动态性能视图。
一、数据字典
数据字典是每个Oracle数据库的核心,他存储了非常重要的控制信息,这些信息描述了数据库本身和数据库中的各种对象,它们是以只读表和视图的形式存放在SYSTEM表空间中,这些对象是由SYS用户所拥有,由Oracle服务器来管理的。
Oracle数据字典包含2部分:
1、 基表:保存了对数据库的描述,是在执行Create database命令时创建的,创建的脚本是在<ORACLE_HOME>\RDBMS\ADMIN\sql.bsq中;(通常不会直接访问基表)
2、 数据字典视图:简化了基表的信息并展现给用户,通过公共的别名去访问,由数据库脚本<ORACLE_HOME>\RDBMS\ADMIN\catalog.sql创建。
数据字典提供的信息由如下几类:1、数据库的逻辑结构和物理结构;2、数据库对象的定义和空间分配;3、数据完整性约束;4、用户信息;5、角色信息;6、权限信息;7、审计信息。
数据字典视图分为三类,分别由3个前缀标识:
1、 DBA_视图:数据库中的所有视图,只有DBA和具有相关权限的用户才能访问;
2、 ALL_视图:存储的是当前用户可以访问的对象(当前用户不需要拥有它);
3、 USER_视图:存储的是当前用户所拥有和可以访问的对象。
这三者之间存储的数据是有重叠的,只是访问范围不同而已。
此外还有2张总览性的数据字典视图:dictionary和dict_columns,这2张视图保存了当
前数据库中的所有数据字典视图的信息,包括稍后会介绍到的动态性能视图。
下面以USER_前缀的视图为例介绍常用的一些数据字典视图:
1、 USER_USERS:描述用户的信息,包括了用户名、帐户ID、账户状态、表空间名等;
2、 USER_TABLESPACES:描述当前用户可以访问的表空间;
3、 USER_TABLES:描述当前用户所拥有的表的信息;
4、 USER_VIEWS:当前用户所拥有的视图的信息;
5、 USER_OBJECTS:描述当前用户所有对象的信息,包括了SEQUENCE、PROCEDURE、DATABASE LINK、PACKAGE、PACKAGE BODY、TYPE BODY、TRIGGER、MATERIALIZED VIEW、DIMENSION、INDEX、TABLE、SYNONYM、VIEW、FUNCTION、TYPE等类型;
6、 USER_TAB_PRIVS:存储当前用户下对所有表的权限信息;
7、 USER_ERRORS:存储了在当前用户所拥有的对象中所发生的错误;
8、 USER_SOURCE:包含了系统中对象的源码;
其实,很多对象,如DB_LINK,EXTENTS,INDEX,JOB,SEQUENCE,SEGMENT等都可以通过USER_<对象名复数>的表名来访问。数据字典中各个字段的详细意义在《Oracle Database Reference》中都有详细介绍。《Oracle Database Reference》是非常重要的一份文档,不仅是这些数据字典的解释,包括参数文件中各个参数的详细意义以及稍后将介绍的动态性能视图等信息都在这份文档中有详细的解释。
二、动态性能视图
数据字典视图是静态的,指其中的内容是保存在磁盘上,相对不会发生频繁的变动,动态性能视图则是动态的,并不存在于磁盘上,而是存在内存中的一些虚表,主要用于记录当前数据库的活动情况,说它是动态的,是因为在数据库运行的同时,它的内容会根据数据库的运行状态而发生频繁变化,用于监控和调整数据库,同数据字典视图一样,它也是由用户SYS拥有,总的来说,它们均是以V$、GV$、X$开头的一些同义词。相对于数据字典中的dictionary视图一样,动态性能视图中也有一张视图保持了所有动态性能视图的总览视图:V$FIXED_TABLE,另一张视图V$FIXED_VIEW_DEFINITION包含了对这些动态性能视图的定义。从Oracle 8i开始,GV$视图开始被引入,其含义是Global V$,除了一些特例外,每个V$视图均有一个对应的GV$视图存在,GV$视图的产生是为了满足OPS(Oracle Parallel Server,Oracle并行服务器)环境的需要,在OPS环境中,查询GV$视图返回所有实例的消息,而每个V$视图都给予对应的GV$视图而建立,增加了INST_ID列的判断后,用于包含当前实例的信息。
执行下列语句:
SELECT*FROMv$fixed_view_definition vWHEREv.VIEW_NAME ='V$FIXED_TABLE';
查找V$FIXED_TABLE的定义,得到如下结果:select NAME , OBJECT_ID , TYPE , TABLE_NUM from GV$FIXED_TABLE where inst_id = USERENV('Instance')发现V$FIXED_TABLE基于GV$FIXED_TABLE,并添加了INST_ID = USERENV(‘INSTANCE’)限制;我们再查找GV$FIXED_TABLE的定义:
select inst_id,kqftanam, kqftaobj, 'TABLE', indx from x$kqfta
union allselect inst_id,kqfvinam, kqfviobj, 'VIEW', 65537 from x$kqfviunion allselect inst_id,kqfdtnam, kqfdtobj, 'TABLE', 65537 from x$kqfdtV$和GV$视图是通过catalog.sql脚本创建的,下面的其中创建v$fixed_table视图的脚本: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;首先V_$视图被创建,然后基于V_$的同义词被创建,所以其实我们访问的V$视图是个同义词,而最终的V$视图是基于X$表建立的。
X$表是Oracle数据库运行的基础粗,在数据库启动时由Oracle应用程序动态创建。这部分表对于数据库来说至关重要,所以Oracle不允许SYSDBA之外的用户直接访问,即便授权也是不允许的,如执行下列命令:GRANTSELECTONx$kqftaTOscott;会收到错误:ORA-02030:只能从固定的表/视图查询。
常用的动态性能视图如下:
1、 v$controlfile:显示控制文件列表;
2、 v$database:从控制文件中获取的数据库的信息;
3、 v$datafile:显示数据文件的信息;
4、 v$instance:显示当前实例的状态;
5、 v$parameter:显示内存中的参数信息
6、 v$session:显示当前会话的信息;
7、 v$sga:显示SGA的信息;
8、 v$spparameter:显示SPFILE文件中的参数信息,如果SPFILE没有被用来启动实例,则视图中的所有ISSPECIFIED列将会是FALSE;
9、 v$tablespace:从控制文件中获取的表空间的信息;
10、v$thread:从控制文件中获取的线程的信息;
11、v$version:获取关键组件的版本信息。