数据字典和动态性能视图
数据字典记载了数据库的系统信息,它是只读表和视图的易做图。数据字典包含数据字典基表和数据字典视图两部分,其中,基表存储数据库的基本信息,普通用户不能之间访问数据字典基表;数据字典视图是基于数据字典基表建立的视图,普通用户可以通过查询数据字典视图取得系统信息。数据字典视图主要包括USER_XXX,ALL_XXX,DBA_XXX三种类型。
常用数据字典
DICT用于显示当前用户可访问的所有数据字典视图,并给出了这些数据字典视图的作用。
DICT_COLUMNS用于显示数据字典视图的每个列的作用。
DUAL用于取得函数的返回值。
GLOBAL_NAME用于显示当前数据库的全名。
IND用于显示当前用户所拥有的所有索引和索引的统计信息。
OBJ用于显示当前用户所拥有的所有对象。
SEQ用于显示当前用户所拥有的所有序列。
SYN用于显示当前用户所拥有的同义词和同义词所对应的数据库对象名。
TAB用于显示当前用户所用于的表,视图和序列。
动态性能视图用于记录当前例程的活动信息。启动例程时,oracle会自动建立动态性能视图;停止例程时,oracle会自动删除动态性能视图。需要注意的时,数据字典的信息时从数据文件中取得,而动态性能视图时从SGA和控制文件中取得。通过查询动态性能视图,一方面可以获得性能数据,另一方面可以取得与磁盘和内存结构相关的其他信息。所有的动态性能视图都是以V_$开始的,oracle为每个动态性能视图提供了相应的同义词(以V$开始)
V$FIXED_TABLE用于列出所有可用的动态性能视图和动态性能表。
V$INSTANCE用于获取当前例程的详细信息。
V$SGA用于取得SGA更详细的信息。
V$PARAMETER用于取得初始化参数的详细信息。
V$VERSION用于取得oracle版本的详细信息。
V$OPTION 用于显示已经安装的oracle选项。其中,TRUE表示该选项已经安装,FALSE表示该选项没有安装。
V$SESSION 用于显示会话的详细信息。
V$PROCESS 用于显示与oracle相关的所有进程的信息(包括后台进程和服务器进程)。
V$BGPROCESS 用于显示后台进程的详细信息。
V$DATABASE 用于取得当前数据库的详细信息(如数据库名,日志模式以及建立时间)。
V$CONTROLFILE 用于取得当前数据库所有控制文件的信息。
V$DATAFILE 用于取得当前数据库所有数据文件的详细信息。
V$DBFILE 用于取得数据文件编号及名称。
V$LOGFILE 用于显示重做日志成员的信息。
V$LOG 用于显示日志组的详细信息。
V$THREAD 用于取得重做线程的详细信息。
V$LOCK 用于显示锁信息。
V$LOCKED_OBJECT 用于显示被加锁的数据库对象。
V$ROLLNAME和V$ROLLSTAT
V$ROLLNAME动态性能视图用于显示处于online状态的undo段,而V$ROLLSTAT用于显示undo段统计信息。通过在二者之间执行连接查询,可以显示undo段的详细统计信息。
V$TABLESPACE 用于显示表空间的信息。
V$TEMPFILE用于显示当前数据库所包含的临时文件。
2.
常用DBA管理脚本
一、数据库构架体系
1、表空间的监控是一个重要的任务,我们必须时刻关心表空间的设置,是否满足现在应用的需求,以下的语句可以查询到表空间的详细信息
SELECT TABLESPACE_NAME,INITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,
MAX_EXTENTS,PCT_INCREASE,MIN_EXTLEN,STATUS,
CONTENTS,LOGGING,
EXTENT_MANAGEMENT, -- Columns not available in v8.0.x
ALLOCATION_TYPE, -- Remove these columns if running
PLUGGED_IN, -- against a v8.0.x database
SEGMENT_SPACE_MANAGEMENT --use only in v9.2.x or later
FROM DBA_TABLESPACES
ORDER BY TABLESPACE_NAME;
2、对于某些数据文件没有设置为自动扩展的表空间来说,如果表空间满了,就将意味着数据库可能会因为没有空间而停止下来。监控表空间,最主要的就是监控剩余空间的大小或者是使用率。以下是监控表空间使用率与剩余空间大小的语句
SELECT D.TABLESPACE_NAME,SPACE "SUM_SPACE(M)",BLOCKS SUM_BLOCKS,SPACE-NVL(FREE_SPACE,0) "USED_SPACE(M)",
ROUND((1-NVL(FREE_SPACE,0)/SPACE)*100,2) "USED_RATE(%)",FREE_SPACE "FREE_SPACE(M)"
FROM
(SELECT TABLESPACE_NAME,ROUND(SUM(BYTES)/(1024*1024),2) SPACE,SUM(BLOCKS) BLOCKS
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME) D,
(SELECT TABLESPACE_NAME,ROUND(SUM(BYTES)/(1024*1024),2) FREE_SPACE
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+)
UNION ALL --if have tempfile
SELECT D.TABLESPACE_NAME,SPACE "SUM_SPACE(M)",BLOCKS SUM_BLOCKS,
USED_SPACE "USED_SPACE(M)",ROUND(NVL(USED_SPACE,0)/SPACE*100,2) "USED_RATE(%)",
NVL(FREE_SPACE,0) "FREE_SPACE(M)"
FROM
(SELECT TABLESPACE_NAME,ROUND(SUM(BYTES)/(1024*1024),2) SPACE,SUM(BLOCKS) BLOCKS
FROM DBA_TEMP_FILES
GROUP BY TABLESPACE_NAME) D,
(SELECT TABLESPACE_NAME,ROUND(SUM(BYTES_USED)/(1024*1024),2) USED_SPACE,
ROUND(SUM(BYTES_FREE)/(1024*1024),2) FREE_SPACE
FROM V$TEMP_SPACE_HEADER
GROUP BY TABLESPACE_NAME) F
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+)
3、除了监控表空间的剩余空间,有时候我们也有必要了解一下该表空间是否具有自动扩展空间的能力,虽然我们建议在生产系统中预先分配空间。以下语句将完成这一功能
SELECT T.TABLESPACE_NAME,D.FILE_NAME,
D.AUTOEXTENSIBLE,D.BYTES,D.MAXBYTES,D.STATUS
FROM DBA_TABLESPACES T,
DBA_DATA_FILES D
WHERE T. TABLESPACE_NAME =D. TABLESPACE_NAME
ORDER BY TABLESPACE_NAME,FILE_NAME
4、我相信使用字典管理的表空间的也不少吧,因为字典管理的表空间中,每个表的下一个区间的大小是不可以预料的,所以我们必须监控那些表在字典管理的表空间中的下一个区间的分配将会引起性能问题或由于是非扩展的表空间而导致系统停止。以下语句检查那些表的扩展将引起表空间的扩展。
SELECT A.OWNER,A.TABLE_NAME,A.NEXT_EXTENT,A.TABLESPACE_NAME
FROM ALL_TABLES A,
(SELECT TABLESPACE_NAME, MAX(BYTES) BIG_CHUNK
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F
WHERE F.TABLESPACE_NAME = A.TABLESPACE_NAME
AND A.NEXT_EXTENT > F.BIG_CHUNK
5、段的占用空间与区间数也是很需要注意的一个问题,如果一个段的占用空间太大,或者跨越太多的区间(在字典管理的表空间中,将有严重的性能影响),如果段没有可以再分配的区间,将导致数据库错误。所以,段的大小与区间监控也是一个很重要的工作
SELECT S.OWNER,S.SEGMENT_NAME,S.SEGMENT_TYPE,S.PARTITION_NAME,
ROUND(BYTES/(1024*1024),2) "USED_SPACE(M)",
EXTENTS USED_EXTENTS,S.MAX_EXTENTS,S.BLOCKS ALLOCATED_BLOCKS,
S.BLOCKS USED_BOLCKS,S.PCT_INCREASE,S.NEXT_EXTENT/1024 "NEXT_EXTENT(K)"
FROM DBA_SEGMENTS S
WHERE S.OWNER NOT IN ('SYS','SYSTEM')
ORDER BY Used_Extents DESC
6、对象的空间分配与空间利用情况,除了从各个方面的分析,如分析表,查询rowid等方法外,其实oracle提供了一个查询空间的包dbms_space,如果我们稍封装一下,将是非常好用的一个东西。
CREATE OR REPLACE PROCEDURE show_space
(p_segname in varchar2,
p_type in varchar2 default 'TABLE' ,&