Upload
wasecurity
View
1.152
Download
5
Embed Size (px)
Citation preview
§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
空间,你分配怎么还失败呢,问题就是出现在这个 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
记录目前连接到实例的会话的信息,假设现在有 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)
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-常用数据字典与脚本
此外,每个文件夹再分为对象管理、性能视图与数据字典、备份恢复有关
数据字典、等。
§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 段在空间扩展中的信息记录
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
(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;
==============全文完================