7
§1 Oracle 开发人员/DBA 数据字典 关键字:Oraclescript Data Dictionary 读者级别:入门级 作者:赵元杰 概要: Oracle 公司自 Oracle 9i 版本开始提供一个称为 Oracle Enterprise Manager (OEM)的图像界面,它给广大用户带来了面目一新的友好界面,特别是给 DBA 带来极大的方便。DBA 可从过去记住多个数据字典和掌握许多查询技巧才能实 现的繁琐任务中解放出来。毫无疑问,OEM 是一个非常好的产品,但是,作为 深入了解 Oracle 内幕和分析复杂问题的 DBA 来说,除了熟练掌握 OEM 的使用 方法外,还应该掌握一些必要的数据字典和查询技巧,那么,在遇到复杂问题时 可通过查询数据字典的方法,从多个角度深入剖析问题的根源,从而帮助你解决 棘手的问题。本文章从初学者的角度出发,介绍如何掌握一些数据字典和查询技 巧。 §1.1 数据字典和视图查询重要吗 ? 数据字典和视图是用来存储 Oracle 系统的重要数据的一组内部表,数据字 典存储的数据包括 Oracle 系统本身的信息(如数据库名称、字符集信息)等,也包 括用户使用 Oracle 系统过程中所产生的数据,比如用户创建表所产生的表结构 信息、创建的存储过程的代码等。这些数据字典中的数据是由 Oracle 系统自动 维护,作为使用 Oracle 系统的技术人员,只要掌握如何从这些数据字典中查询 需要的信息即可,比如,你想了解你自己有几个表,你需要查询 User_tables 据字典,如果你了解表的列的信息,你还要查询 User_tab_columns 数据字典。又 比如,Oracle 系统运行时出现慢的现象,DBA 想看到哪些语句产生了“锁”现 象导致其他会话处于等待状态,则 DBA 需要查询 V$SESSION V$LOCK 等。 §1.2 数据字典与 OEM 对于 Oracle 初学者来说,可能会问,现在除了使用 Oracle 10g/11g OEM 外,还有许多界面漂亮的图形界面工具可选,比如 Quest 公司的 Toad 等,你介 绍的数据字典和查询技巧不是多余的了吗?其实,要回答这个问题也是比较简单 的,图形界面能以最简单和直观的方法展现数据字典内的数据,比如:你看到某 个表空间的总空间是 nnnMB,现在已经用去 xxxMB,还剩下 yyyMB 等。此外, 图形界面还给出相应的告警信息等,这些都是图形界面的优势所在。但是,图形 界面有时不会给出详细的信息,比如:USERS 表空间总 1000MB,现在已经使 用了 600MB,还剩下 400MB,这时,你在 USERS 表空间上创建一个表 my_tab1创建 my_tab1 表时使用 STORAGE ( initial 400MB,…)来该表预分配存储空间 400MB 就可能失败,你再改为 200MB 仍然失败。那么,你会感觉明明剩下 400MB

A.oracle 数据字典与脚本初步

Embed Size (px)

Citation preview

Page 1: A.oracle 数据字典与脚本初步

§1 Oracle 开发人员/DBA 与 数据字典

关键字:Oracle、script 、Data Dictionary

读者级别:入门级

作者:赵元杰

概要:Oracle 公司自 Oracle 9i 版本开始提供一个称为 Oracle Enterprise Manager

(OEM)的图像界面,它给广大用户带来了面目一新的友好界面,特别是给 DBA

带来极大的方便。DBA 可从过去记住多个数据字典和掌握许多查询技巧才能实

现的繁琐任务中解放出来。毫无疑问,OEM 是一个非常好的产品,但是,作为

深入了解 Oracle 内幕和分析复杂问题的 DBA 来说,除了熟练掌握 OEM 的使用

方法外,还应该掌握一些必要的数据字典和查询技巧,那么,在遇到复杂问题时

可通过查询数据字典的方法,从多个角度深入剖析问题的根源,从而帮助你解决

棘手的问题。本文章从初学者的角度出发,介绍如何掌握一些数据字典和查询技

巧。

§1.1 数据字典和视图查询重要吗 ?

数据字典和视图是用来存储 Oracle 系统的重要数据的一组内部表,数据字

典存储的数据包括 Oracle 系统本身的信息(如数据库名称、字符集信息)等,也包

括用户使用 Oracle 系统过程中所产生的数据,比如用户创建表所产生的表结构

信息、创建的存储过程的代码等。这些数据字典中的数据是由 Oracle 系统自动

维护,作为使用 Oracle 系统的技术人员,只要掌握如何从这些数据字典中查询

需要的信息即可,比如,你想了解你自己有几个表,你需要查询 User_tables 数

据字典,如果你了解表的列的信息,你还要查询 User_tab_columns 数据字典。又

比如,Oracle 系统运行时出现慢的现象,DBA 想看到哪些语句产生了“锁”现

象导致其他会话处于等待状态,则 DBA 需要查询 V$SESSION 和 V$LOCK 等。

§1.2 数据字典与 OEM

对于 Oracle 初学者来说,可能会问,现在除了使用 Oracle 10g/11g 的 OEM

外,还有许多界面漂亮的图形界面工具可选,比如 Quest 公司的 Toad 等,你介

绍的数据字典和查询技巧不是多余的了吗?其实,要回答这个问题也是比较简单

的,图形界面能以最简单和直观的方法展现数据字典内的数据,比如:你看到某

个表空间的总空间是 nnnMB,现在已经用去 xxxMB,还剩下 yyyMB 等。此外,

图形界面还给出相应的告警信息等,这些都是图形界面的优势所在。但是,图形

界面有时不会给出详细的信息,比如:USERS 表空间总 1000MB,现在已经使

用了 600MB,还剩下 400MB,这时,你在 USERS 表空间上创建一个表 my_tab1,

创建 my_tab1 表时使用 STORAGE ( initial 400MB,…)来该表预分配存储空间

400MB 就可能失败,你再改为 200MB 仍然失败。那么,你会感觉明明剩下 400MB

Page 2: A.oracle 数据字典与脚本初步

空间,你分配怎么还失败呢,问题就是出现在这个 OEM 上,OEM 只告诉你现

在剩下的总空间是多少,这些 400MB空间是由多个小的碎片块构成的。可能有

的是100MB连续块,有的只有2MB连续快。而( initial 400MB,…)要求的是400MB

的连续块,当然会分配失败了。那么,你会问,这 400MB 中,最大的那个连续

块是多大了。要得到这个结果,你查询数据字典就非常简单了,请看下面样例:

--9i/10g/11g 版本:

col “自由空间” for a14

col 最小字节 for 999,999,999

col 最大字节 for 999,999,999

col 平均字节 for 999,999,999

col 分布在 for 999,999,999

col 表空间类型 for a18

SELECT f.tablespace_name “表空间”,

Decode(d.EXTENT_MANAGEMENT,’DICTIONARY’,’字典’,’本地’) “表空间类型”,

TRUNC(SUM(f.bytes/1024000),2 ) || 'MB' “自由空间”,

MIN(f.bytes) “最小字节”, MAX(f.bytes) “最大字节”,

AVG(f.bytes) “平均字节”,COUNT(f.tablespace_name) “分布在”

FROM dba_free_space f, dba_tablespaces d

Where f.tablespace_name = d.tablespace_name

GROUP BY f.tablespace_name ,d.EXTENT_MANAGEMENT ;

表空间 表空间类型 自由空间 最小字节 最大字节 平均字节 分布在

------------------ ------------------ -------------- ------------ ------------ ------------ --------

RP_TAB0311 本地 64.44MB 65,994,752 65,994,752 65,994,752 1

RP_TAB0312 本地 64.44MB 65,994,752 65,994,752 65,994,752 1

RP_TAB0401 本地 64.44MB 65,994,752 65,994,752 65,994,752 1

RP_TAB0402 本地 64.44MB 65,994,752 65,994,752 65,994,752 1

SYSTEM 字典 332.59MB 340,574,208 340,574,208 340,574,208 1

TEMP 字典 524.28MB 655,360 472,637,440 5,422,856 99

TOOLS 字典 79.76MB 32,768 294,912 35,936 2,273

§1.3 数据字典与视图构成

Oracle 系统数据字典一般都以 DBA_xxx(如 DBA_TABLES)、ALL_xxx、

USER_xxx 来命名,以 DBA_开头的属于 DBA 使用的数据字典,DBA_开头的信

息包含了 ALL_和 USER_的数据字典。以 USER_开头数据字典只看到属于自己

的对象的信息。而 ALL_开头的数据字典包含主要属于自己的对象外,还包含其

他用户授予可访问的对象的信息。

除了数据字典外,Oracle 系统还包含众多的视图,视图一般以 V$xxx 和

X$xxx 命名,V$xxx 命名的视图有的专家称为动态性能视图,但是,我们建议称

为视图即可。这些以 V$xxx 命名的视图的内部数据多数动态变化,比如 V$session

Page 3: A.oracle 数据字典与脚本初步

记录目前连接到实例的会话的信息,假设现在有 10 个用户登录到 Oracle 11g 系

统,DBA 可从 V$SESSION 中看到这十个用户的相应信息,但这时有一个用户

退出 Oracle 系统,V$SESSION 视图立即只看到 9 个用户的信息。这就是所谓的

“动态视图”的原因。

提醒初学者:数据字典都以下减号(“_”)带有一个英语单词构成,比如表的信

息的数据字典是 DBA_TABLES、表的列的信息是 DBA_TAB_CLUMNS、索引

的数据字典是 DBA_INDEXES 等;而视图的命名与数据字典不同,后面的英语

单词都单数(不是复数),比如 V$SESSION 等。

§1.4 如何学习和记住数据字典

首先说明,本人不建议你专门像记英语单词那样去记 Oracle 系统数据字典,

而是看数据字典的构成是如何,这样,记住一般数据字典就很容易,即使你没有

完成记住,在使用时连蒙带猜也能应付,比如,你想查询你创建的视图都存储到

哪里去了,那你会想:你创建的表的信息在 USER_TABLEs数据字典里,那么

你的视图的代码也可能存储在 USER_VIEWs数据字典里。

§1.4.1 数据字典的根-DICT

所有 Oracle 系统各版本,数据字典和视图的相关信息都存储在 DICTionary

的数据字典里,而且每个新版本的新功能增加,新的数据字典和视图不断被加入

到 DICT 中,当然,Oracle 系统也相应地淘汰某些数据字典。下面是查询 DICT

了解数据基本信息的脚本:

--Oracle 11g 版本:

C:\Documents and Settings\zhao>cd\

C:\>sqlplus system/Zhaoyuan123

SQL*Plus: Release 11.2.0.1.0 Production on 星期四 6月 30 15:56:27 2011

Copyright (c) 1982, 2010, Oracle. All rights reserved.

连接到:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> desc dict

名称 是否为空? 类型

----------------------------------------- --------

----------------------------

TABLE_NAME VARCHAR2(30)

Page 4: A.oracle 数据字典与脚本初步

COMMENTS VARCHAR2(4000)

SQL> set line 200

SQL> col table_name for a28

SQL> col comments for a120

SQL> show user

USER 为 "SYSTEM"

SQL> select count(*) FROM DICT;

COUNT(*)

----------

2553

SQL> SELECT * FROM DICT WHERE table_name like 'DBA_%' and rownum<11;

TABLE_NAME COMMENTS

------------------------------------------------------------------------------------------------

DBA_2PC_NEIGHBORS information about incoming and outgoing connections for pending transactions

DBA_2PC_PENDING info about distributed transactions awaiting recovery

DBA_ADDM_FDG_BREAKDOWN

DBA_ADDM_FINDINGS

DBA_ADDM_INSTANCES

DBA_ADDM_SYSTEM_DIRECTIVES

DBA_ADDM_TASKS

DBA_ADDM_TASK_DIRECTIVES

DBA_ADVISOR_ACTIONS

DBA_ADVISOR_COMMANDS

已选择 10行。

SQL>

§1.4.2 积少成多方法记住一些必要的数据字典

Oracle 11g 系统的数据字典多达上千个,要全部记住也没有必要,再说,你

记住数据字典的名称,还是没有办法记住数据字典内的列的名称及其含义,所以,

我们并不建议要记住很多数据字典,而是将那些重要的、日常要用到的数据字典

记录在自己的秘笈里即可。这里所说的秘笈是你自己习惯的多个文件夹(目录结

构),比如:

Oracle 10g-常用数据字典与脚本

Oracle 11g-常用数据字典与脚本

Page 5: A.oracle 数据字典与脚本初步

此外,每个文件夹再分为对象管理、性能视图与数据字典、备份恢复有关

数据字典、等。

§1.4.3 “与时俱进” 跟踪新功能与数据字典

Oracle 系统每个版本都在增加新功能,这些新功能就带有内部的数据字典

和视图,比如:10g 版本新增加回收站和闪回功能,就增加了 DBA_RECYCLEBIN

数据字典和 V$FLASHBACK_DATABASE_STAT、

V$FLASHBACK_DATABASE_LOG 视图,再比如:11g 版本增加内存自动管理,

就增加了 V$MEMORY_TARGET_ADVICE 视图等。从这一点来看,我们只要抓

住”新功能必有新数据字典”这个关键点,记住新增加的数据字典和视图也不难。

§1.5 附录 1:常用数据字典(初学者)

下面是本人临时整理的一些基本的数据字典,有兴趣的读者可从网山搜索,

搜索的关键字为:

数据字典 说明

DBA_OBJECTS 各用户的对象的基本信息

DBA_tables 有关表基本信息的数据字典

DBA_TAB_columns 表的列信息的数据字典

DBA_tab_partitions 分区表的相关信息

DBA_part_key_columns 分区表的分区键的信息

DBA_TAB_SUBPARTITIONS 表的子分区信息

DBA_indexes 索引的基本信息

DBA_ind_columns 索引的列的详细信息

DBA_ind_partitions 分区索引的信息

DBA_DEPENDENCIES 表间依赖关系信息

DBA_CONSTRAINTS 表的约束信息(主、外键、check 等)

DBA_Views 视图有关的信息

DBA_SEQUENCES 序列有关的信息

DBA_SYNONYMS 同义词有关信息

DBA_users Oracle 系统用户有关信息

DBA_tab_privs 用户对表可访问的信息(对象权限信息)

DBA_sys_privs 授予系统权限的信息

DBA_role_privs 授予角色权限的信息

DBA_segments 有关段的信息(段=占用存储空间的对象,表索引都占用空间)

DBA_extents 段在空间扩展中的信息记录

Page 6: A.oracle 数据字典与脚本初步

DBA_tablespaces 表空间有关信息

dba_data_files 数据文件有关信息

dba_free_space 表空间中可用空间的信息

§1.6 附录 2:常用查询脚本(初学者)

下面例子是引导初学者如何查询数据的一些简单脚本,对于中级以上读者可参考网上

的其他文章:

--Oracle 11g 版本:

--查看自己有哪些对象:

Select object_name,object_type,status from user_objects

Order by object_type ;

--

--查询两个对象的依赖关系:

SELECT name, type, referenced_name, referenced_type

FROM user_dependencies

WHERE referenced_name IN ('EMPLOYEES','EMP_VW' );

--

--列出表的依赖关系:

select decode(referenced_type, 'NON-EXISTENT', '.....',

referenced_type) || ' ' || referenced_owner || '.' ||

referenced_name r_name,

' is referenced by: ' || type || ' ' || owner || '.'

||

name name, ' Referenced Link: ' ||

decode(referenced_link_name, null, 'none',

referenced_link_name) r_link

from sys.dba_dependencies

where owner not in ('SYS', 'SYSTEM')

order by 1,2;

--

--直接将系统权限授予用户和角色

select b.privilege what_granted,

b.admin_option, a.username

from sys.dba_users a, sys.dba_sys_privs b

where a.username = b.grantee

order by 1,2;

select privilege what_granted,

admin_option, grantee

from sys.dba_sys_privs

where not exists

Page 7: A.oracle 数据字典与脚本初步

(select 'x' from sys.dba_users

where username = grantee)

order by 1,2;

--

--查询扩展在 10次以上的段的信息:

select owner,

segment_name,

segment_type,

tablespace_name,

extents,

max_extents

from sys.dba_segments

where extents > 10

order by tablespace_name;

--

--查询无效对象的信息:

select owner, object_name, object_type,

created, last_ddl_time

from sys.dba_objects

where status = 'INVALID'

order by owner, object_type;

==============全文完================