DB2 V9.7新特性 - 降低高水位标记(转:http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-1007kongzh/)
2010-07-22 11:20
821 查看
DB2 V9.7新特性 - 降低高水位标记
孔再华, 软件工程师, IBM孔再华,IBM SAP Integration and Support Center 的成员。目前的工作包括利用 DB2 for Linux, UNIX, and Windows 的每个新版本测试和认证 SAP R/3,以及帮助客户在 DB2 环境中运行 SAP,帮助他们分析问题和进行故障检修。
简介: DB2 9.7 增加了很多新功能帮助用户更容易地管理数据库。在 9.7 之前的版本中,降低表空间高水位标记是一件比较麻烦的事情,需要使用多个命令。在 DB2 9.7 中提供了简单的降低高水位标记的功能,让数据库管理员的工作变得简单。高水位标记是表空间中的最高已分配页,处于高水位标记下的空闲页是不能被其他应用使用的。降低高水位有助于提高表空间的利用,提高数据库性能。
发布日期: 2010 年 7 月 12 日
级别: 初级
建议: 0 (添加评论)
![](http://www.ibm.com/developerworks/js/artrating/star-off.gif)
![](http://www.ibm.com/developerworks/js/artrating/star-off.gif)
![](http://www.ibm.com/developerworks/js/artrating/star-off.gif)
![](http://www.ibm.com/developerworks/js/artrating/star-off.gif)
![](http://www.ibm.com/developerworks/js/artrating/star-off.gif)
平均分 (共 0 个评分 )
表空间高水位标记(HWM)
高水位标记是一个应用广泛的术语,在很多的场合都会使用到,一般用以标记某一项指标的最高数值。DB2 中表空间高水位标记(HWM)是数据库管理存储器(DMS)表空间的特殊属性。表空间高水位标记是表空间中分配的最后一个扩展数据块之后的扩展数据块中第一页的页号。简单来说就是反映了表空间分配的最大空间。
图 1. 表空间 HWM
![](http://writeblog.csdn.net/image003.jpg)
如图 1 显示的表空间一共分配了 14 个扩展数据块,表空间内存储了两个对象,对象 1 占用了扩展数据块 3 到 8,对象 2 占用了扩展数据块 9 到 14。扩展数据块 14 是分配的最后一个扩展数据块,所以表空间高水位标记指向的就是其后第 15 个数据块的第一个页。因为扩展数据块的索引是从 0 开始的,如果从起始数据块 0 到最后分配的数据块 14 中包含的所有页的数量是 60 个页,也就是从 0 到 59 页,那么数据块 14 中最后一个页面是 59,下一个页,也就是第 15 个数据块的第一个页的标号是 60. 那么,表空间高水位标记就是 60. 这与已经分配的数据块包含的数据页数目是相同的。这也正说明表空间高水位标记反映了表空间分配的最大空间。
回页首
为什么要降低高水位标记
在图 1 所示的案例中,表空间高水位标记下没有空闲的扩展数据块。高水位标记标识的表空间分配的最多数据页也反映了对象实际使用的数据页。但是如果对象 1 被删除,那么所占据的扩展数据块 3 到 8 就会成为空闲数据块。这段空闲数据块是已经分配给表空间的,并且处于表空间高水位标记之下,只能被当前表空间本身使用,这段存储空间是没有释放的。
图 2. 对象被删除
![](http://writeblog.csdn.net/image005.jpg)
如图 2 所示,对象 1 被删除后,原先所占的扩展数据块成为空闲数据块,表空间中实际使用数据块是 0 到 2,9 到 14。真实使用到的数据页是小于高水位标记反映的分配空间的。为了能够使表空间高水位标记下的空闲数据块能被其他需求使用,必须降低高水位标记,减少表空间分配的大小,空间才能被释放出来。
图 3. 降低高水位标记
![](http://writeblog.csdn.net/image007.jpg)
如图 3 所示,降低高水位标记的工作就像仓库的搬运工一样,把对象 2 从扩展数据块 9 到 14,搬到新的空闲数据块 3 到 8 中,释放高位的数据块,然后再把高水位标记降低。可以看到最后的结果是表空间分配的存储空间减少了,而释放出来的存储空间也可以用于其他存储需求。图 3 显示了降低高水位标记的过程和原理。DB2 中降低高水位标记需要操作的步骤或许不一样,但原理是一样的。
回页首
在 9.7 以前如何降低高水位标记
在 DB2 9.7 之前的版本中,降低表空间高水位标记需要很多的步骤,比较繁琐,需要综合使用 DB2 不同的工具才能达到目的。下面略微详细介绍下不使用 DB2 9.7 中的新功能,如何降低表空间高水位标记。
查看表空间信息
如何才能知道哪一个表空间中的高水位标记可以降低,需要检索表空间信息。选择其中高水位标记大于已使用空间的表空间,说明高水位标记下面有空闲的空间。
清单 1. 表空间信息
# db2 LIST TABLESPACES SHOW DETAIL Tablespaces for Current Database ----------------- 略 ------------------- Tablespace ID = 6 Name = LR1#DDICD Type = Database managed space Contents = All permanent data. Large table space. State = 0x0000 Detailed explanation: Normal Total pages = 260096 Useable pages = 260088 Used pages = 257994 Free pages = 2094 High water mark (pages) = 259086 Page size (bytes) = 16384 Extent size (pages) = 2 Prefetch size (pages) = 8 Number of containers = 4 Minimum recovery time = 2009-10-10-05.28.11.000000 ----------------- 略 ------------------- |
查看高水位标记信息
通过比较表空间的信息,能够筛选出可以降低高水位标记的表空间。但是对于不同的情况,这些表空间的高水位标记不一定都能被降低,还需要查看高水位标记的详细信息。这就要使用到 db2dart 工具。
清单 2. 高水位标记信息
# db2dart lde /DHWM /TSI 24 The requested DB2DART processing has completed successfully! Complete DB2DART report found in: /db2/LDE/db2dump/DART0000/LDE.RPT # cat /db2/LDE/db2dump/DART0000/LDE.RPT ----------------- 略 ------------------- Highwater Mark: 544 pages, 272 extents (extents #0 - 271) [0000] 65534 0x0e [0001] 65534 0x0e [0002] 65535 0x00 [0003] 65535 0x00 [0004] 65535 0x00 [0005] 65535 0x00 [0006] 65535 0x00 [0007] 65535 0x00 ----------------- 略 ------------------- [0260] 5 0x40* [0261] 5 0x00* [0262] 6 0x40* [0263] 6 0x00* [0264] 7 0x40* [0265] 7 0x00* [0266] == EMPTY == [0267] == EMPTY == [0268] 9 0x40* [0269] 9 0x00* [0270] 10 0x40* [0271] 10 0x00* Dump highwater mark processing - phase start. Number of free extents below highwater mark: 2 Number of used extents below highwater mark: 270 Object holding highwater mark: Object ID: 10 Type: Table Data Extent Note: Extent contains page #0 for object. Dump highwater mark processing - phase end. ----------------- 略 ------------------- |
获得降低高水位标记建议
清单 3. 降低高水位标记建议
# db2dart lde /LHWM /TSI 24 /NP 0 The requested DB2DART processing has completed successfully! Complete DB2DART report found in: /db2/LDE/db2dump/DART0000/LDE.RPT # cat /db2/LDE/db2dump/DART0000/LDE.RPT ----------------- 略 ------------------- Lower highwater mark processing - phase start. Current highwater mark: 271 Desired highwater mark: 0 Number of used extents in tablespace: 270 Number of free extents below original HWM: 2 Number of free extents below desired HWM: 0 Number of free extents below current HWM: 2 Step #1: Object ID = 10 => Offline REORG of this table using the LONGLOBDATA option (do not specify a temporary tablespace). Table: SAPLDE.RSBERRORCHANGED DAT object size: 2 INX object size: 0 XDA object size: 0 LF object size: 0 LOB object size: 0 LOBA object size: 0 BMP object size: 0 Total size of object parts: 2 Minimum number of extents that will move by this operation: 2 Current highwater mark: 269 Desired highwater mark: 0 Number of used extents in tablespace: 270 Number of free extents below original HWM: 2 Number of free extents below desired HWM: 0 Number of free extents below current HWM: 0 Final highwater mark: Extent #269 (270 extents, 540 pages). ** This cannot be lowered further as there are not enough free extents to move the object holding the highwater mark. Lower highwater mark processing - phase end. Highwater mark processing - phase end. ----------------- 略 ------------------- |
在清单 3 这个案例中表重组的过程还算是比较简单,只有一张需要重组的表。对于不同的表空间,db2dart 建议给出的降低高水位标记的步骤也会不同,用户按照建议完成即可。
回页首
9.7 降低高水位标记的新功能
相对于 9.7 之前降低高水位标记的步骤,9.7 中提供了更简单易用的降低高水位标记功能。只需要使用“db2 ALTER TABLESPACE“命令就可以达到效果。同时 DB2 还提供了两个表函数 MON_GET_TABLESPACE 和 MON_GET_EXTENT_MOVEMENT_STATUS 来获取和监控表空间以及数据块移动信息。下面通过一个案例来一步步熟悉这些新功能的使用方法。
获取表空间信息
使用“db2 LIST TABLESPACES SHOW DETAIL”命令获取表空间信息的用法之前已经阐述过,这里主要演示如何使用表函数 MON_GET_TABLESPACE。
清单 4. MON_GET_TABLESPACE 语法
>>-MON_GET_TABLESPACE--(--tbsp_name--,--member--)-------------->< |
图 4. MON_GET_TABLESPACE 输出列表
![](http://writeblog.csdn.net/image009.jpg)
通过查询图 4 中所示的列,用户可以获得与高水位标记相关的基本信息。其中的有些内容与“db2 LIST TABLESPACES SHOW DETAIL”命令得到的信息是相同的。其中 TBSP_STATE 表空间状态可以反映表空间是否在移动中。
清单 5. 获取表空间信息
# db2 "SELECT varchar(tbsp_name, 16) as tbsp_name, RECLAIMABLE_SPACE_ENABLED,TBSP_USED_PAGES, TBSP_FREE_PAGES, TBSP_PAGE_TOP from TABLE (MON_GET_TABLESPACE('',-2)) AS t where t.TBSP_PAGE_TOP > t.TBSP_USED_PAGES" TBSP_NAME RECLAIMABLE_SPACE_ENABLED TBSP_USED_PAGES TBSP_FREE_PAGES TBSP_PAGE_TOP ------------ ------------------------- --------------- ---------------- ------------- SYSCATSPACE 0 241002 60046 300912 TBS1 1 2844 1436 6746 LR1#DDICD 0 258000 2088 259086 LR1#BTABD 0 526510 1866 526694 LR1#FACTI 0 80998 21394 81096 |
本次案例对象是采用了自动存储的表空间 TBS1,它的 RECLAIMABLE_SPACE_ENABLED 属性是 1,说明空间可以被回收。
降低高水位标记
在 DB2 97 中,回收表空间存储器只需要使用到“ALTER TABLESPACE”命令。首先了解“ALTER TABLESPACE”的相关语法:
清单 6. ALTER TABLESPACE 语法
>>-ALTER TABLESPACE--tablespace-name----------------------------> >----+-REDUCE--+-------------------------------+--+-----------------------------+-+ | +-| database-container-clause |-+ '-| on-db-partitions-clause |-' | | +-| all-containers-clause |-----+ | | +-MAX---------------------------+ | | +-STOP--------------------------+ | | '-integer--+---------+----------' | | +-K-------+ | | +-M-------+ | | +-G-------+ | | '-PERCENT-' | +-LOWER HIGH WATER MARK--+------+--------------------------------------------+ | '-STOP-' | '----------------------------------------------------------------------------' |
清单 7. 自动存储表空间
ALTER TABLESPACE REDUCE 10 M |
ALTER TABLESPACE LOWER HIGH WATER MARK ALTER TABLESPACE REDUCE (ALL CONTAINERS 10 M) |
清单 9. 释放案例表空间 TBS1
# db2 ALTER TABLESPACE TBS1 REDUCE MAX DB20000I The SQL command completed successfully. |
监控数据块的移动,一种方法是通过“db2 get snapshot for tablespaces” 命令,查看表空间的状态。例如“Tablespace State = 0x'00080000'”表明表空间正在移动中。另一种方法是使用 DB2 97 中新的表函数 MON_GET_EXTENT_MOVEMENT_STATUS 获得表空间数据块移动的详细信息。
清单 10. MON_GET_EXTENT_MOVEMENT_STATUS 语法
>>- MON_GET_EXTENT_MOVEMENT_STATUS--(--tbsp_name--,--member--)-------------->< |
图 5. MON_GET_EXTENT_MOVEMENT_STATUS 输出列表
![](http://writeblog.csdn.net/image011.jpg)
清单 11. 监视表空间 TBS1 移动
# db2 "SELECT varchar(tbsp_name, 20) as tbsp_name, NUM_EXTENTS_MOVED, NUM_EXTENTS_LEFT, TOTAL_MOVE_TIME from TABLE(MON_GET_EXTENT_MOVEMENT_STATUS('TBS1',-2)) AS t". TBSP_NAME NUM_EXTENTS_MOVED NUM_EXTENTS_LEFT TOTAL_MOVE_TIME -------------------- ----------------- ---------------- -------------------- TBS1 100 1744 1664 |
验证表空间信息
同样是通过表函数 MON_GET_TABLESPACE 来验证最后的结果。
清单 12. 验证高水位标记的降低
# db2 "SELECT varchar(tbsp_name, 16) as tbsp_name, BSP_USED_PAGES, TBSP_FREE_PAGES,TBSP_PAGE_TOP from TABLE (MON_GET_TABLESPACE('TBS1',-2)) AS t" TBSP_NAME TBSP_USED_PAGES TBSP_FREE_PAGES TBSP_PAGE_TOP ---------------- -------------------- -------------------- -------------------- TBS1 2844 4 2844 |
除了通过各种工具获取表空间状态信息来监控和验证降低数据块移动的结果外,DB2 在日志信息中也记载了数据块移动的全部过程。
清单 13. db2diag 信息
2009-10-16-01.17.57.654319-240 E1500574A476 LEVEL: Info PID : 2627 TID : 26627 PROC : db2sysc 0 INSTANCE: db2lr1 NODE : 000 DB : LR1 APPHDL : 0-43019 APPID: *LOCAL.DB2.091016051758 AUTHID : DB2LR1 EDUID : 26627 EDUNAME: db2agent (LR1) 0 FUNCTION: DB2 UDB, buffer pool services, sqlbExtentMovementEntryPoint, probe:4838 DATA #1 : <preformatted> Extent Movement started on table space 1 2009-10-16-01.19.12.077966-240 E1501051A559 LEVEL: Info PID : 2627 TID : 26627 PROC : db2sysc 0 INSTANCE: db2lr1 NODE : 000 DB : LR1 APPHDL : 0-43019 APPID: *LOCAL.DB2.091016051758 AUTHID : DB2LR1 EDUID : 26627 EDUNAME: db2agent (LR1) 0 FUNCTION: DB2 UDB, buffer pool services, sqlbLockAndMoveExtents, probe:4072 DATA #1 : String, 126 bytes The extent movement operation has moved all extents it could. There are no more free extents lower in the tablespace. Exiting. 2009-10-16-01.19.12.101086-240 E1501611A515 LEVEL: Info PID : 2627 TID : 26627 PROC : db2sysc 0 INSTANCE: db2lr1 NODE : 000 DB : LR1 APPHDL : 0-43019 APPID: *LOCAL.DB2.091016051758 AUTHID : DB2LR1 EDUID : 26627 EDUNAME: db2agent (LR1) 0 FUNCTION: DB2 UDB, buffer pool services, sqlbLockAndMoveExtents, probe:4384 MESSAGE : ADM6008I Extents within table space "TBS1" (ID "1") have been moved. Reason code = "0" |
回页首
总结
本文主要介绍了 DB2 中降低表空间高水位标记,释放空闲空间的原理和方式。DB2 9.7 之前的用户可以参照第一种方式监控和降低高水位标记。而 DB2 9.7 用户可以采用新的降低高水位标记功能更快更简单的实现释放表空间。希望文章能够帮助用户更好的理解 DB2 表空间的存储概念,从而更有效地管理存储空间,节省运营成本。有关表空间管理的其他技术内容,可以参考 developerworks 上的文章,或者搜索 IBM DB2 9.7 Information Center for Linux, UNIX and Windows获得更多相关信息。
参考资料
学习
通过 developerWorks Information Management 专区 学习关于 Information Management 的更多知识。在这里可以找到技术文档、how-to 文章、培训、下载、产品信息等等。
通过 Information Management 专区 DB2 9 技术资源中心 了解 DB2 产品家族的更多产品信息和相关技术。
通过 DB2 V9.7 信息中心,了解 DB2 的详细产品信息和相关技术等全面的内容。
随时关注 developerWorks 技术活动 和 网络广播。
获得产品和技术
使用可直接从 developerWorks 下载的 IBM 产品评估试用软件 构建您的下一个开发项目。
现在可以免费使用 DB2。下载 DB2 Express-C,这是为社区提供的 DB2 Express Edition 的免费版本,它提供了与 DB2 Express Edition 相同的核心数据特性,为构建和部署应用程序奠定了坚实的基础。
讨论
参与 developerWorks blogs 并加入 My developerWorks 中文社区。
关于作者
孔再华,IBM SAP Integration and Support Center 的成员。目前的工作包括利用 DB2 for Linux, UNIX, and Windows 的每个新版本测试和认证 SAP R/3,以及帮助客户在 DB2 环境中运行 SAP,帮助他们分析问题和进行故障检修
相关文章推荐
- DB2 Express-C 9.7.2 新增特性(转:http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-1006db2expressc972/?S_CMP=d
- http://www-900.ibm.com/developerWorks/cn/dmdd/library/techarticles/dm-0408bader/index.shtml
- Java 处理 XML 的三种主流技术及介绍——主要转自 IBMhttp://www.ibm.com/developerworks/cn/xml/dm-1208gub/
- http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-yarn/
- http://www.ibm.com/developerworks/cn/linux/l-cn-spidermonkey/index.html
- http://www.ibm.com/developerworks/cn/opensource/os-pressiontest/
- 实战 Jetty(转http://www.ibm.com/developerworks/cn/web/wa-lo-jetty/)
- Linux 内核开发之网络设备驱动http://www.ibm.com/developerworks/cn/linux/l-cn-networkdriver/index.html
- http://www.ibm.com/developerworks/cn/java/j-lo-tomcat1/
- Linux 汇编语言开发指南(转自http://www.ibm.com/developerworks/cn/linux/l-assembly/)
- 使用JAVA中的动态代理实现数据库连接池(载自:http://www.ibm.com/developerworks/cn/java/l-connpoolproxy/)
- UNIX 高手的 10 个习惯 http://www.ibm.com/developerworks/cn/aix/library/au-badunixhabits.html
- java中的类加载器(原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/)
- 通过分析 JDK 源代码研究 TreeMap 红黑树算法实现 refer from http://www.ibm.com/developerworks/cn/java/j-lo-tree/index.html?ca=drs-
- 对话UNIX(from:http://www.ibm.com/developerworks/cn/aix/lp/speakingunix.html)
- http://www.ibm.com/developerworks/cn/opensource/os-httpclient/
- http://www.ibm.com/developerworks/cn/java/j-lo-junit-src/
- http://www.ibm.com/developerworks/cn/linux/l-dynamic-libraries/index.html
- http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/
- Linux音频编程指南(转自http://www.ibm.com/developerworks/cn/linux/l-audio/index.html#author 作者 肖文鹏)