内容


DB2 9.7 中如何将数据库管理表空间转换为自动存储表空间

Comments

简介

IBM DB2 for Linux, Unix, and Windows 9.7 (DB2 9.7) 于 2009 年 6 月份正式发布。这版数据库对 DB2 V9.5 的新特性进行了增强,同时增加许多激动人心的特性。这些增强和新特性概括起来主要表现在三方面:降低成本,可信赖,易用。DB2 9.7 在帮助客户实现自身业务的同时可以大大节约维护成本和 IT 运营开销。

为了简化表空间的管理,从 DB2 V8.2.2 开始,DB2 引入了自动存储的概念。自动存储允许 DBA 在数据库级别指定在创建表空间时使用的存储路径,在创建表空间时不必显式地定义表空间的位置和大小,数据库系统可以在使用过程中自动分配和调整表空间。在 DB2 V9 中,自动存储已经变为数据库的默认选项,数据库在创建时会默认启用自动存储,除非显式的改变该选项。自动存储在保持了性能的同时大大的简化了 DBA 的工作,DBA 可以在数据库级别管理表空间的存储,表空间容器选择分配等工作由数据库管理器自动完成。在 DB2 9.7 以前,自动存储只能在数据库创建时启用,自动存储表空间也只能在创建时确定,DBA 在运维过程中不能改变数据库和表空间的类型。这个限制使已经建立的非自动存储表空间不能享受到自动存储特性所带来的好处。在 DB2 9.7 中,对于原本不支持自动存储的数据库,DBA 可以用比较简单的操作先将一个非自动存储数据库转换为自动存储数据库,然后再将一个数据库管理表空间转换为自动存储表空间。对于已经支持自动存储的数据库,可以直接将一个数据库管理表空间转换为自动存储表空间。本文将通过实际操作介绍启用自动存储的方法。

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,但是在转换期间如果是单个表空间转换,会导致该表空间在转换期间不可用。如果多个表空间需要转换,在使用数据库重定向恢复时会导致整个数据库不可用。为了对比重定向前后的表空间情况,在进行转换之前我们先来看看表空间的当前状态。

清单 5. 重定向恢复前的表空间信息
 db2 get snapshot for tablespaces on testdb 
。。。。。。
 Tablespace name = TS2 
  Tablespace ID = 5 
  Tablespace Type = Database managed space 
  Tablespace Content Type = All permanent data. Large table space. 
。。。。。。
  Container Name = /db2/db6test/data3 
  Container ID = 0 
。。。。。。
  Container Name = /db2/db6test/data4 
  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)

TS2 表空间当前使用两个用户指定的容器用于 DMS 类型的表空间。在这个基础上通过下面 4 个步骤我们可以将这个表空间转换成自动存储表空间。

第一步,做一个数据库或表空间的备份。

第二步,使用 redirect 选项恢复数据库或表空间。

 RESTORE DATABASE database_name TABLESPACE table_space_name REDIRECT

第三步,在恢复过程中使用 SET TABLESPACE CONTAINERS 命令将 DMS 表空间改为自动存储表空间。并继续恢复数据库或表空间。

 SET TABLESPACE CONTAINERS FOR tablespace_id USING AUTOMATIC STORAGE 
 RESTORE DATABASE database_name CONTINUE

第四步,对数据库进行前滚恢复。

 ROLLFORWARD DATABASE database_name TO END OF LOGS AND STOP
清单 6. 使用数据库重定向操作转换表空间的实例
步骤一,
 db2 backup db testdb tablespace ts2 online to /db2/backup 
 Backup successful. The timestamp for this backup image is : 20091102012416 

步骤二,
 db2 "restore db testdb tablespace(ts2) from /db2/backup redirect"

 SQL1277W A redirected restore operation is being performed. Table space 
 configuration can now be viewed and table spaces that do not use automatic 
 storage can have their containers reconfigured. 

 DB20000I The RESTORE DATABASE command completed successfully. 

步骤三,
 db2 set tablespace containers for 5 using automatic storage 
 DB20000I The SET TABLESPACE CONTAINERS command completed successfully. 

 db2 restore database testdb continue 
 DB20000I The RESTORE DATABASE command completed successfully. 

步骤四,
 db2 rollforward db testdb to end of logs and stop 

  Rollforward Status 

 Input database alias = testdb 
 Number of nodes have returned status = 1 

 Node number = 0 
 Rollforward status = not pending 
 Next log file to be read = 
 Log files processed = - 
 Last committed transaction = 1970-01-01-00.00.00.000000 UTC 

 DB20000I The ROLLFORWARD command completed successfully.

在执行完以上的步骤,下面来看看数据库重定向以后的表空间情况。

清单 7. 使用数据库重定向操作后的表空间
 db2 get snapshot for tablespaces on testdb 
。。。。。。
 Tablespace name                            = TS2 
  Tablespace ID = 5 
  Tablespace Type = Database managed space 
  Tablespace Content Type = All permanent data. Large table space. 
。。。。。。
 Tablespace State = 0x'00000000'
。。。。。。
  Container Name = 
/db2/db6test/path1/db6test/NODE0000/TESTDB/T0000005/C0000000.LRG 

  Container ID = 0 
。。。。。。
  Container Name = 
/db2/db6test/path2/db6test/NODE0000/TESTDB/T0000005/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 13 447 0 6 0 2 (0,1)

在快照中,我们看到,自动存储的两个容器已经取代了 DMS 过去的两个容器,因而表空间已经成功的被转换成了自动存储类型。

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

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

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

总结

自动存储特性可以大大减少 DBA 的负担,提高数据库的性能。本文通过实际操作,介绍了在 DB2 9.7 中,将数据库管理表空间转换为自动存储表空间的两种方法,通过转换,可以使更多的 DB2 数据库表空间享受到自动存储特性带来的好处。


相关主题

  • 通过 developerWorks Information Management 专区 学习关于 Information Management 的更多知识。在这里可以找到技术文档、how-to 文章、培训、下载、产品信息等等。
  • 通过 Information Management 专区 DB2 9 技术资源中心 了解 DB2 产品家族的更多产品信息和相关技术。
  • 通过 DB2 V9.7 信息中心,了解 DB2 的详细产品信息和相关技术等全面的内容。
  • 参考“IBM DB2 database and SAP software”,了解更多 DB2 SAP 相关内容。
  • 随时关注 developerWorks 技术活动网络广播
  • 现在可以免费使用 DB2。下载 DB2 Express-C,这是为社区提供的 DB2 Express Edition 的免费版本,它提供了与 DB2 Express Edition 相同的核心数据特性,为构建和部署应用程序奠定了坚实的基础。

评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=474474
ArticleTitle=DB2 9.7 中如何将数据库管理表空间转换为自动存储表空间
publish-date=03152010