孔再华, 软件工程师, IBM

简介: DB2 9.7 增加了很多新功能帮助用户更容易地管理数据库。在 9.7 之前的版本中,降低表空间高水位标记是一件比较麻烦的事情,需要使用多个命令。在 DB2 9.7 中提供了简单的降低高水位标记的功能,让数据库管理员的工作变得简单。高水位标记是表空间中的最高已分配页,处于高水位标记下的空闲页是不能被其他应用使用的。降低高水位有助于提高表空间的利用,提高数据库性能。

表空间高水位标记(HWM)

高水位标记是一个应用广泛的术语,在很多的场合都会使用到,一般用以标记某一项指标的最高数值。DB2 中表空间高水位标记(HWM)是数据库管理存储器(DMS)表空间的特殊属性。表空间高水位标记是表空间中分配的最后一个扩展数据块之后的扩展数据块中第一页的页号。简单来说就是反映了表空间分配的最大空间。

图 1. 表空间 HWM

如图 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. 对象被删除

如图 2 所示,对象 1 被删除后,原先所占的扩展数据块成为空闲数据块,表空间中实际使用数据块是 0 到 2,9 到 14。真实使用到的数据页是小于高水位标记反映的分配空间的。为了能够使表空间高水位标记下的空闲数据块能被其他需求使用,必须降低高水位标记,减少表空间分配的大小,空间才能被释放出来。

图 3. 降低高水位标记

如图 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 = 6Name = LR1#DDICD Type = Database managed spaceContents = All permanent data. Large table space. State = 0x0000 Detailed explanation:   Normal Total pages = 260096 Useable pages = 260088 Used pages = 257994Free pages  = 2094  High water mark (pages) = 259086Page 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 ----------------- 略 -------------------

在清单 1 中,运行“db2 LIST TABLESPACES SHOW DETAIL”命令可以得到数据库中所有表空间的详细信息。这里摘取了其中一个表空间 LDE#DDICD 为例。用户需要关注的是其中四项。首先是“Tablespace ID”,在我们操作表空间的过程中,db2dart 工具是要以这个 ID 为参数的。其次是表的类型,清单 1 中展示的是数据库管理存储的表空间(Database managed space),只有这种类型的表空间才有高水位标记属性。最后看看已使用页(Used pages)和高水位标记(High water mark)的数值。如果相等,则说明高水位标记下没有空闲页可以被释放。如果高水位标记大于已使用页,则说明高水位标记下存在空闲页,而且也可以算出来。清单 1 中位于高水位标记下的空闲页为高水位标记 259086 减去已使用页 257994 等于 1092.

查看高水位标记信息

通过比较表空间的信息,能够筛选出可以降低高水位标记的表空间。但是对于不同的情况,这些表空间的高水位标记不一定都能被降低,还需要查看高水位标记的详细信息。这就要使用到 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 ExtentNote: Extent contains page #0 for object. Dump highwater mark processing - phase end. ----------------- 略 -------------------

使用”db2dart dbname /DHWM /TSI tbsid”命令可以查看表空间高水位标记的详细信息。其中 dbname 是数据库名称,“/TSI”用来指定表空间 ID(tbsid)。在输出结果中,可以看到在高水位标记下有两个空闲扩展数据块 266 和 267. 而占据高水位标记的数据块类型是 Table Data Extent。

获得降低高水位标记建议

清单 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. ----------------- 略 -------------------

通过“db2dart dbname /LHWM /TSI tbsid /NP 0”可以得到具体降低高水位标记需要执行的步骤。命令中最后的“/NP 0”指定想把高水位标记降低到具体数值。这里数字 0 表示尽可能降低高水位标记。这个参数指定的目标值不一定能够达到。一般情况下设置为 0,会使高水位标记降至尽可能低的位置。清单 3 中给出了具体的降低高水位标记的步骤和能够达到的目标。db2dart 找出了表空间中需要执行离线重组的表。这里要注意的是离线重组。表的在线重组可能会导致更高的高水位标记。

在清单 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--)--------------&gt<

tbsp_name 是表空间对象,如果是空值,则会对所有的表空间操作。member 的默认输入是 -1,指当前成员,如果是 -2,则是所有数据库成员。运行此表函数的返回结果是一张表。这里列举一些与本文内容相关的列。

图 4. MON_GET_TABLESPACE 输出列表

通过查询图 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

清单 5 中使用查询语句筛选出了所有高水位标记大于已使用页的表空间。查看 RECLAIMABLE_SPACE_ENABLED 这一栏,这是表空间的“可回收存储器”属性。如果是 1,则表示可回收。没有“可回收存储器”属性的表空间不能使用子句来减小或者降低高水位标记。

本次案例对象是采用了自动存储的表空间 TBS1,它的 RECLAIMABLE_SPACE_ENABLED 属性是 1,说明空间可以被回收。

降低高水位标记

在 DB2 97 中,回收表空间存储器只需要使用到“ALTER TABLESPACE”命令。首先了解“ALTER TABLESPACE”的相关语法:

清单 6. ALTER TABLESPACE 语法

               >>-ALTER TABLESPACE--tablespace-name----------------------------&gt >----+-REDUCE--+-------------------------------+--+-----------------------------+-+ | +-| database-container-clause |-+ '-| on-db-partitions-clause |-'  | | +-| all-containers-clause |-----+  | | +-MAX---------------------------+  | | +-STOP--------------------------+  | | '-integer--+---------+----------'  | | +-K-------+ | | +-M-------+  | | +-G-------+  | | '-PERCENT-' | +-LOWER HIGH WATER MARK--+------+--------------------------------------------+ | '-STOP-'  | '----------------------------------------------------------------------------'

清单 6 中展示了与回收表空间存储器相关的两个子句及其语法。其中 MAX 参数可以指定最大限度的降低高水位标记来释放空间。在运行 REDUCE 命令后,在数据块移动的过程中,也可以使用 STOP 参数来停止表空间移动。如果是 DMS 表空间,则需要先运行 LOWER HIGH WATER MARK 子句降低高水位标记,再运行 REDUCE 子句释放表空间。如果是启用了自动存储的表空间,直接运行 REDUCE 子句即可。

清单 7. 自动存储表空间

ALTER TABLESPACE REDUCE 10 M

清单 8. DMS 表空间

             ALTER TABLESPACE LOWER HIGH WATER MARK ALTER TABLESPACE REDUCE (ALL CONTAINERS 10 M)

本次案例中,表空间 TBS1 采用了自动存储,直接运行 REDUSE MAX 来最多的释放空闲空间。SQL 返回成功信息,但数据块的移动并没有结束。数据块移动所花费时间会受到环境的影响,会需要一定的时间,此过程也有可能会影响系统性能。如果需要停止数据块移动,使用 STOP 参数终止。

清单 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--)--------------&gt<

和前面阐述的表函数 MON_GET_TABLESPACE 使用方法一样,tbsp_name 是表空间对象,如果是空值,则会对所有的表空间操作。member 的默认输入是 -1,指当前成员,如果是 -2,则是所有数据库成员。返回结果也是一张表。

图 5. MON_GET_EXTENT_MOVEMENT_STATUS 输出列表

清单 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

清单 11 显示的输出信息是在表空间 TBS1 降低高水位标记,释放空闲空间的过程中获取的。当前显示已经移动了 100 个数据块,还剩下 1744 个数据块,共花费 1664ms 的时间。如果在非移动状态下,所有值为 -1.

验证表空间信息

同样是通过表函数 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

对照前面获取的关于表空间 TBS1 的信息,可以看到它的高水位标记从 6746 降低到了与已使用页相等的 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 :  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"

清单 13 显示了 db2diag 记录的数据块移动的具体信息,包括表空间对象,开始和结束时间,移动结果等等,是诊断数据块移动的好工具。

总结

本文主要介绍了 DB2 中降低表空间高水位标记,释放空闲空间的原理和方式。DB2 9.7 之前的用户可以参照第一种方式监控和降低高水位标记。而 DB2 9.7 用户可以采用新的降低高水位标记功能更快更简单的实现释放表空间。希望文章能够帮助用户更好的理解 DB2 表空间的存储概念,从而更有效地管理存储空间,节省运营成本。有关表空间管理的其他技术内容,可以参考 developerworks 上的文章,或者搜索 IBM DB2 9.7 Information Center for Linux, UNIX and Windows获得更多相关信息。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15082138/viewspace-668777/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15082138/viewspace-668777/

DB2 V9.7新特性 - 降低高水位标记相关推荐

  1. [Oracle]高水位标记(HWM)

    (一)高水位标记(High Water Mark,HWM)的概念 所谓高水位标记,是指一个已经分配的段中,已经使用的空间与未使用的空间的分界线.在表的使用过程中,随着数据的不断增多(insert),H ...

  2. mysql降低高水位_[数据库]数据高水位分析

    [数据库]数据高水位分析 0 2014-10-16 11:02:12 2014-10-04 BaoXinjian 一.摘要 PLSQL_性能优化系列14_Oracle High Water Level ...

  3. mysql5.7新特性--官方高可用方案MGR介绍

    MGR简介 MySQL Group Replication(下简称:MGR)是MySQL官方推出的一种基于Paxos协议的状态机复制.在MGR出现之前,用户常见的MySQL高可用方式,无论怎么变化架构 ...

  4. 深入解析:DB2 V10.5新特性列式存储表的优点与缺点

    关注"数据和云",精彩不容错过 李培杨 云和恩墨西区交付技术顾问,有多年数据库运维经验,长期服务移动运营商行业客户,熟悉 DB2 数据库故障诊断,数据库迁移升级. >> ...

  5. Oracle-HWM(High Water Mark) 高水位解读

    读前须知:Oracle的逻辑存储管理 ORACLE在逻辑存储上分4个粒度 ,由大到小为: 表空间, 段, 区 和 块. 块Block 块:是粒度最小的存储单位,现在标准的块大小是8K,ORACLE每一 ...

  6. 12c oracle 修改内存_关于Oracle数据库12c 新特性总结

    概述 今天主要简单介绍一下Oracle12c的一些新特性,仅供参考. 参考: http://docs.oracle.com/database/121/NEWFT/chapter12102.htm#NE ...

  7. Oracle 高水位(HWM: High Water Mark) 说明

    一. 准备知识:ORACLE的逻辑存储管理.        ORACLE在逻辑存储上分4个粒度: 表空间, 段, 区 和 块.        1.1 块: 是粒度最小的存储单位,现在标准的块大小是8K ...

  8. oracle hwm的位置,Oracle 高水位(HWM)教程(2)

    4. 用逻辑导入导出: Emp/Imp 5. Alter table table_name deallocate unused 注:这证明,DEALLOCATE UNUSED为释放HWM上面的未使用空 ...

  9. Oracle 删除数据后释放数据文件所占磁盘空间(表空间降高水位)

    测试的时候向数据库中插入了大量的数据,测试完成后删除了测试用户以及其全部数据,但是数据文件却没有缩小.经查阅资料之后发现这是 Oracle "高水位"所致,那么怎么把这些数据文件的 ...

最新文章

  1. 数组去重的4种方法(Which one is the fastest???嘻嘻嘻....)
  2. Extract Subclass(提炼子类)
  3. linux 启动tomcat 怎么显示日志文件,随着LINUX的启动,打开一个终端显示TOMCAT的日志文件,请问如何做到?...
  4. php比较营业时间,使用php以人类可读格式从数据库表打印餐厅营业时间
  5. Javascript 调用百度地图不显示
  6. UVA1585 LA3354 Score【水题】
  7. 语音包mp3_目标明确,为运动而造 ,自带MP3功能的南卡RUNNER PRO骨传导耳机
  8. JavaScript开发心得--如何传递某行数据给下一页
  9. 20200827 plecs blockset更新版本
  10. bat文件批量创建文件夹
  11. 区块链中的节点是什么意思?
  12. java简单播放器涉及与实现
  13. 注册造价工程师用书免费电子版_2019-2020造价工程师各科电子教材精讲高清课件拿来和大家免费分享.......
  14. 《流浪地球》海报丨见证小破球24亿票房逆袭之路
  15. 高通不行了? 骁龙835排出前三, 国产处理器崛起, A11当老大
  16. 专利学习笔记8:解决CPC签名失败问题
  17. 一文学会网络分析——Co-occurrence网络图在R中的实现
  18. win10给鼠标右键添加快捷功能
  19. 2021-07-28
  20. uniapp 微信小程序 获取图形验证码解决方案

热门文章

  1. 2020-04-19-E-prime2.0.10安装过程
  2. 每个销售员都需要掌握的获取新客户的9种方法
  3. 显示器颜色校准_显示器校准:正确设置颜色的一般指南
  4. 阿里,昨天被主管告知3.25了,感觉自己好失败...
  5. java读取文件夹下所有文件并替换文件每一行中指定的字符串
  6. 三维体素图绘制实验与教程
  7. await把Promise解析为普通对象,async函数return的返回值是promise对象,await后转化为普通Object
  8. 从零开始的WordPress个人博客搭建
  9. 英特尔530和535哪个好_2020年终好物推荐,英特尔Evo平台认证更出彩
  10. 《操作系统——精髓与设计原理(第八版)》复习题抄录