数据字典
作用:
- 数据库中所有模式对象的信息,如表、视图、簇、索引等
- 分配多少空间,当前使用了多少空间等
- 列的缺省值
- 约束信息的完整性
- 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的所有数据字典视图:
包括动态视图和静态视图
-- 查看数据库中所有的数据字典视图
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种状态:
- 执行
startup nomount;
语句之后,数据库实例启动,但是控制文件等都没有挂载。此时处于STARTED
状态;- 执行
alter database mount;
之后,数据库控制文件进行挂载,此时处于MOUNTED
状态;- 执行
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