LLL的数据库培训—第二部分—Oracle基础知识培训—第6讲—Oracle11g的数据字典
一、数据字典简介
1、什么是数据字典
数据字典是由 Oracle服务器创建和维护的一组只读的系统表【与审计有关的数据字典(以AUDS开头的表)除外,这些表是可以修改的】。
数据字典中存放了有关数据库和数据库对象的信息,Oracle服务器就是依赖这些信息来管理和维护 Oracle数据库的。
【简单案例】
dba_data_files dba_table_spaces; dba_temp_files;
2、数据字典的分类
通常说的数据字典由4部分组成:内部RDBMS(X$)表、数据字典表(*$)、动态性能视图(V$)和[静态]数据字典视图。(两表两视图)
(1)内部RDBMS表(X$)——基表
X$表示Oracle数据库的核心部分,这些表用于跟踪数据库内部信息,维持数据库的正常运行。
X$表是加密命名的,而且Oracle不做文档说明。
X$表是Oracle数据库的运行基础,在数据库启动时由Oracle应用程序动态创建。
比如X$BH、X$KSMSP等。研究这些表的最好的办法就是借用Oracle的autotrace功能(set autotrace trace explain/set autotrace on )。
(2)数据字典表(*$)——基表
数据字典表(Data dictionary table)用以存储表、索引、约束以及其它数据库结构的信息,
这些对象通常以“$”结尾(例如:TAB$、OBJ$、TS$等),在创建数据库的时候通过运行$ORACLE_HOME/rdbms/admin/sql.bsq脚本来创建。
sql.bsq是一个非常重要的文件,其中包含了数据字典表的定义及注释说明,应仔细阅读研究。
比如我们经常使用的V$DBA_OBJECT视图就是基于V$OBJ创建的;
再比如,当用户创建一张表的时候,Oracle将会在后台执行一系列的内部操作,比如向objV$表中插入数据、向tab$表中记录表数据等。
(3)动态性能视图(gv$*,v$*)
动态性能视图记录了数据库运行时信息和统计数据,大部分动态性能视图被实时更新以及反映数据库当前状态。
在数据库启动时,Oracle动态创建X$表,在此基础上,Oracle创建了GV$和V$视图,GV$即Global V$,除了一些特例外,每个V$都对应一个GV$。
GV$产生是为了OPS/RAC环境的需要,每个V$都是基于GV$的,只是GV$多了INST_ID列来显示实例ID。
(4)数据字典视图(user_*、all_*、dba_*)
在非sys用户下,我们访问的都是同义词,而不是V$视图或GV视图。
由于X$表和数据字典表通常不能直接被用户访问,Oracle创建了静态数据字典视图来提供用户对于数据字典信息的访问。
由于这些信息通常相对稳定,不能直接修改,所以又被称为静态数据字典视图。
绝大多数用户,包括数据库管理员(DBA)都是通过访问数据字典视图来得到数据库的相关信息。
数据字典视图把数据字典基表的信息转换成了人们较为容易理解的形式。
数据字典视图包括用户名、用户的权限、对象名、约束和审计等方面的信息。
数据字典视图是通过运行 catalog.sql脚本文件来产生的。
我们可以在$ORACLE_HOME/rdbms/admin目录下找到该catalog.sql脚本文件和bsq脚本文件,以及许多其他的数据库管理和维护所需的脚本文件。
如果使用的是在安装 Oracle系统时创建的默认数据库或 Oracle图形工具(DBCA)创建的数据库,则 catalog.sql脚本文件都是自动运行的。
静态数据字典视图按照前缀的不同通常分成三类:
USER_: 用户所拥有的相关对象信息; ALL_: 用于有权限访问的所有对象的信息; DBA_: 数据库所有相关对象的信息,用于需要有 select any table 的权限才能访问。
3、数据字典中存放的信息
数据字典中存储了如下的数据库信息:
(1)数据库的逻辑结构和物理结构,如表空间和数据文件的信息。
(2)所有数据库对象定义的信息。这些对象包括表、索引、视图、序列号、同义词、过程软件包和触发器等。
(3)所有数据库对象的磁盘空间分配的信息,如对象所分配的磁盘空间和当前正在使空间。
(4)Oracle用户名
(5)每个用户所授予的权限和角色。
(6)完整性约束的信息。
(7)列的默认值。
(8)审计信息等。
4、数据字典的操作和使用
(1)数据字典的维护者
主要是由 Oracle服务器来使用的,所以对数据字典的操作和维护都是有Oracle服务来完成的。
Oracle服务器通过访问基表来获得诸如用户、用户对象和存储结构等方面的信息并利用这些信息进行所需的数据库的管理和维护。
(2)数据字典的数据修改者
通常只有 Oracle服务器可以修改数据字典中的数据。
在 Oracle数据库运行期间,如果数据库的结构发生了变化, Oracle服务器会及时地修改相应的数据字典以记录这种变化。
(3)哪些SQL语句可以引起 Oracle服务器修改数据字典?
①首先是DDL语句,如增加或减少表空间,增加或减少用户。【create,drop,truncate等】 ②其次是DCL语句,如授予用户权限、回收用户权限等。【revoke,grant】 当数据管理员或用户发了DDL或DCL语句时, Oracle服务器都要将相关的信息记录到数据字典中。 ③另外,某些DML语句也可能间接地引起 Oracle服务器修改数据字典,如引起表的磁盘存储空间扩展的插入(insert)或修改(update)语句。 当这类DML语句被执行时, Oracle也要将相关磁盘存储空间变化的信息记录到数据字典上。【insert、delete、update、select等】
(4)oracle用户是否可以使用DML修改数据字典的内容
任何用户或数据库管理员(DBA)都不能直接使用DML语句修改数据字典中的内容。
(5)用户如何获得数据库相关信息
所有用户和数据库管理员(DBA)只能通过访问数据字典(视图)来得到数据库的相关信息。
一些数据字典视图可以被所有用户访问,而另一些只能被数据库管理员访问。
既然数据字典是表或视图,因此可以使用SQL的查询语句从数据字典中获取信息。
二、静态数据字典视图
1、数据字典视图分为3大类。
它们用前缀来区别,其前缀分别为USER、ALL和DBA。
【案例】
user_tables
all_tables
dba_tables
2、数据字典视图使用方法
USER_*:有关用户所拥有的对象的信息,即用户自己创建的对象的信息。
ALL_*:有关用户可以访问的对象的信息,即用户自己创建的对象的信息再加上其他用户创建的对且但当前用户有权访问的信息。
DBA_*:有关整个数据库中对象的信息。
这里的*可以为 TABLES、 INDEXES、OBJECTS等。
3、不同前缀的数据字典包含关系
4、常用的数据字典视图:
user_objects、all_objects、dba_objects
user_tables、all_tables、dba_tables
user_indexs、all_indexs、dba_indexs
user_constraints、all_constraints、dba_constraints
类似还有:
extents 存储分配信息,包括数据段名 表空间名和分区编号,分区大小 indexes 索引信息 包含索引类型, 唯一性, 索引作用等表的信息 ind_columns 索引列信息 包括索引上的列的排序方式等信息 object 对象信息, 包括对象名称 类型 创建时间 等信息 segments 表和索引的数据段信息,包括表空间,存储设置等信息 sequences 序列信息 包含序列名称 ,循环性,最大值等信息 source 除触发器之外的所有存储过程,函数,包的源代码信息 synonyms 同义词信息 包括引用的对象等信息 sys_privs 系统权限信息 包括系统权限名称 授予者 tab_columns 表和视图的列信息 ,包括列的数据类型等信息 tab_privs 表权限信息 tables 表信息 包括表所属的表空间 ,存储参数 ,数据行数量等信息。 triggers 触发器信息 包括触发器的类型,事件。触发器体等信息 users 用户信息 。包括用户临时和默认的表空间的类型 views 视图 信息
三、动态性能视图
1、什么是动态性能视图?
在 Oracle数据库中,还有另一大类数据字典视图,即动态性能视图。动态性能视图是一组虚表,在 Oracle数据库运行期间,这些虚表存在于内存中。
在整个数据库运行期间, Oracle服务器将当前数据库的活动记录在这组虚表中。
因此这些动态性能视图中的信息(这些信息是来自内存和控制文件)实时地反映了数据库运行的状态。
Oracle数据库中以v$开始的动态性能视图,有些像Unix和Li操作系统的proc文件系统(内存文件系统)。
sys用户拥有所有的动态性能视图,它们的名字都是以v$开头,利用动态性能视图可以获得类似如下信息:
(1)会话活动的信息;
(2)对象打开或关闭的信息;
(3)对象在线或离线的信息等。
一般Oracle数据库管理员,经常使用这些动态性能视图(也有人称它们为数据库调优工具)来监督Oracle数据库的运行,或获取诊断和调优所需要的信息。
2、动态性能视图不允许DML 操作,如何知道数据库的数据字典?
可以通过查询数据操作的字典 v$fixed_table或 dictionary来得到 Oracle数据库中所有的数据字典(视图)。
(1)数据字典 dictionary:
只有两列 TABLE_NAME和 COMMENTS,它列出了所有的数据字典,既包括静态的也包括动态的数据字典(视图)。在 COMMENTS(注释列中给出了所列的数据字典(系统表)的简单解释。
(2)v$fixed_table:
只是列出了动态数据字典(系统表)的名和类型等,也未给出任何解释。
3、动态性能视图介绍
动态性能视图属于数据字典,系统管理员用户 SYS 可以访问它们。在数据库打开和使用时不断进行更新,而且它们的内容主要与性能有关。虽然这些视图很像普通的数据库表,但它们不允许用户直接进行修改。这些视图提供内部磁盘结构和内存结构方面的数据。用户可以对这些视图进行查询,以便对系统进行管理与优化。当数据库管理员启动某个例程时,数据库会自动建立动态性能视图;当停止某个例程时,数据库又会自动删除这些动态性能视图。
我们能再动态视图中掌握:
数据库运行相关的性能数据,如内存的使用量、磁盘排序发生的机率等等。
取得与磁盘和内存结构相关的其他信息。
4、状态转换时的动态性能视图
(1)数据库处于“NOMOUNT”状态。数据库启动例程时,Oracle数据库会打开参数文件,分配SGA内存并启动后台进程。此时,其实数据库还没有挂栽。此时,动态性呢视图收集的信息来源只有是SGA,而不会从控制文件中收集相关的信息。所以,动态性能视图的数量要少得多。
(2)当数据库处于MOUNT状态时,数据库会根据初始化参数打开所有的控制文件。所以,当例程处于Mount状态时,动态性能视图其收集到的信息就要第一个状态多的多。因为此时,动态性能视图还会去收集控制文件的相关信息。不过,此时动态性能视图所收集到的资料还不是最全的。
(3)当用户打开数据库时,Oracle系统会根据控制文件所记载的信息去打开所有的数据库文件以及重做日志。此时,数据库管理员除了可以从 SGA和控制文件中获取信息的动态性能视图外,还可能访问与Oracle数据库性能相关的动态性能视图,如会话等待时间等视图。
另外需要注意一点,就是只有在这个状态时,我们才能够访问数据库的数据字典视图。
5、V$, V_$, GV$, X$ 视图说明
(1)说明
GV$:全局视图,针对多个实例环境
V$:针对某个实例的视图。
X$:是GV$视图的数据来源,Oracle内部表。
--v$ 是v_$的同义词,v_$是基于真正的视图v$,而真正的v$视图是在gv$的基础上限制inst_id得到;
--gv$是gv_$的同义词,gv_$基于真正的视图gv$,而真正的gv$视图基于系统表X$。
(2)X$表
X$表包含了特定实例的各方面的信息,是Oracle数据库的运行基础,如当前的配置信息,连接到实例的会话,以及丰富而有价值的性能信息。 X$表并不是驻留在数据库文件的永久表或临时表。X$表仅仅驻留在内存中,当实例启动时,由Oracle应用程序动态创建,在内存中进行实时的维护。 它们中的大多数至少需要装载或已经打开的数据库。X$表为SYS用户所拥有,并且是只读的。 不能进行DML(更新,插入,删除)。X$表对数据库来说至关重要,所以Oracle不允许SYSDBA之外的用户直接访问,显示授权不被允许。
(3)V$视图
动态性能视图由前缀V_ $标识。
这些视图的公同义词具有前缀V$。数据库管理员或用户应该只访问V$对象,而不是访问V_ $对象。动态性能视图由企业管理器和Oracle Trace使用,
Oracle Trace是访问系统性能信息的主要界面。-但实例启动,从内存读取数据的V$视图就可以访问
查询视图:
select * from DBA_SYNONYMS where rownum<5;
(4) GV$ 视图
从Oracle8开始,GV$视图开始被引入, GV$(Global V$,全局V$)。除了一些特例以外(如:V$CACHE_LOCK、V$LOCK_ACTIVITY、V$LOCKS_WITH_COLLISIONS和V$ROLLNAME),每个V$视图都有一个对应的GV$视图存在。在并行服务器环境下,可查询GV$视图从所有限定实例中检索V$视图的信息。V$视图和GV$视图是相同的,V$比GV$只是少了INST_ID字段。INST_ID 列显示从其获得相关的V$视图信息的实例号。INST_ID 列可用作一个从可得到的实例集检索V$信息的过滤器。
查询GV视图:通过v$fixed_table 查询GV$视图信息:
SQL> select count(*) from v$fixed_table where name like 'GV$%'; COUNT(*) ---------- 523
(5) G_$是全局视图,多由x$表得来
查看select * from v$fixed_view_definition where instr(view_name,'$')=3 and rownum<3;
四、常用的动态性能视图
视图名称 说明 v$fixed_table 显示当前发行的固定对象的说明 v$instance 显示当前实例的信息 v$latch 显示锁存器的统计数据 v$librarycache 显示有关库缓存性能的统计数据 v$rollstat 显示联机的回滚段的名字 v$rowcache 显示活动数据字典的统计 v$sga 记录sga区的信息 v$sgastat 记录sga的详细信息 v$sort_usage 显示临时段的大小及会话 v$sqltext 记录sql语句的语句信息 v$sqlarea 记录sql区的sql基本信息 v$stsstat 显示基本的实例统计信息 v$system_event 显示一个事件的总计等待时间 v$waitstat 显示块竞争统计数据 v$session 会话
(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 作用: v$process视图包含当前系统oracle运行的所有进程信息。常被用于将oracle或服务进程的操作系统进程ID与数据库session之间建立联系。 (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 V$ROLLNAME显示处于ONLINE状态的UNDO段,V$ROLLSTAT显示UNDO段的统计信息。通过二者执行连接查询,以显示UNDO的详细统计信息 select a.name,b.xacts from V$rollname a,V$rollstat b where a.usn=b.usn; (16)v$rowcache shared pool / Library cache (17)v$segstat & v$segment_statistics (18)v$system_event (19)v$undostat (20)v$waitstat (21)V$TABLESPACE 显示表空间信息 (22)V$THREAD 取得重做线程的详细信息,当使用RAC结构时,每个例程都对应一个重做线程,并且每个重做线程包含独立的重做日志组。select thread#,status,groups,instance,sequence# from v$thread ; (23)V$LOCK 显示锁信息,通过与V$SESSION进行连接查询,可以显示占有锁的会话,以及等待锁的会话。 (24)V$LOCKED_OBJECT 显示被加锁的数据库对象。通过与DBA_OBJECTS进行连接查询,以显示具体的对象名及执行加锁操作的ORACLE用户名。 (25)V$FIXED_TABLE 该动态性能视图用于列出所有可用的动态性能视图和动态性能表。 select * from v$fixed_table ; (26)V$INSTANCE 获取当前例程的详细信息。select instance_name,host_name,status from V$instance; (27)V$SGA---V$SGAINFO 显示SGA主要组成部分和更详细的信息 (28)V$VERSION 获取版本 (29)V$OPTION 显示已经安装的ORACLE选项 select * from v$option; (30)V$BGPROCESS 显示后台进程详细信息 select name,description from V$bgprocess (31)$DATABASE 取得当前数据库的详细信息 (32)V$DATAFILE select file#,name,bytes from v$datafile ; (33)V$DBFILE 取得数据文件编号及名称 select * from v$dbfile ; (34)V$LOGFILE 显示重做日志成员的信息 select group#,member from V$logfile; (35)V$LOG select group#,thread#,sequence#,bytes,members,status from V$log;
五、常用的静态字典视图
字典名称 说明 dba_tables 所有用户的所有表信息 dba_tab_columns 所有用户的表的字段信息 dba_views 所有用户的所有视图信息 dba_synonyms 所有用户的所有同义词信息 dba_sequences 所有用户的所有序列信息 dba_constraints 所有用户的表的约束信息 dba_ind_columns 所有用户的表的索引的字段信息 dba_triggers 所有用户的触发器信息 dba_sources 所有用户的存储过程信息 dba_segments 所有用户的段的使用空间信息 dba_extents 所有用户的段的扩展信息 dba_objects 所有用户对象的基本信息 cat 当前用户可以访问的所有基表 tab 但前用户创建的所有基表、视图、同义词等 dict 构成数据字典的所有表的信息
六、与数据库组件相关的数据字典
数据库组件 数据字典中的表或视图 说明 数据库 v$datafile 记录系统的运行情况 表空间 dba_tablespaces 记录系统表空间的基本信息 dba_free_space 记录系统表空间的空闲空间信息 控制文件 v$controlfile 记录系统控制文件的基本信息 v$control_record_section 记录系统控制文件中记录文档段的信息 v$parameter 记录系统个参数的基本信息 数据文件 dba_data_files 记录系统数据文件及表空间的基本信息 v$filestat 记录来自控制文件的数据文件信息 v$datafile_header 记录数据文件头部的基本信息 段 dba_segments 记录段的基本信息 区 dba_extents 记录数据区的基本信息 日志 v$thread 记录日志线程的基本信息 v$log 记录日志文件的基本信息 v$logfile 记录日志文件的概要信息 归档 v$archived_log 记录归档日志文件的基本信息 v$archived_dest 记录归档日志文件的路径信息 数据库实例 v$instance 记录实例的基本信息 v$system_parameter 记录实例当前有效的参数信息 内存结构 v$sga 记录sga区的信息 v$sgastat 记录sga的详细信息 v$db_object_cache 记录对象缓存的大小信息 v$sql 记录sql语句的详细信息 v$sqltext 记录sql语句的语句信息 v$sqlarea 记录sql区的sql基本信息 后台进程 v$bgprocess 显示后台进程信息 v$session 显示当前会话信息