简介:
DB2 9.7 增加了很多新功能帮助用户更容易地管理数据库。在 9.7 之前的版本中,降低表空间高水位标记是一件比较麻烦的事情,需要使用多个命令。在
DB2 9.7 中提供了简单的降低高水位标记的功能,让数据库管理员的工作变得简单。高水位标记是表空间中的最高已分配页,处于高水位标记下的空闲页是不能被其他应用使用的。降低高水位有助于提高表空间的利用,提高数据库性能。
内容
高水位标记是一个应用广泛的术语,在很多的场合都会使用到,一般用以标记某一项指标的最高数值。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 中降低高水位标记需要操作的步骤或许不一样,但原理是一样的。
在 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
----------------- 略 ------------------- |
在清单 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 Extent
Note: 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 中提供了更简单易用的降低高水位标记功能。只需要使用“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--)--------------><
|
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---------------------------->
>----+-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--)-------------->< |
和前面阐述的表函数 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 : <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" |
清单 13 显示了 db2diag 记录的数据块移动的具体信息,包括表空间对象,开始和结束时间,移动结果等等,是诊断数据块移动的好工具。
本文主要介绍了 DB2 中降低表空间高水位标记,释放空闲空间的原理和方式。DB2 9.7 之前的用户可以参照第一种方式监控和降低高水位标记。而
DB2 9.7 用户可以采用新的降低高水位标记功能更快更简单的实现释放表空间。希望文章能够帮助用户更好的理解
DB2 表空间的存储概念,从而更有效地管理存储空间,节省运营成本。有关表空间管理的其他技术内容,可以参考
developerworks 上的文章,或者搜索
IBM DB2 9.7 Information Center for Linux, UNIX and Windows获得更多相关信息。
学习
获得产品和技术
- 使用可直接从 developerWorks 下载的
IBM 产品评估试用软件 构建您的下一个开发项目。
- 现在可以免费使用 DB2。下载
DB2 Express-C,这是为社区提供的 DB2 Express Edition 的免费版本,它提供了与
DB2 Express Edition 相同的核心数据特性,为构建和部署应用程序奠定了坚实的基础。
讨论
|