Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5442017
  • 博文数量: 348
  • 博客积分: 2173
  • 博客等级: 上尉
  • 技术积分: 7900
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-24 17:26
个人简介

雄关漫道真如铁,而今迈步从头越。

文章存档

2022年(4)

2020年(6)

2019年(2)

2018年(2)

2017年(34)

2016年(49)

2015年(53)

2014年(47)

2013年(72)

2012年(79)

分类: DB2/Informix

2016-10-24 10:05:12

一、在 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
 ----------------- 略 -------------------
在清单 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 之前降低高水位标记的步骤,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 中所示的列,用户可以获得与高水位标记相关的基本信息。其中的有些内容与“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,则是所有数据库成员。返回结果也是一张表。
清单 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 在日志信息中也记载了数据块移动的全部过程。

阅读(5896) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~