可回收存储器

可回收存储是永久性自动存储和DMS表空间的一项特性。 可以使用它来整合正在使用且低于高水位标记的扩展数据块,并将表空间中未使用的扩展数据块返回至系统以供复用。

在创建表空间之前 9.7Db2® ,释放存储空间给系统的唯一方法是删除容器,或者通过清除高水位标记以上未使用的扩展区来缩小容器的大小。 没有可直接降低高水位标记的机制。 可以通过先卸载数据,然后将数据重新装入空白表空间来降低高水位标记;或者通过间接操作(例如,执行表和索引重组)来降低高水位标记。 使用此万不得已的方法时,即使有低于高水位标记的可用扩展数据块,仍然有可能未能降低高水位标记。

在扩展数据块整合过程中,包含数据的扩展数据块将移至低于高水位标记的未使用扩展数据块。 在移动扩展数据块之后,如果仍然存在低于高水位标记的可用扩展数据块,那么会将它们释放为可用存储器。 接下来,高水位标记将移至表空间中刚好位于最后一个正在使用的扩展数据块后面的页。 在包含可回收存储器的表空间中,可以使用 ALTER TABLESPACE 语句来回收未使用的扩展数据块。 图1 展示了可回收存储的工作原理。
图 1。 可回收存储器的工作方式。 对表空间启用可回收存储器之后,就可以移动使用中的扩展数据块以使其占用表空间中位置较低的未使用扩展数据块。
此图显示如何移动扩展数据块以填充可回收存储器表空间中的可用空间。

DB2 V9.7 及更高版本中创建的所有非临时自动存储器和 DMS 表空间都能够合并低于高水位标记的扩展数据块。 对于在较早版本中创建的表空间,必须首先将该表空间替换为使用 Db2 9.7创建的新表空间。 您可以卸载并重新装入数据,也可以使用 SYSPROC.ADMIN_MOVE_TABLE 过程通过联机表移动操作来移动数据。 但是,不是必须进行这种迁移。 对其启用了可回收存储器的表空间可与没有可回收存储器的表空间共存于同一数据库。

通过移动扩展数据块来减小表空间大小是联机操作。 换而言之,在执行减小操作期间,使用数据操作语言 (DML) 和数据定义语言 (DDL) 编写的代码可以继续运行。 某些操作(例如,备份或复原)无法与扩展数据块移动操作同时运行。 在这些情况下,需访问要移动的扩展数据块的进程(例如,备份)将一直等到移动了许多扩展数据块(用户不可配置此数目)为止;这时,备份进程将获得对于所讨论的扩展数据块的锁定并继续工作。

您可以使用 MON_GET_EXTENT_MOVEMENT_STATUS 表函数来监视扩展数据块移动操作的进度。

提示: 要最大化 ALTER TABLESPACE 语句回收的空间量,请首先对表空间中的表和索引执行 REORG 操作。

自动存储器表空间

您可以通过多种方法来减小自动存储器表空间:
仅减小容器
选择此选项时,不会移动扩展数据块。 数据库管理器将尝试通过首先释放存在暂挂删除的扩展数据块来减小容器大小。 (由于可恢复性原因,可能无法释放某些暂挂删除扩展数据块,因此其中某些扩展数据块可能仍然存在。) 如果高水位标记先前在那些所释放的扩展数据块之间,那么将降低高水位标记,否则不会对其进行更改。 接着,将调整容器的大小,以使表空间中的空间总量等于或略大于高水位标记。 此操作本身通过带有 REDUCE 子句的 ALTER TABLESPACE 执行。
仅降低高水位标记
选择此选项时,将移动最大数目的扩展数据块以降低高水位标记,但是,不会执行容器大小调整操作。 此操作本身通过带有 LOWER HIGH WATER MARK 子句的 ALTER TABLESPACE 执行。
降低高水位标记并将容器减小特定的容量
选择此选项时,可以指定要将表空间减小的绝对容量(以千字节、兆字节或吉字节计)。 此外,也可以通过输入百分比值来指定要减小的相对容量。 无论采用哪种方法,数据库管理器都会首先尝试在不移动扩展数据块的情况下将空间减小所请求的容量。 即,它尝试通过仅减小容器大小 (如 仅容器缩减中所述) ,释放删除暂挂扩展数据块并尝试降低高水位标记来减少表空间。 如果此方法未将表空间减小足够的容量,那么数据库管理器会开始将表空间中已使用的扩展数据块向下移,以便降低高水位标记。 完成扩展数据块移动操作之后,将调整容器的大小,以使表空间中的空间总量等于或略大于高水位标记。 如果由于没有足够的扩展数据块可移动,因此无法将表空间减小所请求的容量,那么高水位标记将尽可能降低。 此操作是使用带有 REDUCE 子句的 ALTER TABLESPACE 执行的,该子句指定要将表空间大小减小的容量。
降低高水位标记并尽可能减小容器
在这种情况下,数据库管理器将尽可能移动扩展数据块,以减小表空间及其容器的大小。 此操作通过带有 REDUCE MAX 子句的 ALTER TABLESPACE 执行。

启动扩展数据块移动过程之后,可以使用带有 REDUCE STOP 子句的 ALTER TABLESPACE 语句将其停止。 这会落实已移动的任何扩展数据块,高水位标记会尽可能降低,并将容器大小调整为新的已降低的高水位标记。

DMS 表空间

可以通过两种方法来减小 DMS 表空间:

仅减小容器
选择此选项时,不会移动扩展数据块。 数据库管理器将尝试通过首先释放存在暂挂删除的扩展数据块来减小容器大小。 (由于可恢复性原因,可能无法释放某些“暂挂删除”扩展数据块,因此其中某些扩展数据块可能仍然存在。) 如果这些扩展数据块中存在高水位标记,那么高水位标记将降低。 否则,将不会对高水位标记进行更改。 接着,将调整容器的大小,以使表空间中的空间总量等于或略大于高水位标记。 此操作本身通过带有 REDUCE database-container 子句的 ALTER TABLESPACE 执行。
仅降低高水位标记
选择此选项时,将移动最大数目的扩展数据块以降低高水位标记,但是,不会执行容器大小调整操作。 此操作本身通过带有 LOWER HIGH WATER MARK 子句的 ALTER TABLESPACE 执行。
降低高水位标记和减小容器大小对于自动存储器表空间而言是结合在一起的自动化操作。 相比之下,对于 DMS 表空间而言,要降低高水位标记和减小容器大小,必须执行以下两项操作:
  1. 首先,必须使用带有 LOWER HIGH WATER MARK 子句的 ALTER TABLESPACE 语句来降低表空间的高水位标记。
  2. 接着,必须单独使用带有 REDUCE database-container 子句的 ALTER TABLESPACE 语句来执行容器大小调整操作。

启动扩展数据块移动过程之后,可以使用带有 LOWER HIGH WATER MARK STOP 子句的 ALTER TABLESPACE 语句将其停止。 这将落实任何已移动的扩展数据块,并将高水位标记减小为它的新值。

限制

  • Db2 pureScale 环境:
    • 从 V11.5 开始,缺省情况下,允许在 Db2 pureScale 环境中执行可回收存储器操作(DB2_ENABLE_PS_EXTENT_RECLAIM 注册表变量缺省为 ON)。
    • 不能同时对同一表空间运行多个可回收存储器操作。 对特定成员上的某个表空间执行可回收存储器操作时,此操作会跨所有成员扩展到此表空间。 如果尝试对已在进行可回收存储器操作的表空间运行可回收存储器操作,那么此操作将失败,并返回 SQL1523N 错误。

示例

示例 1:最大程度地减小自动存储器表空间的大小。

假定数据库带有一个自动存储器表空间 TS 以及三个表 T1、T2 和 T3,那我们会删除表 T1 和 T3:
   DROP TABLE T1 
   DROP TABLE T3 
现在,假定现在扩展数据块处于空闲状态,那么以下语句将导致回收以前被 T1 和 T3 占用的扩展数据块并降低该表空间的高水位标记:
   ALTER TABLESPACE TS REDUCE MAX

示例 2:将自动存储器表空间的大小减小特定容量。

假定数据库带有一个自动存储器表空间 TS 以及两个表 T1 和 T2。 接着,删除表 T1:
   DROP TABLE T1 
  
现在,要将表空间的大小减小 1 MB,请使用以下语句:
   ALTER TABLESPACE TS REDUCE SIZE 1M
此外,可以使用类似如下的语句按表空间现有大小的百分比来减小表空间:
   ALTER TABLESPACE TS REDUCE SIZE 5 PERCENT

示例 3:在高水位标记以下存在可用空间时减小自动存储器表空间的大小。

与示例 1 类似,假定数据库带有一个自动存储器表空间 TS 以及三个表 T1、T2 和 T3。 这次,当我们删除 T2 和 T3 时,在高水位标记正下方有 5 个空闲的扩展数据块组成的集合。 现在,假定本例中的每个扩展数据块都由两个 4K 页组成,实际上有 40 KB 的可用空间位于高水位标记下方。 如果发出类似如下的语句:
   ALTER TABLESPACE TS REDUCE SIZE 32K
数据库管理器可以降低高水位标记并减小容器大小,而无需执行任何扩展数据块移动。 此场景在 图 2 中说明
图 2。 降低高水位标记而不需要移动扩展数据块。
用于降低高水位标记和减小容器大小而不移动扩展数据块的插图。

示例 4:减小 DMS 表空间的大小。

假定数据库带有一个 DMS 表空间 TS 以及三个表 T1、T2 和 T3。 接着,我们删除表 T1 和 T3:
   DROP TABLE T1 
   DROP TABLE T3 
对于 DMS 表空间而言,降低高水位标记和减小容器大小的操作分为两个步骤。 首先,使用以下语句来移动扩展数据块,从而降低高水位标记:
   ALTER TABLESPACE TS LOWER HIGH WATER MARK 
接着,使用类似如下的语句来减小容器大小:
   ALTER TABLESPACE TS REDUCE (ALL CONTAINERS 5 M)