为什么 DELETE + REORG 不能释放磁盘空间 (DB2)?

Ale*_*ler 18 db2 maintenance database-size size db2-luw

在 DB2 中,我有一个包含大型二进制数据的表。现在我清除了整个表并运行了 runstats、reorg、runstats,但是占用的磁盘空间量没有改变。这里可能有什么问题?

该表位于我创建的自己的表空间中,如下所示:

CREATE BUFFERPOOL "MY_BP" SIZE 250 AUTOMATIC PAGESIZE 4096;
CREATE LARGE TABLESPACE MY_TBS IN DATABASE PARTITION GROUP IBMDEFAULTGROUP PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE EXTENTSIZE 64 PREFETCHSIZE 64 BUFFERPOOL MY_BP OVERHEAD 10.500000 TRANSFERRATE 0.140000 FILE SYSTEM CACHING;
Run Code Online (Sandbox Code Playgroud)

我删除/重组如下:

DELETE FROM MY_TBL
RUNSTATS ON TABLE MY_TBL WITH DISTRIBUTION AND DETAILED INDEXES ALL
REORG TABLE MY_TBL
RUNSTATS ON TABLE MY_TABLE WITH DISTRIBUTION AND DETAILED INDEXES ALL
ALTER TABLESPACE MY_TBS REDUCE
Run Code Online (Sandbox Code Playgroud)

表 MY_TBL 在所有这些之前占用了 2.5GB,在删除/重组之后它只使用了3MB

FWIW:我正在运行 DB2/NT v9.5.2。

Chr*_*ich 22

我将猜测您正在使用自动存储。(并不是说这会发生,否则会发生……使用自动存储很容易发生这种情况。)

问题很可能是您的数据库为自己回收了空间,但没有将磁盘释放回操作系统。通过检查表空间的高水位线,可以很容易地显示这一点。

执行以下操作

db2 list tablespaces show detail

这将显示每个表空间以及它在磁盘上使用的内容。Used pages是数据库使用的磁盘页数。将其与total pages(磁盘上声明的总数)进行比较,High water mark (pages)将显示您是否“声明”了超出实际需要的数量。(即,低使用页数、非常高的总页数和接近总页数的高水位线)。

要摆脱这个未使用的空间并将其返回给操作系统,您将发出以下命令(在自动存储下):db2 alter tablespace <tablespace name> reduce max. 例子

db2 alter tablespace ts1 reduce max;
Run Code Online (Sandbox Code Playgroud)

这将导致 DB2 降低高水位线并将未使用的磁盘释放回操作系统。(请注意,您只能对常规和大型表空间执行此操作,而不能对系统临时表空间或用户临时表空间执行此操作)。

如果您使用没有自动存储的 DMS,您需要使用一组稍微不同的命令:

db2 alter tablespace <tablespace name> lower high water mark;
db2 alter tablespace reduce (<containter name> or [all containers] integer K|M|G or integer PERCENT);
Run Code Online (Sandbox Code Playgroud)

例子

db2 alter tablespace ts1 lower high water mark;
db2 alter tablespace reduce (all containers 500 M);
Run Code Online (Sandbox Code Playgroud)

在我们工作的地方,我们将其放入我们的一些维护脚本中,以便我们在进行重组后自动运行它以确保我们回收磁盘空间。在我们的例子中,我们使用 DB2 LUW 9.7 FP 4,因此仔细检查 9.5 的信息中心以确保您可以访问适合您的版本的正确信息并没有什么坏处。

编辑:如果您的表空间来自升级到 DB2 9.7 的数据库,您可能不会设置可回收存储属性。即使您从 DMS 升级到自动存储也是如此。无论哪种方式都会咬人,因为您实际上无法降低高水位线。您必须转储表和数据,删除表空间。然后使用自动存储重新创建表空间并导入表的数据。


Ale*_*ler 9

该表MY_TBL在一BLOB列中包含大量二进制数据。该REORG命令的文档说 DB2 避免重新组织这些对象,因为它很耗时并且不会改进集群。但是,如果LONGLOBDATA指定了该选项,则可以强制 DB2 重新组织 LOB 数据。DB2 可以重用未使用的空间,因此插入新数据将首先填充现有的未使用页面,然后再分配新的页面。

跑步

REORG TABLE MY_TBL LONGLOBDATA
Run Code Online (Sandbox Code Playgroud)

成功回收了空表使用的 2.5GB 磁盘空间。

我不知道这个选项并在我第一次阅读文档时监督它。