Too many fragmentation in LMT?
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由以下四个部分组成:
- LMT表空间上真正空闲的Extents
- DMT表空间上真正空闲的Extents
- LMT表空间上被RECYCLEBIN中对象占用的Extents
- 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?相关推荐
- MySQL表碎片化(Table Fragmentation)以及处理
关于MySQL中表碎片化(Table Fragmentation)产生的原因: 简单总结一下,MySQL Engine不同,碎片化的原因可能也有所差别.这里没有深入理解.分析这些差别.此文仅以Inno ...
- Oracle PCTfree assm,Oracle 12C LMT ASSM 完美测试
本帖最后由 sunyunyi 于 2017-9-7 17:35 编辑 目前服务于电力行业,致力于帮助客户解决生产过程中出现的问题,提高生产效率, 爱好书法,周易!愿结交志同道合之士!共同进步! 微信号 ...
- Android肝帝战纪之Fragmentation的使用(单Activity+多Fragment设计)
#单Activity+多Fragment设计(Fragmentation的使用)# 本文介绍使用Fragmentation库打造单Activity+多Fragment的App基础架构: Fragmen ...
- 本地管理表空间(LMT)与自动段空间管理(ASSM)概念(未看)
本地管理表空间(LMT)与自动段空间管理(ASSM)概念 创建表空间时,extent management local 定义本地管理表空间(LMT),segment space management ...
- LMT and ASSM
LMT的管理方式 LMT就是指Oracle不再利用数据字典表来记录Oracle表空间里面的区的使用状况,而是在每个表空间的数据文件的头部加入了一个位图区,在其中记录每个区的使用状况.每个表文件头会有6 ...
- Fragmentation 源码分析
Fragmentation 源码分析 前言 前段时间突然发觉,Fragmentation 这个库我已经使用了这么久了,从 0.10.1 版本开始接触,用到现在已经 1.3.x 了.这是一段很长的时间, ...
- Oracle表空间的管理方式(LMT、DMT)--本地和字典管理
Oracle表空间的管理方式(LMT.DMT)--本地和字典管理 字典管理:oracle 8i(不包括i),只存在一种表空间的管理模式,即字典管理表空间(DMT).DMT是指oracle的空间分配或回 ...
- PYTHON中的时区处理,LMT差6分钟的问题解决
问题: 在python中,时间要做本地化,可以用pytz模块获取时区对象(datetime.timezone),如果用django的话,django.utils.timezone中的get_defau ...
- LMT LicManager大幅提升Solidworks许可效率成效分析
前言: SolidWorks是达索系统(Dassault Systemes )下的子公司,专门负责研发与销售机械设计软件的视窗产品,公司总部位于美国马萨诸塞州. SolidWorks软件是世界上第一个 ...
最新文章
- DG环境数据库RMAN备份策略制定
- Matplotlib for Python Developers
- 将Java程序变成可执行文件的简单方法
- 清北学堂(2019 4 28 ) part 1
- Tinkpad W540 BIOS bug ,中招了,中了一次还送了一次
- nodejs mysql 注入_node.js sql 注入攻击防御方法 (sql Injection)
- spring的基本知识
- 16 | 二分查找(下):如何快速定位IP对应的省份地址?
- 51单片机实现简单计算器
- 进销存excel_不用再花钱买软件做进销存,这份免费的Excel系统送你,财务收
- Skyline软件二次开发初级——1如何在web页面中添加控件和加载三维地图数据
- VS2015安装(windows10+64)
- VisualBasic程序设计第二章的学习与自测
- Raft算法实现 - Sofa-JRaft,选主,数据写入,日志复制
- [语]Fans语录@Fans--第1篇--一枝独秀,不如花开两朵
- this hits shit!
- Android展示PDF文件(文字,签章,签名)
- 关于空心杯的SI2302驱动
- 树莓派/继电器DIY朴素的远程空调遥控器
- R语言入门教学(3)-不懂就问help()的使用及package的安装
热门文章
- Intellij IDEA调试功能使用总结
- Java并发编程(4):守护线程与线程阻塞的四种情况
- MIT自然语言处理第三讲:概率语言模型(第一、二、三部分)
- 高等数学:第六章 定积分的应用(2)平面曲线的弧长 做功 水压力 引力
- 分享一些优秀有趣的博客
- 特征提取方法 SIFT,PCA-SIFT,GLOH,SURF
- #65279导致页面顶部空白一行解决方法
- OpenStack(kilo版本)计算服务Nova的安装部署
- 【ElasticSearch系列】简单谈谈kibana-由安装marvel插件而来
- LeetCode26. Remove Duplicates from Sorted Array