通过启用使用文件容器进行自动大小调整的数据库管理的表空间 (DMS) ,可以使数据库管理器能够通过扩展现有容器自动处理表空间变满情况。

DMS 表空间由文件容器或原始设备容器组成,它们的大小是在将容器指定给表空间时设置的。当容器中的所有空间都已被使用时,那么认为表空间将满。但是,与 SMS 表空间不同,您可以使用 ALTER TABLESPACE 语句来手动添加或扩展容器,从而允许将更多的存储空间提供给表空间。DMS 表空间还有一项称为自动调整大小的功能:当可以自动调整大小的 DMS 表空间中的空间被耗用时,数据库系统将通过扩展一个或多个文件容器来增大该表空间的大小。

DMS 表空间的自动调整大小能力与自动存储器表空间的功能相关,但有所不同。有关更多信息,请参阅 自动存储器表空间、SMS 表空间和 DMS 表空间的比较。

从 V10.1 FP1 开始,在用户定义的永久表空间中不推荐使用 DMS 表空间类型, 在以后的发行版中可能会将其除去。对于目录和临时表空间,不推荐使用 DMS 表空间类型。有关更多信息,请参阅已经不推荐使用 DMS 永久表 空间。

启用和禁用自动调整大小功能

缺省情况下,不会对 DMS 表空间启用自动调整大小功能。以下语句将创建不启用自动调整大小功能的 DMS 表空间:

CREATE TABLESPACE DMS1 MANAGED BY DATABASE
     USING (FILE '/db2files/DMS1' 10 M)


要启用自动调整大小功能,对 CREATE TABLESPACE 语句指定 AUTORESIZE YES 子句:

CREATE TABLESPACE DMS1 MANAGED BY DATABASE
     USING (FILE '/db2files/DMS1' 10 M) AUTORESIZE YES


在创建 DMS 表空间之后,还可以使用带有 AUTORESIZE 子句的 ALTER TABLESPACE 语句来启用或禁用自动调整大小功能:

ALTER TABLESPACE DMS1 AUTORESIZE YES
   ALTER TABLESPACE DMS1 AUTORESIZE NO


有另外两个属性 MAXSIZE 和 INCREASESIZE 与自动调整大小的表空间相关联:

最大大小 (MAXSIZE)

CREATE TABLESPACE 语句的 MAXSIZE 子句定义表空间的最大大小。例如,以下语句创建可增长至 100 兆字节(如果数据库有多个数据库分区,那么是每个数据库分区的大小)的表空间:

CREATE TABLESPACE DMS1 MANAGED BY DATABASE
     USING (FILE '/db2files/DMS1' 10 M)
     AUTORESIZE YES MAXSIZE 100 M


MAXSIZE NONE 子句指定表空间没有最大限制。表空间可增长至达到文件系统限制或表空间限制(请参阅 SQL 和 XML 限制)。如果您不指定 MAXSIZE 子句,那么在启用了自动调整大小功能的情况下没有最大值限制。

使用 ALTER TABLESPACE 语句来更改已经启用了自动调整大小功能的表空间的 MAXSIZE 值,如下列示例中所示:

ALTER TABLESPACE DMS1 MAXSIZE 1 G
   ALTER TABLESPACE DMS1 MAXSIZE NONE


如果指定了最大大小,那么数据库管理器强制使用的实际值可能会比指定的值略小,这是因为数据库管理器会尝试使容器的增长保持一致。

增大大小 (INCREASESIZE)

当表空间中没有可用扩展数据块但是请求了一个或多个扩展数据块时,CREATE TABLESPACE 语句的 INCREASESIZE 子句将定义用来增大表空间的空间量。可以将值指定为显式大小或者指定为百分比,如下列示例中所示:

CREATE TABLESPACE DMS1 MANAGED BY DATABASE
     USING (FILE '/db2files/DMS1' 10 M)
     AUTORESIZE YES INCREASESIZE 5 M

   CREATE TABLESPACE DMS1 MANAGED BY DATABASE
     USING (FILE '/db2files/DMS1' 10 M)
     AUTORESIZE YES INCREASESIZE 50 PERCENT


百分比值意味着每次需要增大表空间时都要计算增大大小;即,增大量基于该时间点的表空间大小的百分比。例如,如果表空间大小是 20 MB 而 INCREASESIZE 值是 50%,那么表空间第一次将增大 10 MB(增大到 30 MB),下一次将增大 15 MB。

如果在启用自动调整大小功能时未指定 INCREASESIZE 子句,那么数据库管理器将确定要使用的适当值,该值在表空间的生存期内可能会发生变化。与 AUTORESIZE 和 MAXSIZE 一样,可以使用 ALTER TABLESPACE 语句更改 INCREASESIZE 的值。

如果指定了增大大小,那么数据库管理器将使用的实际值可能会与您提供的值稍微有所不同。对所用值进行这种调整是为了使表空间中各容器的增大保持一致。

关于对 DMS 表空间使用 AUTORESIZE 的限制

  • 不能对使用原始设备容器的表空间使用此功能,也不能将原始设备容器添加至可以自动调整大小的表空间。尝试执行这些操作会产生错误 (SQL0109N)。如果需要添加原始设备容器,那么必须首先禁用自动调整大小功能。
  • 如果禁用自动调整大小功能,后来又启用此功能,那么与 INCREASESIZE 和 MAXSIZE 相关联的值会丢失。
  • 重定向复原操作不能更改容器定义以包括原始设备容器。尝试执行这种操作会产生错误 (SQL0109N)。
  • 除了限制数据库管理器自动增大表空间的方式以外,最大大小还将限制您以手动方式增大表空间的程度。如果您执行向表空间添加空间的操作,那么生成的大小必须小于或等于最大大小。可以使用 ALTER TABLESPACE 语句的 ADD、EXTEND、RESIZE 或 BEGIN NEW STRIPE SET 子句来添加空间。

如何扩展表空间

如果 AUTORESIZE 处于启用状态,那么当所有现有空间都已被使用并请求了更多空间时,数据库管理器会尝试增大该表空间的大小。数据库管理器确定可以扩展表空间中的哪些容器,以便不需要对该表空间中的数据进行重新平衡。数据库管理器只扩展位于表空间图(该图描述表空间的存储器布局 - 有关更多信息,请参阅数据库管理的表空间的表空间映射)的最后范围内的那些容器,并且对它们扩展相同的数量。

例如,考虑如下语句:

CREATE TABLESPACE TS1 MANAGED BY DATABASE
     USING (FILE 'C:\TS1CONT' 1000, FILE 'D:\TS1CONT' 1000,
            FILE 'E:\TS1CONT' 2000, FILE 'F:\TS1CONT' 2000)
     EXTENTSIZE 4
     AUTORESIZE YES


请记住,数据库管理器将每个容器的一小部分(一个扩展数据块)用于元数据,以下是根据 CREATE TABLESPACE 语句为表空间创建的表空间图。(表空间图是表空间快照输出的一部分。)

Table space map:

    Range  Stripe Stripe  Max         Max  Start  End    Adj.   Containers
    Number Set    Offset  Extent      Page Stripe Stripe
    [   0] [   0]      0     995      3983      0    248   0    4 (0,1,2,3)
    [   1] [   0]      0    1495      5983    249    498   0    2 (2,3)


表空间图表明标识为 2 或 3 的容器(E:\TS1CONT 和 F:\TS1CONT)是仅有的在图最后面范围内的容器。因此,当数据库管理器自动扩展此表空间中的容器时,它只扩展这两个容器。

注:如果创建表空间时让所有容器的大小都相同,那么图中只有一个范围。在这种情况下,数据库管理器扩展每一个容器。要防止限制为只扩展一小部分容器,创建表空间时使各容器大小相等。

如先前所讨论的那样,可以指定对表空间最大大小的限制,也可以指定值 NONE 以便不限制表空间的增大。如果指定了 NONE 或者无限制,那么上限由文件系统限制或表空间限制定义;数据库管理器不会尝试让表空间大小增大到超过上限。但是,在达到上限之前,尝试增大容器可能会因为文件系统已满而失败。在这种情况下,数据库管理器不会再增大表空间大小,但是会向应用程序返回“空间不足”情况。解决此情况有两种方法:

  • 增大已满文件系统上可用的空间量。
  • 对表空间执行一些容器操作,以使这些容器不再位于表空间图的最后。完成此任务的最简易方法是将新的分割集添加至具有一组新容器的表空间,最佳实践是确保所有容器的大小相同。可以使用带有 BEGIN NEW STRIPE SET 子句的 ALTER TABLESPACE 语句来添加新的分割集。通过添加新的分割集,就会将新的范围添加至表空间图。借助新的范围,数据库管理器自动尝试扩展的容器就会处于此新的分割集中,而旧的容器保持不变。 注:当暂挂用户启动的容器操作或者正在执行后续生新平衡时,会禁用自动调整大小功能,直到落实了操作或重新平衡完成为止。

例如,对于 DMS 表空间,假定一个表空间具有三个大小相同的容器,并且每个容器都位于它自己的文件系统上。当对表空间执行一些操作时,数据库管理器就会自动扩展这三个容器。最后,其中一个文件系统变满了,对应的容器就不能再增大了。如果该文件系统上不能再提供更多可用空间,那么必须对表空间执行容器操作,使得存在问题的容器不再处于表空间图的最后范围内。在这种情况下,您可以添加新的分割集并指定两个两个容器(仍然具有空间的每个文件系统上一个),也可以指定更多容器(再次确保要添加的每个窗口大小一样并且要使用的每个文件系统上有足够的空间)。当数据库管理器尝试增大表空间的大小时,它现在将尝试扩展此新分割集中的容器而不会尝试扩展旧容器。

监视

有关对 DMS 表空间自动调整大小的信息是作为表空间监视器快照输出的一部分显示的。增大大小和最大大小值也包括在输出中,如以下样本中所示:

Auto-resize enabled                      = Yes or No
   Current tablespace size (bytes)          = ###
   Maximum tablespace size (bytes)          = ### or NONE
   Increase size (bytes)                    = ###
   Increase size (percent)                  = ###
   Time of last successful resize           = DD⁄MM⁄YYYY HH:MM:SS.SSSSSS
   Last resize attempt failed               = Yes or No