DB2 表空间类型

Posted 厚积薄发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DB2 表空间类型相关的知识,希望对你有一定的参考价值。

DB2 表空间类型

在介绍如何将数据库管理表空间转换为自动存储表空间之前,我们先来回顾一下 DB2 表空间的各种类型以及各自的特点。

系统管理表空间 (System-Managed Space,SMS):这种类型的表空间由操作系统的文件管理系统分配和管理空间。在 DB2 V9 之前,SMS 表空间是默认选项,如果不带任何选项创建数据库或表空间,数据库管理器会自动将表空间建成系统管理表空间。创建 SMS 时,可以指定多个路径做为表空间的容器,空间的大小随数据量的变化由数据库管理器自动调整。这种类型的表空间比较便于管理,但空间大小受到一定限制,性能在大多数情况下不如数据库管理表空间。

数据库管理的空间 (Database-Managed Space,DMS):这种表空间由 DB2 数据库管理器负责管理存储空间。表空间容器可使用文件系统或裸设备。在定义 DMS 表空间时,可以指定多个文件名以及每个文件的大小,数据库管理器建立并使用这些文件作为表空间容器。表空间大小在创建时确定,空间不够时要手工添加容器,对于以文件作为容器的表空间可以指定 AUTORESIZE,从而在容器空间不够时由数据库管理器自动增加容器大小。这种表空间性能比较好,但需要在维护容器方面花费一些工作量。DMS 在需要经常关注和调整底层容器分配的场合有很大的灵活性。

自动存储表空间 (Automatic Storage Spaces):自动存储看起来是一种不同类型的表空间,但实际上是 DMS 和 SMS 的扩展。因为数据库管理的空间 DMS 需要比较多的维护,在 DB2 V8.2.2 中引入了 DMS 自动存储,以简化表空间管理。这种类型的表空间既保持了 DMS 的高性能又具有 SMS 表空间易于管理的特点,可以大大简化 DBA 的管理工作。自动存储需要首先在数据库级别启用,在 DB2 V9 以后,自动存储已经成为了 DB2 的默认设置,在建立数据库时,DBA 可以提供一组路径,在建立表空间时,数据库管理器会在这些提供的路径中建立需要的容器,容器的大小根据情况由数据库管理器负责分配和管理。相比 DMS 而言,自动存储表空间在容器管理方面十分简便,可以满足大多数表空间的使用需求。

让数据库支持自动存储

使用自动存储表空间的前提条件是要求数据库需要支持自动存储,在 DB2 9.7 以前,如果建立数据库时没有启用自动存储支持,那么除了重建数据库以外,没有别的办法可以再让数据库支持自动存储了。在 DB2 9.7 我们直接使用 ALTER DATABASE 命令就可以使数据库支持自动存储。

清单 1. 让数据库支持自动存储
ALTER DATABASE < 数据库名 > ADD STORAGE ON < 路径 1>[,< 路径 2>,...,< 路径 n>]
例如:
 db2 "alter database testdb add storage
 on /db2/db6test/path1, /db2/db6test/path2‘"

我们从上述命令中可以看出,通过给数据库增加存储路径就可以使数据库支持自动存储。我们需要注意:

  • 我们不能删除全部存储路径,因而也就意味着自动存储一旦启用就不能停止,如果我们试图这样做会出现 SQLSTATE 428HH 错误;
  • 在增加存储路径以后,新路径可能不会立刻被使用,需要手动重新分布数据;
  • 对于分区数据库需要保证这些新添件的路径在每个节点都存在并且有全部权限。

将 DMS 转换成自动存储表空间

使数据库支持自动存储并不会自动把过去存在数据库中的数据库管理表空间转换成为自动存储表空间,我们还需要进行一些操作才能实现表空间的转换。但 DB2 9.7 中只支持将 DMS 转换为自动存储表空间,还不能把系统管理表空间变为自动存储表空间。转换 DMS 的方法目前有两种:

  • 通过发出 ALTER TABLESPACE 命令,在线的将 DMS 转换成自动存储表空间;
  • 通过数据库恢复重定向离线的将 DMS 转换成自动存储表空间。

转换自动存储的在线方式

在线转换表空间会保持表空间可用,但需要数据重新分布,在转换前我们可以通过 GET SNAPSHOT 命令查看表空间的类型。

清单 2. 转换前的表空间信息
db2 get snapshot for tablespaces on testdb 
。。。。。。
 Tablespace name = TS1 
  Tablespace ID = 3 
  Tablespace Type = Database managed space 
  Tablespace Content Type = All permanent data. Large table space. 
。。。。。。
  Container Name = /db2/db6test/data1 
  Container ID = 0 
  。。。。。。
  Container Name = /db2/db6test/data2 
  Container ID = 1 
  。。。。。。
  Table space map: 
  Range Stripe Stripe Max Max Start End Adj. Containers 
  Number Set Offset Extent Page Stripe Stripe 
  [ 0] [ 0] 0 13 447 0 6 0 2 (0, 1) 
。。。。。。

表空间 TS1 为例,现在可以看到该表空间现在为 DMS 类型,有两个表空间容器,这两个表空间容器在一个 stripe set 里。

第一步,使用 ALTER TABLESPACE 命令,在命令选项中指定 MANAGED BY AUTOMATIC STORAGE 来转换表空间。

在我们发出 ALTER TABLESPACE 命令以后,表空间的发生了变化。

清单 3. 转换后的表空间信息
db2 alter tablespace ts1 managed by automatic storage 
 DB20000I The SQL command completed successfully. 
 
 db2 get snapshot for tablespaces on testdb 
。。。。。。
 Tablespace name = TS1 
  Tablespace ID = 3 
  Tablespace Type = Database managed space 
  Tablespace Content Type = All permanent data. Large table space. 
。。。。。。
 
 Container Name = /db2/db6test/data1 
  Container ID  = 0 
。。。。。。
 
  Container Name = /db2/db6test/data2 
  Container ID = 1 
。。。。。。
 
  Container Name = 
/db2/db6test/path1/db6test/NODE0000/TESTDB/T0000004/C0000000.LRG 
   
  Container ID = 2 
。。。。。。
 
  Container Name = 
/db2/db6test/path2/db6test/NODE0000/TESTDB/T0000004/C0000001.LRG 
   
  Container ID = 3 
。。。。。。
 
  Table space map: 
  Range Stripe Stripe Max Max Start End Adj. Containers 
  Number Set Offset Extent Page Stripe Stripe 
  [ 0] [ 0] 0 13 447 0 6 0 2 (0,1) 
  [ 1] [ 1] 7 15 511 7 7 0 2 (2,3)

从数据快照中我们看出,TS1 中又增加了两个容器,它是由数据库管理器根据数据库级别的存储路径新创建的。同时又新生成了一个 sctripe set,包含了新增加的两个容器。在数据库没有重新分布以前,新增加的容器并不会马上被使用。

第二步,使用 ALTER TABLESPACE 命令,在命令选项中制定 REBALANCE。

通过第一步我们已经将 DMS 转换为自动存储表空间,但用户以前定义的容器和自动存储生成的容器是并存的,这并不是我们想要得结果。如果用户忽略第二步,今后在使用 ALTER TABLESPACE 加 REDUCE 选项时,数据库可能会删除掉未使用的新增加的两个自动存储容器。所以我们在转换表空间以后必须执行第二步。第二步通常是个比较耗时的操作,这也是在线转换表空间的代价。

清单 4. REBALANCE 后的表空间信息
db2 alter tablespace TS1 rebalance 
 DB20000I The SQL command completed successfully. 
 db2 get snapshot for tablespaces on testdb 
。。。。。。
 Tablespace name  = TS1 
  Tablespace ID = 3 
  Tablespace Type = Database managed space 
  Tablespace Content Type = All permanent data. Large table space. 
  。。。。。。
  Rebalancer Mode = No Rebalancing 
  。。。。。。
 
  Container Name = 
/db2/db6test/path1/db6test/NODE0000/TESTDB/T0000003/C0000000.LRG 
  Container ID = 0 
  。。。。。。 
Container Name = 
/db2/db6test/path2/db6test/NODE0000/TESTDB/T0000003/C0000001.LRG 
 
  Container ID = 1 
。。。。。。
 
  Table space map: 
  Range Stripe Stripe Max Max Start End Adj. Containers 
  Number Set Offset Extent Page Stripe Stripe 
  [ 0] [ 0] 0 5 191 0 2 0 2 (0,1)

从运行完 rebalance 的表空间快照中我们看到,过去的两个数据库管理表空间的容器消失了,只剩下了自动存储的两个容器,stripe set 也变为了一个。我们还应该注意快照中的 Rebalancer Mode,当前是 No Rebalancing,表示表空间的 rebalance 已经完成了。

通过以上的步骤,我们已经成功的把一个数据库管理表空间在线的转换为了自动存储表空间。

转换表空间时的注意事项及使用技巧

我们已经了解到如何将非自动存储表空间转换为自动存储表空间的两种基本方法。在使用这两种方法的时候应该注意以下几点:

  • 自动存储一旦启用就不能更改,因此,在转换表空间前需要对使用需求进行全面考量;
  • 对于分区数据库,自动存储的路径必须存在于所有节点;
  • 在线转换表空间中的 REBALANCE 通常是一个比较耗时的过程,尤其是数据量比较大的表空间,所花费的时间会更长,系统资源消耗也很大。我们可以结合 throttling 功能来降低 REBANLANCE 对数据库性能的影响;
  • 由于以前建立的数据库中需要转换的表空间比较多,我们可以在 SQL 语句中结合 MON_GET_TABLESPACE 函数或者通过 SYSIBMADM.SNAPTBSP 表来找到 TBSP_USING_AUTO_STORAGE 不为 1,且 TBSP_TYPE 为 DMS 的表空间批量的进行在线转换;
  • l在通过数据库重定向恢复转换表空间时,我们也可以结合 GENERATE SCRIPT 选项,先生成模板脚本,然后通过改写模板脚本来实现批量转换。

 

 

以上是关于DB2 表空间类型的主要内容,如果未能解决你的问题,请参考以下文章

DB2表空间操作详解

db2 有一个表中有clob字段 drop这张表可以降表空间80g 但是手动delete fro

db2默认表空间userspace1怎么查看

db2 如何计算表空间和表缓存空间?

db2,删除表数据,表空间不释放

在db2 如何计算表空间和表缓存空间?有会的么?