一.数据字典:
oracle的数据字典记录了数据库管理的元数据,他对于数据库来说是生死攸关的核心档案。
1.数据字典放在system表空间,用户是sys。
2.描述数据库和对象的定义,
3..数据字典是只读的。
4.是server维护的,只能查询。
5.大部分由catalog.sql创建的。
通常所说的数据字典由四部分组成:内部 RDBMS(X$)表、数据字典表、动态性能(V$)视图和数据字典视图。
二. 数据字典组成:
1. 内部 RDBMS(X$)表
X$表是 Oracle 数据库的核心部分,这些表用于跟踪内部数据库信息,维持数据库的正常运行。X$表是加密命名的,而且 Oracle 不作文档说明,这部分知识是 Oracle 公司的技术机密,Oracle
通过这些 X$建立起其他大量视图?供用户查询管理数据库之用。但是由于 X$表记录了大量有用的信息,所以也不停的被全球 DBA 不懈的探索着,最为人所熟知的有:X$BH,X$KSMSP 等。
2. 数据字典表
数据字典表(Data dictionary table)用以存储表、索引、约束以及其他数据库结构的信息。这些对象通常以“$”结尾(例如 TAB$、OBJ$、TS$等),在创建数据库的时候通过运行 sql.bsq脚本来创建。
3.静态数据字典视图
由于 X$表和数据字典表通常不能直接访问,Oracle 创建了静态数据字典视图来?供用户对于数据字典信息的访问,由于这些信息通常相对稳定、不能直接修改,所以又被称为静态数据字典视图。数据字典视图在创建数据库时由 catalog.sql
脚本(该脚本位于$ORACLE_HOME/rdbms/admin/目录下)创建。
①.静态数据字典视图按照前缀的不同通常被分为三类:
a.USER_ 类视图包含了用户所拥有的相关对象信息,用户可以通过这个视图查询自己拥有的对象信息。
b.ALL_ 类视图包含了用户有权限访问的所有对象的信息。
c.DBA_ 类视图包含了数据库所有相关对象的信息,用户需要 SELECT ANY TABLE 权限才能访问。
②.常用数据字典视图举例
a.DICT / DICTIONARY
为了方便检索, Oracle ?供一个名为字典(DICTIONARY)的 视 图 ,基 于 这 个 视 图 , Oracle又创建了两个名为 DICT 和 DICTIONARY 的同义词:
b. DICT_COLUMNS
同 DICT 类似,DICT_COLUMNS 视图记录了字典视图列(COLUMN)及其相关说明:
c. OBJ$/DBA_OBJECTS/OBJ
OBJ$是一个底层的字典表,其中记录了数据库中所有对象的信息,DBA_OBJECTS 视图基于 OBJ$建立,一脉相承的,ALL_OBJECTS 和 USER_OBJECTS 视图也随之建立。
4.动态性能视图:
动态性能(V$)视图(Dynamic Performance View)记录了数据库运行时信息和统计数据,大部分动态性能视图被实时更新以反映数据库当前状态。 Oracle 通过动态性能视图将 Oracle 数据库的状态展示出来,提供给用户和数据库管理员,Oracle
对 V$视图给出了详细的文档说明供开发管理人员参考,是我们研究和管理数据库的主要依据。
①.GV$和 V$视图
在数据库启动时,Oracle 动态创建 X$表,在此基础之上,Oracle 创建了 GV$和 V$视图。 从 Oracle8 开始,GV$视图开始被引入,其含义为 Global V$。 除了一些特例以外,每个 V$视图都有一个对应的 GV$视图存在。
GV$视图的产生是为了满足 OPS/RAC 环境的需要,在 OPS/RAC 环境中,查询 GV$视图返回所有实例信息,而每个 V$视图是基于 GV$视图,增加了 INST_ID 列的 WHERE 条件限制建立,只包含当前连接实例信息。
总结一下,Oracle 的 GV$视图和 V$视图是在数据库创建过程中建立起来的,内置于数据库中,Oracle 通过 v$fixed_view_definition 视图为我们展现这些定义。
②.GV_$,V_$视图和 V$,GV$同义词
在 GV$和 V$之后,Oracle 建立了 GV_$和 V_$视图,随后为这些视图建立了公用同义词。这些工作都是通过 catalog.sql 脚本(该脚本位于$ORACLE_HOME/rdbms/admin/目录下)实现的。
从 catalog.sql 脚本中摘录一段:
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;
create or replace view gv_$fixed_table as select * from gv$fixed_table;
create or replace public synonym gv$fixed_table for gv_$fixed_table;
实际上通常大部分用户访问的 V$对象,并不是视图,而是指向 V_$视图的同义词;而 V_$视图是基于真正的 V$视图(这个视图是基于 X$表建立的)创建的。
5.动态性能视图与数据库启动
由于动态性能视图是在数据库启动过程中自动创建的,所以在数据库启动的不同阶段,我们能够访问的视图也各不相同。
①. 在 Nomount 阶段
当数据库启动到 nomount 状态时,实际上仅仅启动了数据库实例,此时的实例信息主要来自参数文件,因此和参数文件记录的相关信息可以查询,以下是这一阶段可以获
取信息的主要视图:
V$PARAMETER、V$SPPARAMETER
V$SGA、V$SGASTAT、V$BH、V$INSTANCE
V$OPTION、V$VERSION
V$PROCESS、V$SESSION
②. 在 Mount 阶段
当数据库启动到 Mount 状态时,控制文件被读取,和控制文件相关的视图此时可以进行查询,以下是这一阶段可以获取信息的主要视图:
V$THREAD、V$CONTROLFILE、V$DATABASE、
V$DATAFILE、V$LOGFILE、V$DATAFILE_HEADER
③. 在 Open 阶段
当数据库 Open 之后,所有的动态性能视图和数据字典都可以被查询。
二.数据字典里的同义词:
SQL> select file#,name from v$datafile; (同义词)
FILE# NAME
---------- --------------------------------------------------
1 /u01/app/oracle/oradata/prod/disk3/system01.dbf
2 /u01/app/oracle/oradata/prod/disk3/sysaux01.dbf
3 /u01/app/oracle/oradata/prod/disk3/undotbs01.dbf
4 /u01/app/oracle/oradata/prod/disk3/users01.dbf
SQL> select file#,name from v_$datafile;
FILE# NAME
---------- --------------------------------------------------
1 /u01/app/oracle/oradata/prod/disk3/system01.dbf
2 /u01/app/oracle/oradata/prod/disk3/sysaux01.dbf
3 /u01/app/oracle/oradata/prod/disk3/undotbs01.dbf
4 /u01/app/oracle/oradata/prod/disk3/users01.dbf
三.模糊查询视图名称
select * from dictionary where table_name like ‘DBA‘;
四.数据字典的视图:(重点)
数据字典视图的分类,静态(static)和动态(dynamic)
1.动态视图
大部分在mount下就可以访问,反映数据库实时的状态
大部分v$开头,多用单数,从控制文件和内存汇总读出。
从v$fixed_table 这个视图查到所有的动态视图的名称。
用于调优和数据库监控。
v$_单数 单实例的动态视图。
Gv$_单数 rac环境的动态视图
SQL> select count(*) from v$fixed_table;
COUNT(*)
----------
1396
常用静态视图:
select name from v$tablespace;
select file#,name from v$datafiles;
select * from v$log;
select * from v$logfile;
select name from v$archived_log;
2.静态视图
在数据库的open状态下访问,用于了解数据库的物理结构信息。
大部分以dba、all、user开头,并用复数形式
user_:存储当前用户所拥有的对象的相关信息
all_:存储当前用户能够访问的对象
dba_:存储所有用户对象的信息(默认只能有sys/system用户访问)
例:
查看区信息
select segment_name ,segment_type,tablespace_name, bytes/1024 k,extents,blocks from dba_segments;
#查看数据文件
SQL> select file_id,file_name,tablespace_name,bytes/1024/1024 m from dba_data_files;