数据字典

作用:

  • 数据库中所有模式对象的信息,如表、视图、簇、索引等
  • 分配多少空间,当前使用了多少空间等
  • 列的缺省值
  • 约束信息的完整性
  • Oracle用户的名字
  • 用户及角色被授予的权限
  • 用户访问及使用的审计信息
  • 其他产生的数据库信息

数据字典的组成

数据字典包含两类视图:

  • 静态数据字典(描述数据库的信息)

    这些数据经常是静止的

  • 动态数据字典(描述实例信息)

    反应数据库运行的状态,反应数据库实例运行的信息,这些信息经常是变化的

静态的数据字典

  • dba_*

    整个数据库所有内容。

    例如:dba_tables、dba_segments、dba_indexes…..

  • all_*

    当前用户能够看到的所有内容。

    例如:all_tables、all_segments、all_indexes…

  • user_*

    当前用户下的内容。

    例如:user_tables、user_segments、user_indexes…

动态数据字典

  • v$*

    本地(当前实例)的动态视图

    例如:v$instance、v$log、v$lock…..

  • gv$*

    全局(RAC架构下所有的实例)的动态视图

    gv$instance、gv$log、gv$lock….

数据字典视图

dict:dictionary

查看oracle的所有数据字典视图:

包括动态视图和静态视图

  1. -- 查看数据库中所有的数据字典视图
  2. select * from dict;

Oracle数据字典的基表

基表:

  • 是保存数据的真正的表
  • 数据字典视图的数据来自于基表
  • Oracle不对基表做支持和解释

    基表大部分以X$开头。

    查询基表:

select * from v$fixed_table where name like 'X$%';
  • 基表里很多信息不提供给数据字典视图,由Oracle自己使用

    比如:x$bh

  • 基表可以使用select语句进行查询,但是只能以sysdba身份的用户(即sys用户)登录。即使有dba权限的用户也不能查看。

通过查看数据字典视图的执行计划即可查看其真正查询的基表。

常用动态视图

v$instance(gv$instance)

数据库实例相关信息。

可以查看当前数据库实例的状态、版本、启动时间等信息。

例如查看数据库的状态:

select status from v$instance;

Tips:

数据库实例的3种状态:

  1. 执行 startup nomount; 语句之后,数据库实例启动,但是控制文件等都没有挂载。此时处于 STARTED状态;
  2. 执行 alter database mount; 之后,数据库控制文件进行挂载,此时处于 MOUNTED 状态;
  3. 执行 alter database open;之后, 此时数据库实例打开,处于 OPEN 状态;

v$database

数据库相关信息。

查看数据库的名称、启动时间、是否归档、是否开启闪回等相关信息。

select name, created, log_mode, flashback_on from v$database;

Tips:

查看数据库是否归档,也可以直接通过:

archive log list;

redo日志相关信息

v$log + v$logfile

-- 查看redo日志相关信息
-- redo组名、线程号、当前切换的redo的序列号、大小、有几个成员、状态、是否被归档等
select group#, thread#, sequence#, bytes, members, status, archived from v$log;

-- 查看redo日志文件在磁盘上的位置
select * from v$logfile;

Tips:

oracle动态视图中,字段名后面加#号,一般表示该字段为一个数字类的编号。

v$session

会话相关信息。

该视图可以和其他视图配合使用,用来做sql调优。

例如:

A窗口查看自己的sid:

select distinct sid from v$mystat;
-- 响应结果为A窗口的会话id,例如65

A窗口发出一条sql:

select count(*) from payment;

在B窗口查看SID为65的会话的信息

-- 查看sid为65的会话刚刚查询的sql编号
select sql_id from v$session where sid='65';
-- 响应结果为A窗口刚刚查询的sql的编号,例如8axngqmpq72wt

查看该sql_id对应的cpu耗时、执行耗时(毫秒)、sql内容:

select cpu_time, elapsed_time, sql_text from v$sql where sql_id='8axngqmpq72wt';

查看一个会话对应的操作系统的进程号:

select spid from v$process where addr=(select addr from v$session where sid=65);

v$session_wait

查看会话的等待事件。

-- 查看会话id、等待的事件、等待的时间
select sid,event,seconds_in_wait from v$session_wait;

阻塞、锁相关信息

v$lock + v$locked_object

数据库表被锁之后,可以通过v$lock查看持有锁的会话:

select sid, type, lmode, request, block 
from v$lock
where type in ('TM', 'TX');

假如查到以下结果:

SID Type LMode Request Block
35 TX 0 6 0
35 TM 3 0 0
198 TM 3 0 0
198 TX 6 0 1

表示的含义:

根据TM类型可以看到,198、35号会话对对象加了3号锁(该锁为共享锁,可以被多个会话持有);
同时,198会话持有一个6号TX类型事务锁,且Block为1,说明其阻塞了其他会话;
35的Request中显示,35号会话在请求6号锁。

根据会话id,可以查看该会话的锁的对象编号:

select session_id, object_id, locked_mode,
from v$locked_object
where session_id in (35, 198); --会话编号

可以看到查询结果:

SESSION_ID OBJECT_ID LOCKED_MODE
35 76844 3
198 76844 3

说明,编号为76844的对象,被35、198两个会话加了锁。

然后可以根据object_id查询到具体被锁的数据库表名:

select object_name
from dba_objects
where object_id=76844;  -- object_id