深度解析dba_segments和sys.seg$中的细节差异(上)

今天在查看系统空间使用情况的时候,发现一个细节的问题,自己死磕了一把,还是发现了不少有价值的东西。
事情的起因是我在使用脚本在某个环境中查看每个用户所占有的空间的时候,如果发现有些临时用户占用的空间过大,就需要协调开发去做一些清理,但是这次用户占用的空间表空间使用情况有很大的差异。
查看用户占用空间的情况如下,可以看到总体用户占用的空间在2T多一些。
USERNAME                       Default TBS     TEMP TBS        CREATED      Size (Mb)
------------------------------ --------------- --------------- --------- ------------
PRDAPPO                        DATAS01         TEMP            12-JAN-13    2,531,124
SYS                            SYSTEM          TEMP            26-DEC-12       21,018
...
                                                                         ------------
sum                                                                         2,670,364

但是查看表空间的使用情况时,发现表空间的使用情况如下,总共占用了近6T的数据,使用了大概有5T的样子,那么5-2.6=2.4T,剩下的近2T的空间哪去了?怎么没有统计出来呢?
Tablespace           STA M A Init     Total MB    Free MB     Used MB  LrgstMB       MaxExt %Fr A
-------------------- --- - - ---- ------------ ---------- ----------- -------- ------------ --- -
                                  ------------ ---------- -----------
sum                                  6,188,911    928,277   5,260,634

带着这个疑问开始了详细的排查。
首先使用dba_segments查看了占用做多空间的用户。发现占用空间时4.7T左右。
SQL> select sum(bytes)/1024/1024 size_MB from dba_segments where owner='PRDAPPO';   
   SIZE_MB
----------
4745321.13

那使用shell脚本查看数据库用户占用情况时引用的数据库视图是哪个呢?
先贴出脚本的大体内容来。
select 
                USERNAME,
                DEFAULT_TABLESPACE,
                TEMPORARY_TABLESPACE,
                CREATED,
                nvl(sum(seg.blocks*ts.blocksize)/1024/1024,0) MB
from 
                sys.ts$ ts,
                sys.seg$ seg,
                sys.user$ us,
                dba_users du
where
                          us.name (+)= du.username
                and       seg.user# (+)= us.user# 
                and       ts.ts# (+)= seg.ts#
group by USERNAME,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE,CREATED
order by MB desc,username,created
标黄的部分就是计算占用空间大小的。可以看到直接是从sys.seg$里面去取的blocks
为了更加清晰的复现问题,我们再来试一遍。
首先查到username对应的user id作为seg$中使用。
select *from all_users  where username='PRDAPPO';
USERNAME                          USER_ID CREATED
------------------------------ ---------- ---------
PRDAPPO                                48 12-JAN-13

sys.seg$的表结构如下啊:
SQL> desc sys.seg$
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 FILE#                                     NOT NULL NUMBER
 BLOCK#                                    NOT NULL NUMBER
 TYPE#                                     NOT NULL NUMBER
 TS#                                       NOT NULL NUMBER
 BLOCKS                                    NOT NULL NUMBER
 EXTENTS                                   NOT NULL NUMBER
 INIEXTS                                   NOT NULL NUMBER
 MINEXTS                                   NOT NULL NUMBER
 MAXEXTS                                   NOT NULL NUMBER
 EXTSIZE                                   NOT NULL NUMBER
 EXTPCT                                    NOT NULL NUMBER
 USER#                                     NOT NULL NUMBER
 LISTS                                              NUMBER
 GROUPS                                             NUMBER
 BITMAPRANGES                              NOT NULL NUMBER
 CACHEHINT                                 NOT NULL NUMBER
 SCANHINT                                  NOT NULL NUMBER
 HWMINCR                                   NOT NULL NUMBER
 SPARE1                                             NUMBER
 SPARE2                                             NUMBER
 
SQL> select sum(blocks) from sys.seg$ where user#=48;
SUM(BLOCKS)
-----------
  323983920
可以看到通过sys.seg$去查找userid对应的空间占用情况,是2.53T。
SQL> select 323983920*1024*8/1024/1024 size_MB from dual;
   SIZE_MB
----------
2531124.38

这个情况和使用dba_segments相比直接少了2.2T左右,如果差得小,可能也还能解释得通,差得实在太多了。
sys.seg$算是这些数据字典表dba_segments的基表,里面的信息应该是很准备很完整。带着疑问我们来看看dba_segments的定义是什么样的。
一通调用分析,找到同义词,找到视图,最后找到定义的内容,dba_segments是基于sys_dba_segs这个视图是在sys下的。
> ksh showdict.sh dba_segments
object_details
OWNER                           OBJECT_ID DATA_OBJECT_ID OBJECT_NAME                    OBJECT_TYPE
------------------------------ ---------- -------------- ------------------------------ -------------------
SYS                                  4099                DBA_SEGMENTS                   VIEW
PUBLIC                               4100                DBA_SEGMENTS                   SYNONYM

synonym_details
OWNER                          SYNONYM_NAME
------------------------------ ------------------------------
PUBLIC                         DBA_SEGMENTS

view_details
VIEW_NAME                      TEXT
------------------------------ --------------------------------------------------------------------------------
DBA_SEGMENTS                   select owner, segment_name, partition_name, segment_type,
                                      segment_subtype, tablespace_name,
                                      header_file, header_block,
                                      decode(bitand(segment_flags, 131072), 131072, blocks,
                                          (decode(bitand(segment_flags,1),1,
                                           dbms_space_admin.segment_number_blocks(tablespace_id, relative_fno,
                                           header_block, segment_type_id, buffer_pool_id, segment_flags,
                                           segment_objd, blocks), blocks)))*blocksize,
                                      decode(bitand(segment_flags, 131072), 131072, blocks,
                                          (decode(bitand(segment_flags,1),1,
                                           dbms_space_admin.segment_number_blocks(tablespace_id, relative_fno,
                                           header_block, segment_type_id, buffer_pool_id, segment_flags,
                                           segment_objd, blocks), blocks))),
                                      decode(bitand(segment_flags, 131072), 131072, extents,
                                          (decode(bitand(segment_flags,1),1,
                                          dbms_space_admin.segment_number_extents(tablespace_id, relative_fno,
                                          header_block, segment_type_id, buffer_pool_id, segment_flags,
                                          segment_objd, extents) , extents))),
                                      initial_extent, next_extent, min_extents, max_extents, max_size,
                                      retention, minretention,
                                      pct_increase, freelists, freelist_groups, relative_fno,
                                      decode(buffer_pool_id, 1, 'KEEP', 2, 'RECYCLE', 'DEFAULT'),
                                      decode(flash_cache, 1, 'KEEP', 2, 'NONE', 'DEFAULT'),
                                      decode(cell_flash_cache, 1, 'KEEP', 2, 'NONE', 'DEFAULT')
                               from sys_dba_segs

直接看sys_dba_segs可能感觉还得不到任何信息,我们来看看sys_dba_segs更进一步的信息,可以看到啊还是基于sys.seg$,但是分成了3部分,最后做了union all
> ksh showdict.sh sys_dba_segs
object_details
OWNER                           OBJECT_ID DATA_OBJECT_ID OBJECT_NAME                    OBJECT_TYPE
------------------------------ ---------- -------------- ------------------------------ -------------------
SYS                                  4096                SYS_DBA_SEGS                   VIEW

synonym_details
no rows selected

view_details

VIEW_NAME                      TEXT
------------------------------ --------------------------------------------------------------------------------
SYS_DBA_SEGS                   select NVL(u.name, 'SYS'), o.name, o.subname,
                                      so.object_type, s.type#,
                                      decode(bitand(s.spare1, 2097408), 2097152, 'SECUREFILE', 256, 'ASSM', 'MSSM'),
                                      ts.ts#, ts.name, ts.blocksize,
                                      f.file#, s.block#,
                                      s.blocks * ts.blocksize, s.blocks, s.extents,
                                      s.iniexts * ts.blocksize,
                                      s.extsize * ts.blocksize,
                                      s.minexts, s.maxexts,
                                      decode(bitand(s.spare1, 4194304), 4194304, bitmapranges, NULL),
                                      to_char(decode(bitand(s.spare1, 2097152), 2097152,
                                             decode(s.lists, 0, 'NONE', 1, 'AUTO', 2, 'MIN', 3, 'MAX',
                                                    4, 'DEFAULT', 'INVALID'), NULL)),
                                      decode(bitand(s.spare1, 2097152), 2097152, s.groups, NULL),
                                      decode(bitand(ts.flags, 3), 1, to_number(NULL),
                                                                     s.extpct),
                                      decode(bitand(ts.flags, 32), 32, to_number(NULL),
                                             decode(s.lists, 0, 1, s.lists)),
                                      decode(bitand(ts.flags, 32), 32, to_number(NULL),
                                             decode(s.groups, 0, 1, s.groups)),
                                      s.file#, bitand(s.cachehint, 3), bitand(s.cachehint, 12)/4,
                                      bitand(s.cachehint, 48)/16, NVL(s.spare1,0), o.dataobj#
                               from sys.user$ u, sys.obj$ o, sys.ts$ ts, sys.sys_objects so, sys.seg$ s,
                                    sys.file$ f
                               where s.file# = so.header_file
                                 and s.block# = so.header_block
                                 and s.ts# = so.ts_number
                                 and s.ts# = ts.ts#
                                 and o.obj# = so.object_id
                                 and o.owner# = u.user# (+)
                                 and s.type# = so.segment_type_id
                                 and o.type# = so.object_type_id
                                 and s.ts# = f.ts#
                                 and s.file# = f.relfile#
                               union all
                               select NVL(u.name, 'SYS'), un.name, NULL,
                                      decode(s.type#, 1, 'ROLLBACK', 10, 'TYPE2 UNDO'), s.type#,
                                      NULL, ts.ts#, ts.name, ts.blocksize, f.file#, s.block#,
                                      s.blocks * ts.blocksize, s.blocks, s.extents,
                                      s.iniexts * ts.blocksize, s.extsize * ts.blocksize, s.minexts,
                                      s.maxexts,
                                      decode(bitand(s.spare1, 4194304), 4194304, bitmapranges, NULL),
                                      NULL, NULL, s.extpct,
                                      decode(bitand(ts.flags, 32), 32, to_number(NULL),
                                             decode(s.lists, 0, 1, s.lists)),
                                      decode(bitand(ts.flags, 32), 32, to_number(NULL),
                                             decode(s.groups, 0, 1, s.groups)),
                                      s.file#, bitand(s.cachehint, 3), bitand(s.cachehint, 12)/4,
                                      bitand(s.cachehint, 48)/16, NVL(s.spare1,0), un.us#
                               from sys.user$ u, sys.ts$ ts, sys.undo$ un, sys.seg$ s, sys.file$ f
                               where s.file# = un.file#
                                 and s.block# = un.block#
                                 and s.ts# = un.ts#
                                 and s.ts# = ts.ts#
                                 and s.user# = u.user# (+)
                                 and s.type# in (1, 10)
                                 and un.status$ != 1
                                 and un.ts# = f.ts#
                                 and un.file# = f.relfile#
                               union all
                               select NVL(u.name, 'SYS'), to_char(f.file#) || '.' || to_char(s.block#), NULL,
                                      decode(s.type#, 2, 'DEFERRED ROLLBACK', 3, 'TEMPORARY',
                                                     4, 'CACHE', 9, 'SPACE HEADER', 'UNDEFINED'), s.type#,
                                      NULL, ts.ts#, ts.name, ts.blocksize,
                                      f.file#, s.block#,
                                      s.blocks * ts.blocksize, s.blocks, s.extents,
                                      s.iniexts * ts.blocksize,
                                      s.extsize * ts.blocksize,
                                      s.minexts, s.maxexts,
                                      decode(bitand(s.spare1, 4194304), 4194304, bitmapranges, NULL),
                                      NULL, NULL, decode(bitand(ts.flags, 3), 1, to_number(NULL),
                                                                     s.extpct),
                                      decode(bitand(ts.flags, 32), 32, to_number(NULL),
                                             decode(s.lists, 0, 1, s.lists)),
                                      decode(bitand(ts.flags, 32), 32, to_number(NULL),
                                             decode(s.groups, 0, 1, s.groups)),
                                      s.file#, bitand(s.cachehint, 3), bitand(s.cachehint, 12)/4,
                                      bitand(s.cachehint, 48)/16, NVL(s.spare1,0), s.hwmincr
                               from sys.user$ u, sys.ts$ ts, sys.seg$ s, sys.file$ f
                               where s.ts# = ts.ts#
                                 and s.user# = u.user# (+)
                                 and s.type# not in (1, 5, 6, 8, 10)
                                 and s.ts# = f.ts#
                                 and s.file# = f.relfile#

问题到了这感觉应该有头绪了,但是其实问题的分析才刚刚开始,明天再更新下半段内容。

时间: 2024-09-22 08:58:12

深度解析dba_segments和sys.seg$中的细节差异(上)的相关文章

深度解析dba_segments和sys.seg$中的细节差异(下)

继续昨天的内容 http://blog.itpub.net/23718752/viewspace-1624762/ 我们已经根据dba_segments和sys.seg$的不同发现最后的差距有2T左右,已经定位到了dba_segments的一些细节信息,可以发现其实还是一个层级的调用关系. 我们把SYS_DBA_SEGS是一个处于中间层的角色,它的定义是3个union all,可以从定义中看到,差别主要还是segment_type的不同,我们采用逐个击破的方法,一个一个来看.-->第一个子查询

深度解析ASP.NET 2.0中的Callback机制

callback的一般使用方法还算简单,直接参照msdn的帮助和范例就足够了. 但是想要真正用好.用精,或者想开发一些基于callback机制的WEB组件,那么 ,就要先深入了解callback的实现机制了.在本文中,Teddy将和您一起解析 callback的整个调用.反馈机制,相信对于帮助您更好的使用callback,将能有 一定的益处. Callback vs Atlas 首先,谈谈Atlas.很多朋友可能会觉得奇怪,已经有了Callback,为什么又 要出Atlas呢?关于这个问题,At

深度解析光伏分发的系统中逆变器应用知识

输出电压的波形失真度:当光伏逆变器输出电压为正弦度时,应规定允许的最大波形失真度(或谐波含量).通常以输出电压的总波形失真度表示,其值不应超过5%(单相输出允许10%). 1.额定输出频率 光伏逆变器输出交流电压的频率应是一个相对稳定的值,通常为工频50Hz.正常工作条件下其偏差应在±1%以内. 2.负载功率因数 表征光伏逆变器带感性负载或容性负载的能力.在正弦波条件下,负载功率因数为0.7-0.9(滞后),额定值为0.9. 3.额定输出电流(或额定输出容量) 表示在规定的负载功率因数范围内逆变

深度解析javascript中的浅复制和深复制

     在谈javascript的浅复制和深复制之前,我们有必要在来讨论下js的数据类型.我们都知道有 Number,Boolean,String,Null,Undefined,Object五种类型.而Object又包含Function,Array 和Object自身.前面的五种类型叫做基本类型,而Object是引用类型.可能有人就要问,为什么要分基本类型和引用类型呢?后面你就会明白的.      我们首先来看看浅复制和深复制的简洁定义: 深复制:直接将数据复制给对应的变量 浅复制:将数据的地

Pedro Domingos深度解析机器学习五大流派中主算法精髓

本文联合编译:Blake, 高斐 Pedro Domingos是华盛顿大学计算机科学与工程学教授,也是国际机器学习协会的联合创始人之一.他曾在IST Lisbon获得电子工程和计算科学的硕士学位,在加州大学Irvine分校获得信息与计算科学博士学位.而后在IST作为助理教授工作了两年,于1999年加入华盛顿大学.他还是SIGKDD创新奖获得者(数据科学领域中最高奖项),也是AAAI Fellow之一.雷锋网(公众号:雷锋网)注:本文是Pedro Domingos在Google所作的机器学习演讲内

Docker 1.7.0 深度解析

6月16日,Docker 1.7.0 发布,重磅炸弹在Docker圈引起巨大轰动,同时也为6月22日在旧金山举办的DockerCon大会献礼. show_meitu_1.jpg 早在Docker 1.6.0之际,Docker官方的工程师即宣称:1.7.0版本将会带来很大的变化,包括:Docker的bug修改以及功能添加:并且还体现在Docker的架构上,如网络模块等. 话不多说,赶紧让我们进入Docker 1.7.0的深度解析.从Docker的版本变更日志来看,Docker 1.7.0在四个方面

深度解析如何做好页面SEO优化

页面seo优化在站内优化中占了很大一部分.那么如果做好页面优化呢?页面优化具体包括哪些细节部分优化呢?今天天津seo研究中心的tjseoer老师为大家做深度解析. 一.页面优化首先是标题title 标签 1.标题要紧扣文章中心内容,且标题的唯一独特性,目的可以让浏览者一看标题就知道内容是关于什么的,也是对搜索引擎的友好; 2.为标题加H1标签,同时标题出现的位置出现在<head>之后最好,为了搜索引擎最快找到标题. 3.标题字数控制在32字以内,多了在搜索结果里也无法显示.以及关键词出现的位置

深度解析Java 8:JDK1.8 AbstractQueuedSynchronizer的实现分析

前言 Java中的FutureTask作为可异步执行任务并可获取执行结果而被大家所熟知.通常可以使用future.get()来获取线程的执行结果,在线程执行结束之前,get方法会一直阻塞状态,直到call()返回,其优点是使用线程异步执行任务的情况下还可以获取到线程的执行结果,但是FutureTask的以上功能却是依靠通过一个叫AbstractQueuedSynchronizer的类来实现,至少在JDK 1.5.JDK1.6版本是这样的(从1.7开始FutureTask已经被其作者Doug Le

弹性计算峰会及神龙云服务器深度解析回顾

10月13日上午,云栖大会弹性计算全新企业线峰会主要内容有对弹性计算做了全面的精彩总结和产品细节分享,议程里发布了这个时代的新物种"神龙云服务器",当日在阿里云官网首屏神龙云服务器也同步发布上线,峰会现场研发总监张献涛对神龙云服务器做了深度解析,并在圆桌讨论环节为观众做了解答. 蒋林泉认为:"阿里云ECS是全世界最快的云主机." ECS超级稳定 背后的秘密是强健的IDC基础设施+飞天大规模智能运维能力:飞天自研领先核心虚拟化技术+业界最新的硬件架构,其中计算虚拟化核