这周和同事讨论技术问题时,他告诉我客户的一套11.1.0.6的数据库中某个本地管理表空间上存在大量的Extents Fragment区间碎片,这些连续的Extents没有正常合并为一个大的Extent,他怀疑这是由于11.1.0.6上的bug造成了LMT上存在大量碎片。 同事判断该表空间上有碎片的依据是从dba_free_space视图中查询到大量连续的Free Extents:

SQL> select tablespace_name,EXTENT_MANAGEMENT,ALLOCATION_TYPE from dba_tablespaces where tablespace_name='FRAGMENT';TABLESPACE_NAME                EXTENT_MAN ALLOCATIO
------------------------------ ---------- ---------
FRAGMENT                       LOCAL      SYSTEMSQL> select block_id,blocks from dba_free_space where tablespace_name='FRAGMENT' and rownum<10;
BLOCK_ID     BLOCKS
---------- ----------
40009     222136
25          8
9           8
17          8
33          8
41          8
49          8
57          8
65          8
..............SQL> select count(*),blocks from dba_free_space where tablespace_name='FRAGMENT' and blocks=8 group by blocks;COUNT(*)     BLOCKS
---------- ----------5000          8

以上可以看到FRAGMENT表空间使用autoallocate的Local Extent Management,的确存在大量的连续Extents没有合并。在DMT即字典管理表空间模式下需要SMON进程定期维护FET$基表将tablespace上的连续空闲Extents合并为更大的一个Extents。而在LMT模式下因为采用数据文件头上(datafile header 3-8 blocks in 10g)的位图管理区间,所以无需某个后台进程特意去合并区间。 为什么LMT下连续空闲Extents没有合并而造成碎片呢?因为这套库采用11gr1较不稳定的11.1.0.6版本,所以把问题归咎为某个bug似乎可以讲得通。一开始我较为认同同事的bug论,且和同事一起查询了Metalink上11gr1上一些已知的bug,但并没有发现症状匹配的bug note。 这让我反思这个问题,过早的将cause定位到bug过于主观了,并不是所有我们预期外的情况(unexpected)都属于bug。 实际上dba_free_space所显示的信息可能并不"真实",这种幻象往往由10g以后出现的flashback table特性引起:

SQL> select text from dba_views where view_name='DBA_FREE_SPACE';TEXT
--------------------------------------------------------------------------------
======DMT REAL FREE EXTENTS=============select ts.name, fi.file#, f.block#,f.length * ts.blocksize, f.length, f.file#
from sys.ts$ ts, sys.fet$ f, sys.file$ fi
where ts.ts# = f.ts#and f.ts# = fi.ts#and f.file# = fi.relfile#and ts.bitmapped = 0union all======LMT REAL FREE EXTENTS=============select /*+ ordered use_nl(f) use_nl(fi) */ts.name, fi.file#, f.ktfbfebno,f.ktfbfeblks * ts.blocksize, f.ktfbfeblks, f.ktfbfefno
from sys.ts$ ts, sys.x$ktfbfe f, sys.file$ fi
where ts.ts# = f.ktfbfetsnand f.ktfbfetsn = fi.ts#and f.ktfbfefno = fi.relfile#and ts.bitmapped <> 0 and ts.online$ in (1,4) and ts.contents$ = 0union all======LMT RECYCLEBIN FREE EXTENTS=============select /*+ ordered use_nl(u) use_nl(fi) */ts.name, fi.file#, u.ktfbuebno,u.ktfbueblks * ts.blocksize, u.ktfbueblks, u.ktfbuefno
from sys.recyclebin$ rb, sys.ts$ ts, sys.x$ktfbue u, sys.file$ fi
where ts.ts# = rb.ts#and rb.ts# = fi.ts#and u.ktfbuefno = fi.relfile#and u.ktfbuesegtsn = rb.ts#and u.ktfbuesegfno = rb.file#and u.ktfbuesegbno = rb.block#and ts.bitmapped <> 0 and ts.online$ in (1,4) and ts.contents$ = 0union all======DMT RECYCLEBIN FREE EXTENTS=============select ts.name, fi.file#, u.block#,u.length * ts.blocksize, u.length, u.file#
from sys.ts$ ts, sys.uet$ u, sys.file$ fi, sys.recyclebin$ rb
where ts.ts# = u.ts#and u.ts# = fi.ts#and u.segfile# = fi.relfile#and u.ts# = rb.ts#and u.segfile# = rb.file#and u.segblock# = rb.block#and ts.bitmapped = 0

以上我们通过解析10g中的dba_free_space视图可以了解到该视图所显示的Free Extents由以下四个部分组成:

  1. LMT表空间上真正空闲的Extents
  2. DMT表空间上真正空闲的Extents
  3. LMT表空间上被RECYCLEBIN中对象占用的Extents
  4. DMT表空间上被RECYCLEBIN中对象占用的Extents

而在10g以前的版本中因为没有recyclebin特性的"干扰",所以dba_free_space所显示的Free Extents由前2个部分组成,因此我们可以在10g中创建一个兼容视图以实现对真正空闲空间的查询:

create view dba_free_space_pre10g as
select ts.name TABLESPACE_NAME,fi.file# FILE_ID,f.block# BLOCK_ID,f.length * ts.blocksize BYTES,f.length BLOCKS,f.file# RELATIVE_FNOfrom sys.ts$ ts, sys.fet$ f, sys.file$ fiwhere ts.ts# = f.ts#and f.ts# = fi.ts#and f.file# = fi.relfile#and ts.bitmapped = 0
union all
select /*+ ordered use_nl(f) use_nl(fi) */ts.name TABLESPACE_NAME,fi.file# FILE_ID,f.ktfbfebno BLOCK_ID,f.ktfbfeblks * ts.blocksize BYTES,f.ktfbfeblks BLOCKS,f.ktfbfefno RELATIVE_FNOfrom sys.ts$ ts, sys.x$ktfbfe f, sys.file$ fiwhere ts.ts# = f.ktfbfetsnand f.ktfbfetsn = fi.ts#and f.ktfbfefno = fi.relfile#and ts.bitmapped <> 0and ts.online$ in (1, 4)and ts.contents$ = 0/create view dba_free_space_recyclebin as
select /*+ ordered use_nl(u) use_nl(fi) */ts.name TABLESPACE_NAME,fi.file# FILE_ID,u.ktfbuebno BLOCK_ID,u.ktfbueblks * ts.blocksize BYTES,u.ktfbueblks BLOCKS,u.ktfbuefno RELATIVE_FNOfrom sys.recyclebin$ rb, sys.ts$ ts, sys.x$ktfbue u, sys.file$ fiwhere ts.ts# = rb.ts#and rb.ts# = fi.ts#and u.ktfbuefno = fi.relfile#and u.ktfbuesegtsn = rb.ts#and u.ktfbuesegfno = rb.file#and u.ktfbuesegbno = rb.block#and ts.bitmapped <> 0and ts.online$ in (1, 4)and ts.contents$ = 0
union all
select ts.name TABLESPACE_NAME,fi.file# FILE_ID,u.block# BLOCK_ID,u.length * ts.blocksize BYTES,u.length BLOCKS,u.file# RELATIVE_FNOfrom sys.ts$ ts, sys.uet$ u, sys.file$ fi, sys.recyclebin$ rbwhere ts.ts# = u.ts#and u.ts# = fi.ts#and u.segfile# = fi.relfile#and u.ts# = rb.ts#and u.segfile# = rb.file#and u.segblock# = rb.block#and ts.bitmapped = 0
/

通过以上创建的dba_free_space_pre10g和dba_free_space_recyclebin视图,我们可以很明确地区分表空间上空闲Extents。 针对本例中的LMT上存在大量连续的空闲Extent碎片,可以直接从上述视图中得到答案:

SQL> select * from dba_free_space_pre10g where tablespace_name='FRAGMENT';TABLESPACE_NAME                   FILE_ID   BLOCK_ID      BYTES     BLOCKS RELATIVE_FNO
------------------------------ ---------- ---------- ---------- ---------- ------------
FRAGMENT                               13      40009 1819738112     222136           13SQL> select count(*),blocks from dba_free_space_recyclebin where tablespace_name='FRAGMENT' group by blocks;COUNT(*)     BLOCKS
---------- ----------5000          8显然是RECYCLEBIN中存在大量的小"对象"从而造成了LMT上出现大量碎片的假象SQL> select space,count(*) from dba_recyclebin where ts_name='FRAGMENT' group by space;SPACE   COUNT(*)
---------- ----------8       5000我们可以通过purge recyclebin来"合并"这些Extents碎片SQL> purge dba_recyclebin;DBA Recyclebin purged.SQL>  select count(*),blocks from dba_free_space where tablespace_name='FRAGMENT' group by blocks;COUNT(*)     BLOCKS
---------- ----------1     262136

如果应用程序创建大量的小型堆(heap)表来存放临时数据,在不再需要这些数据时将这些堆表drop掉,那么就可能造成上述LMT"碎片"问题。我们在实际处理10g以后的这类空间问题时一定搞清楚,哪些是真正的Free Extents,而哪些是来自RECYCLEBIN的Extents。 另一方面这个case还告诉我们不要一遇到预料外的行为方式(unexpected behavior)就将问题定位到bug,这样会过早僵化我们的诊断预期。为了尽可能地发散思维,我们有必要如围棋中所提倡的"保留变化"那样来安排诊断步骤。

本文转自maclean_007 51CTO博客,原文链接:http://blog.51cto.com/maclean/1277821

Too many fragmentation in LMT?相关推荐

  1. MySQL表碎片化(Table Fragmentation)以及处理

    关于MySQL中表碎片化(Table Fragmentation)产生的原因: 简单总结一下,MySQL Engine不同,碎片化的原因可能也有所差别.这里没有深入理解.分析这些差别.此文仅以Inno ...

  2. Oracle PCTfree assm,Oracle 12C LMT ASSM 完美测试

    本帖最后由 sunyunyi 于 2017-9-7 17:35 编辑 目前服务于电力行业,致力于帮助客户解决生产过程中出现的问题,提高生产效率, 爱好书法,周易!愿结交志同道合之士!共同进步! 微信号 ...

  3. Android肝帝战纪之Fragmentation的使用(单Activity+多Fragment设计)

    #单Activity+多Fragment设计(Fragmentation的使用)# 本文介绍使用Fragmentation库打造单Activity+多Fragment的App基础架构: Fragmen ...

  4. 本地管理表空间(LMT)与自动段空间管理(ASSM)概念(未看)

    本地管理表空间(LMT)与自动段空间管理(ASSM)概念 创建表空间时,extent management local 定义本地管理表空间(LMT),segment space management ...

  5. LMT and ASSM

    LMT的管理方式 LMT就是指Oracle不再利用数据字典表来记录Oracle表空间里面的区的使用状况,而是在每个表空间的数据文件的头部加入了一个位图区,在其中记录每个区的使用状况.每个表文件头会有6 ...

  6. Fragmentation 源码分析

    Fragmentation 源码分析 前言 前段时间突然发觉,Fragmentation 这个库我已经使用了这么久了,从 0.10.1 版本开始接触,用到现在已经 1.3.x 了.这是一段很长的时间, ...

  7. Oracle表空间的管理方式(LMT、DMT)--本地和字典管理

    Oracle表空间的管理方式(LMT.DMT)--本地和字典管理 字典管理:oracle 8i(不包括i),只存在一种表空间的管理模式,即字典管理表空间(DMT).DMT是指oracle的空间分配或回 ...

  8. PYTHON中的时区处理,LMT差6分钟的问题解决

    问题: 在python中,时间要做本地化,可以用pytz模块获取时区对象(datetime.timezone),如果用django的话,django.utils.timezone中的get_defau ...

  9. LMT LicManager大幅提升Solidworks许可效率成效分析

    前言: SolidWorks是达索系统(Dassault Systemes )下的子公司,专门负责研发与销售机械设计软件的视窗产品,公司总部位于美国马萨诸塞州. SolidWorks软件是世界上第一个 ...

最新文章

  1. DG环境数据库RMAN备份策略制定
  2. Matplotlib for Python Developers
  3. 将Java程序变成可执行文件的简单方法
  4. 清北学堂(2019 4 28 ) part 1
  5. Tinkpad W540 BIOS bug ,中招了,中了一次还送了一次
  6. nodejs mysql 注入_node.js sql 注入攻击防御方法 (sql Injection)
  7. spring的基本知识
  8. 16 | 二分查找(下):如何快速定位IP对应的省份地址?
  9. 51单片机实现简单计算器
  10. 进销存excel_不用再花钱买软件做进销存,这份免费的Excel系统送你,财务收
  11. Skyline软件二次开发初级——1如何在web页面中添加控件和加载三维地图数据
  12. VS2015安装(windows10+64)
  13. VisualBasic程序设计第二章的学习与自测
  14. Raft算法实现 - Sofa-JRaft,选主,数据写入,日志复制
  15. [语]Fans语录@Fans--第1篇--一枝独秀,不如花开两朵
  16. this hits shit!
  17. Android展示PDF文件(文字,签章,签名)
  18. 关于空心杯的SI2302驱动
  19. 树莓派/继电器DIY朴素的远程空调遥控器
  20. R语言入门教学(3)-不懂就问help()的使用及package的安装

热门文章

  1. Intellij IDEA调试功能使用总结
  2. Java并发编程(4):守护线程与线程阻塞的四种情况
  3. MIT自然语言处理第三讲:概率语言模型(第一、二、三部分)
  4. 高等数学:第六章 定积分的应用(2)平面曲线的弧长 做功 水压力 引力
  5. 分享一些优秀有趣的博客
  6. 特征提取方法 SIFT,PCA-SIFT,GLOH,SURF
  7. #65279导致页面顶部空白一行解决方法
  8. OpenStack(kilo版本)计算服务Nova的安装部署
  9. 【ElasticSearch系列】简单谈谈kibana-由安装marvel插件而来
  10. LeetCode26. Remove Duplicates from Sorted Array