天天看点

db2 表空间 缓冲池简介第 1 节:定义第 2 节:性能含义结束语参考文档DB2 9.7 中如何将数据库管理表空间转换为自动存储表空间深入理解DB2表空间(Tablespace) DB2利用表空间备份重建数据库

简介

对于刚涉足 DB2 领域的 DBA 或未来的 DBA 而言,新数据库的设计和性能选择可能会很令人困惑。在本文中,我们将讨论 DBA 要做出重要选择的两个方面:表空间和缓冲池。表空间和缓冲池的设计和调优会对 DB2 服务器的性能产生深远的影响,因此我们将着重讨论这些活动。

在我们的示例中,我们将使用 DB2 V8.1 企业服务器版。大多数示例也适用于低级版本。我们会让您知道某个示例是否只适用于 V8.1。

在 第 1 节中,我们将从定义表空间的类型开始,并将说明 DB2 如何将数据存储在表空间中。我们将介绍配置选项并向您介绍创建和管理表空间的整个过程。接下来,我们将着重讨论 缓冲池,介绍缓冲池是什么以及如何创建和使用它。在 第 2 节中,我们将结合这两个方面并讨论该如何组织缓冲池和表空间才能获得最佳性能。

第 1 节:定义

表空间

数据库中的所有数据都存储在许多表空间中。可以认为表空间是孩子而数据库是其父母,其中表空间(孩子)不能有多个数据库(父母)。由于表空间有不同用途,因此根据它们的用途和管理方式将它们分类。根据用途有五种不同的表空间:

目录表空间

每个数据库只有一个目录表空间,它是在发出 CREATE DATABASE 命令时创建的。目录表空间被 DB2 命名为 SYSCATSPACE,它保存了系统目录表。总是在创建数据库时创建该表空间。

常规表空间

常规表空间保存表数据和索引。它还可以保存诸如大对象(Large Object,LOB)之类的长数据,除非这些数据显式地存储在长表空间中。如果某些表空间是数据库管理的空间(Database Managed Space,DMS),则可以将表及其索引分别放到单独的常规表空间中。我们将在本文后面定义 DMS 和系统管理的空间(System Managed Space,SMS)之间的区别。每个数据库中必须至少有一个常规表空间。创建数据库时指定该表空间的缺省名为 USERSPACE1。

长表空间

长表空间用于存储长型或 LOB 表列,它们必须驻留在 DMS 表空间中。它们还可以存储结构化类型的列或索引数据。如果没有定义长表空间,那么将把 LOB 存储在常规表空间中。长表空间是可选的,缺省情况下一个都不创建。

系统临时表空间

系统临时表空间用于存储 SQL 操作(比如排序、重组表、创建索引和连接表)期间所需的内部临时数据。每个数据库必须至少有一个系统临时表空间。随数据库创建的系统临时表空间的缺省名为 TEMPSPACE1。

用户临时表空间

用户临时表空间存储已声明的全局临时表。创建数据库时不存在用户临时表空间。至少应当创建一个用户临时表空间以允许定义已声明的临时表。用户临时表空间是可选的,缺省情况下一个都不创建。

表空间管理

可以用两种不同的方式管理表空间:

系统管理的空间(SMS)

SMS 表空间由操作系统进行管理。容器被定义成常规操作系统文件,并且是通过操作系统调用访问的。这意味着所有的常规操作系统功能将处理以下内容:操作系统将缓冲 I/O;根据操作系统约定分配空间;如有必要就自动扩展表空间。但是,不能从 SMS 表空间删除容器,并且仅限于将新的容器添加到分区的数据库。 前一节中所说明的那三个缺省表空间都是 SMS。

数据库管理的空间(DMS)

DMS 表空间是由 DB2 管理的。可以将容器定义成文件(在创建表空间时将把给定的大小全部分配给它们)或设备。分配方法和操作系统允许多少 I/O,DB2 就可以管理多少 I/O。可以通过使用 altER TABLESPACE 命令来扩展容器。还可以释放未使用的那部分 DMS 容器(从 V8 开始)。

下面是一个示例,向您说明该如何增大容器大小(V7 和 V8 都支持此功能):

ALTER TABLESPACE TS1

RESIZE (FILE '/conts/cont0' 2000,

DEVICE '/dev/rcont1' 2000,

FILE 'cont2' 2000)

请注意,只有 V8 才支持将原始容器的大小调整得更小。

如何创建和查看表空间

当您创建数据库时,将创建三个表空间(SYSCATSPACE、TEMPSPACE1 和 USERSPACE1)。通过使用 DB2 命令窗口(Command Window)或 UNIX 命令行,创建一个名为 testdb 的数据库,连接至该数据库,然后列出表空间:

CREATE DATABASE testdb
CONNECT TO testdb
LIST TABLESPACES
           

下面的 清单 1显示了 LIST TABLESPACES 命令的输出。

清单 1. LIST TABLESPACES 命令的输出

Tablespaces for Current Database
Tablespace ID                        = 0
Name                                 = SYSCATSPACE
Type                                 = System managed space
Contents                             = Any data
State                                = 0x0000
  Detailed explanation:
    Normal
Tablespace ID                        = 1
Name                                 = TEMPSPACE1
Type                                 = System managed space
Contents                             = System Temporary data
State                                = 0x0000
  Detailed explanation:
    Normal
Tablespace ID                        = 2
Name                                 = USERSPACE1
Type                                 = System managed space
Contents                             = Any data
State                                = 0x0000
  Detailed explanation:
    Normal
           

上面所示的这三个表空间是通过 CREATE DATABASE 命令自动创建的。用户可以通过在该命令中包含表空间说明来覆盖缺省的表空间创建,但是在创建数据库时必须创建一个目录表空间和至少一个常规表空间,以及至少一个系统临时表空间。通过使用 CREATE DATABASE 命令或以后使用 CREATE TABLESPACE 命令,可以创建更多的所有类型的表空间(目录表空间除外)。

容器

每个表空间都有一个或多个容器。重申一次,您可以认为容器是孩子,而表空间是其父母。每个容器只能属于一个表空间,但是一个表空间可以拥有许多容器。可以将容器添加到 DMS 表空间,或者从 DMS 表空间中删除容器,而且可以更改容器的大小。只能将容器添加到某个分区中分区数据库上的 SMS 表空间,在添加之前该分区还未给表空间分配容器。添加新的容器时,将启动一个自动的重新均衡操作以便将数据分布到所有容器上。重新均衡操作不会妨碍对数据库的并发访问。

表空间设置

可以在创建表空间时给它们指定许多设置,或者也可以稍后使用 altER TABLESPACE 语句时指定其设置。

页大小(Page size)

定义表空间所使用的页大小。所支持的大小为 4K、8K、16K 和 32K。页大小根据下表限定了可放到表空间中的表的行长度和列数:

表 1. 页大小的含义

页大小 行大小限制 列数限制 最大容量

4 KB 4 005 500 64 GB

8 KB 8 101 1 012 128 GB

16 KB 16 293 1 012 256 GB

32 KB 32 677 1 012 512 GB

表空间最多可包含 16384 个页,因此选择较大的页大小可以增加表空间的容量。

扩展块大小(Extent size)

指定在跳到下一个容器之前将写到当前容器中的页数。存储数据时数据库管理器反复循环使用所有容器。该参数只有在表空间中有多个容器时才起作用。

预取大小(Prefetch size)

指定当执行数据预取时将从表空间读取的页数。预取操作在查询引用所需的数据之前读入这些数据,这样一来查询就不必等待执行 I/O 了。当数据库管理器确定顺序 I/O 是适当的,并且确定预取操作可能有助于提高性能时,它就选择预取操作。

开销(Overhead)和传送速率(Transfer rate)

这些值用于确定查询优化期间的 I/O 成本。这两个值的测量单位都是毫秒,而且它们应当分别是所有容器开销和传送速率的平均值。开销是与 I/O 控制器活动、磁盘寻道时间和旋转延迟时间相关联的时间。传送速率是将一个页读入内存所必需的时间量。它们的缺省值分别是 24.1 和 0.9。可以根据硬件规格计算这些值。

CREATE TABLESPACE 语句的示例

下列语句将创建一个常规表空间。所讨论的所有设置都是为了进行说明。

CREATE TABLESPACE USERSPACE3
	PAGESIZE 8K
	MANAGED BY SYSTEM
	USING ('d:\\usp3_cont1', 'e:\\usp3_cont2', 'f:\\usp3_cont3')
	EXTENTSIZE 64
	PREFETCHSIZE 32
	BUFFERPOOL BP3
	OVERHEAD 24.1
	TRANSFERRATE 0.9
           

如何查看表空间的属性和容器指定 LIST TABLESPACES 命令的 SHOW DETAIL 选项将显示其它信息:LIST TABLESPACES SHOW DETAIL

要列出容器,我们需要使用以上输出中的 Tablespace ID:

LIST TABLESPACE CONTAINERS FOR 2

清单 3. LIST TABLESPACE CONTAINERS 命令的输出
            Tablespace Containers for Tablespace 2
 Container ID                         = 0
 Name                                 = C:\\DB2\\NODE0000\\SQL00004\\SQLT0002.0
 Type                                 = Path
           

该命令将列出指定表空间中的所有容器。如上所示的路径指向容器物理上所在的位置。

缓冲池

一个缓冲池是与单个数据库相关联的,可以被多个表空间使用。当考虑将缓冲池用于一个或多个表空间时, 必须保证表空间页大小和缓冲池页大小对于缓冲池所“服务”的所有表空间而言都是一样的。一个表空间只能使用一个缓冲池。

创建数据库时,会创建一个名为 IBMDEFAULTBP 的缺省缓冲池,所有的表空间都共享该缓冲池。可以使用 CREATE BUFFERPOOL 语句添加更多的缓冲池。缓冲池的缺省大小是 BUFFPAGE 数据库配置参数所指定的大小,但是可以通过在 CREATE BUFFERPOOL 命令中指定 SIZE 关键字来覆盖该缺省值。足够的缓冲池大小是数据库拥有良好性能的关键所在,因为它可以减少磁盘 I/O 这一最耗时的操作。大型缓冲池还会对查询优化产生影响,因为更多的工作可在内存中完成。

基于块的缓冲池 

V8 允许您留出缓冲池的一部分(最高可达 98%)用于基于块的预取操作。基于块的 I/O 可以通过将块读入相邻的内存区而不是将它分散装入单独的页,来提高预取操作的效率。每个缓冲池的块大小必须相同,并且由 BLOCKSIZE 参数进行控制。该值等于块的大小(单位为页),从 2 到 256,缺省值为 32。

扩展存储器 

DB2 不将扩展存储器用于缓冲区。但是,可以用扩展存储器来高速缓存内存页,使得从内存移出页变得更快。

CREATE BUFFERPOOL 语句的示例

下面是 CREATE BUFFERPOOL 语句的一个示例:
CREATE BUFFERPOOL BP3
SIZE 2000
PAGESIZE 8K
           

该缓冲池被分配给上面的 CREATE TABLESPACE 示例上的 USERSPACE3,并且在创建表空间之前创建该缓冲池。请注意,缓冲池和表空间的页大小都是 8K,两者是相同的。如果您在创建缓冲池之后创建表空间,则可以省去 CREATE TABLESPACE 语句中的 BUFFER POOL BP3 语法。相反,可以使用 altER TABLESPACE 命令将缓冲池添加到现有的表空间:

ALTER TABLESPACE USERSPACE3 BUFFERPOOL BP3

如何查看缓冲池属性

通过查询 SYSCAT.BUFFERPOOLS 系统视图可以列出缓冲池信息:

SELECT * FROM SYSCAT.BUFFERPOOLS
BPNAME             BUFFERPOOLID NGNAME             NPAGES      PAGESIZE    ES
------------------ ------------ ------------------ ----------- ----------- --
IBMDEFAULTBP                  1 -                          250        4096 N
  1 record(s) selected.
           

要找出哪个缓冲池被分配给了表空间,请运行下面这个查询:

SELECT TBSPACE, BUFFERPOOLID FROM SYSCAT.TABLESPACES
TBSPACE            BUFFERPOOLID
------------------ ------------
SYSCATSPACE                   1
TEMPSPACE1                    1
USERSPACE1                    1
  3 record(s) selected.
           

可以在上一个查询中找到 BUFFERPOOLID,该查询使您能够看到每个表空间与哪个缓冲池相关联。

数据库如何保存表空间的可视化图表

既然我们已经描述了表空间和缓冲池是什么以及如何创建它们,那么就让我们研究一下有关如何在数据库中将它们直观地组织起来的示例。

db2 表空间 缓冲池简介第 1 节:定义第 2 节:性能含义结束语参考文档DB2 9.7 中如何将数据库管理表空间转换为自动存储表空间深入理解DB2表空间(Tablespace) DB2利用表空间备份重建数据库
db2 表空间 缓冲池简介第 1 节:定义第 2 节:性能含义结束语参考文档DB2 9.7 中如何将数据库管理表空间转换为自动存储表空间深入理解DB2表空间(Tablespace) DB2利用表空间备份重建数据库
db2 表空间 缓冲池简介第 1 节:定义第 2 节:性能含义结束语参考文档DB2 9.7 中如何将数据库管理表空间转换为自动存储表空间深入理解DB2表空间(Tablespace) DB2利用表空间备份重建数据库

该数据库有 5 个表空间:一个目录表空间、两个常规表空间、一个长表空间和一个系统临时表空间。没有创建用户临时表空间。另外有 8 个容器。

在这个方案中,缓冲池可能如下分配: 

将 BP1(4K)分配给 SYSCATSPACE 和 USERSPACE2 

将 BP2(8K)分配给 USERSPACE1 

将 BP3(32K)分配给 LARGESPACE 和 SYSTEMP1

第 2 节:性能含义

一般而言,在物理设备上设计如何放置表空间和容器时,目标是使 I/O 并行性和缓冲区利用率达到最优。要实现这个目标,应当全面了解数据库设计和应用程序。只有这样您才能确定类似于下面这样的问题:将两张表分隔到不同的设备会不会产生并行 I/O,或者,是否应当在单独的表空间中创建表以便可以对它进行完全缓冲。

设计新数据库的物理布局应当从设计表空间的组织开始:

第一步是确定表设计所给出的约束。这些可能会导致必须使用多个常规表空间。

第二步是考虑如果让表空间中的表具有不同的设置,是否有可能显著提高性能。

一旦作出了一个试验性的表空间设计,那么就必须考虑缓冲池的利用率。这可能会使前面的表空间设计产生一些变化。

最后,必须给表空间分配容器。

这个是一个有反复的过程,应该通过压力测试和基准测试验证该设计。很显然,实现最佳的设计可能需要花费大量精力,并且仅当数据库性能必须可能是最佳时才能证明设计是最佳的。通常:

从最简单的可行设计入手。

只有根据测试证明有充分的性能理由时才增加复杂性。

通常,为了降低管理和保持一个较为简单的数据库设计的复杂性,稍微降低一点性能是值得的。DB2 具有一种非常成熟的资源管理逻辑,往往不用进行精心的设计就能产生非常好的性能。

表空间组织

通常应该将目录表空间和系统临时表空间作为 SMS 分配。没有必要拥有多个具有相同页大小的临时表空间,通常只需一个具有最大页大小的临时表空间就够了。

突出的问题在于是否要将用户数据分割到多个表空间中。 一个考虑因素是页的利用率。不能将行分割到不同的页,因此具有长行的表需要有合适的页大小。但是,一个页上的行不能超过 255 个,因此具有较短行的表不能利用整个页。例如,在页大小为 32K 的表空间中放置行长度为 12 字节的表,它大约只能利用每个页的 10%(即,(255 行 * 12 字节 + 91 字节的开销) / 32k 页大小 = ~10%)。

如果表很大,这只是一个考虑因素,因此浪费的空间就非常大。它还会使 I/O 和缓存的效率降低,因为每个页的实际有用内容很少。如果可以将表放到具有较小页的表空间中,以及可以充分利用较大的页大小,那么最常用的访问方法将确定哪一个更好。如果通常是顺序访问大量行(该表可能进行了群集),那么比较大的页大小会比较有效。如果随机访问行,那么较小的页大小可以允许 DB2 更好地利用缓冲区,因为同样的存储区域可以容纳更多页。

一旦根据页大小对表进行了分组, 那么访问频率和类型将确定把数据进一步分组到独立的表空间中是否有意义。每张表根据自己被最频繁访问的方式,可以具有一组最有效的表空间设置:PAGESIZE、EXTENTSIZE 和 PREFETCHSIZE。上面已介绍了 PAGESIZE。EXTENTSIZE 是在将数据写入到下一个容器之前写入到当前容器中的数据的页数(如果表空间中存在多个容器的话)。

PREFETCHSIZE 指定在执行数据预取时将从表空间读取的页数。当数据库管理器确定顺序 I/O 是适当的,并且确定预取操作可能有助于提高性能时,会使用预取操作(通常是大型表扫描)。比较好的做法是将 PREFETCHSIZE 值显式地设置成表空间的 EXTENTSIZE 值与表空间容器数的乘积的倍数。例如,如果 EXTENTSIZE 是 32,并且表空间中有 4 个容器,那么理想的 PREFETCHSIZE 应当是 128、256 等等。如果一个或多个频繁使用的表需要的这组参数的值不同于那些最适用于表空间其它表的性能的参数值,那么将这些表放入单独的表空间可能会提高整体性能。

如果预取操作是表空间中的重要因素,那么请考虑留出一部分缓冲区用于基于块的 I/O。块大小应当等于 PREFETCHSIZE。

缓冲池的利用率

使用多个用户表空间的最重要原因是管理缓冲区的利用率。 一个表空间只能与一个缓冲池相关联,而一个缓冲池可用于多个表空间。

缓冲池调优的目标是帮助 DB2 尽可能好地利用可用于缓冲区的内存。整个缓冲区大小对 DB2 性能有巨大影响,这是因为大量的页可以显著地减少 I/O 这一最耗时的操作。但是,如果总的缓冲区大小太大,并且没有足够的存储器可用来分配给它们,那么将为每种页大小分配最少的缓冲池,性能就会急剧下降。要计算最大的缓冲区大小,DB2、操作系统以及其它任何应用程序都必须考虑其它所有存储器的利用率。一旦确定了总的可用大小, 就可以将这个区域划分成不同的缓冲池以提高利用率。如果有一些具有不同页大小的表空间,那么每种页大小必须至少有一个缓冲池。

拥有多个缓冲池可以将数据保存在缓冲区中。例如,让我们假设一个数据库有许多频繁使用的小型表,这些表通常全部都位于缓冲区中,因此访问起来就非常快。现在让我们假设有一个针对非常大的表运行的查询,它使用同一个缓冲池并且需要读取比总的缓存区大小还多的页。当查询运行时,来自这些频繁使用的小型表的页将会丢失,这使得再次需要这些数据时就必须重新读取它们。

如果小型表拥有自己的缓冲池,那么它们就必须拥有自己的表空间,因此大型查询就不能覆盖它们的页。这有可能产生更好的整体系统性能,虽然这会对大型查询造成一些小的负面影响。经常性地进行调优是为了实现整体的性能提高而在不同的系统功能之间做出的权衡。区分功能的优先级并记住总吞吐量和使用情况,同时对系统性能进行调整,这是非常重要的。

V8 所引入的新功能能够在不关闭数据库的情况下更改缓冲池大小。带有 IMMEDIATE 选项的 altER BUFFERPOOL 语句会立刻生效,只要数据库共享的内存中有足够的保留空间可以分配给新空间。可以使用这个功能,根据使用过程中的周期变化(例如从白天的交互式使用转换到夜间的批处理工作)来调优数据库性能。

物理存储器组织

一旦将表分布到多个表空间中,就必须决定它们的物理存储器。表空间可以存储在多个容器中,并且它可以是 SMS 或 DMS。SMS 更容易管理,对于包含许多不同的小型表的表空间(例如目录表空间),尤其是那些包含 LOB 的表的表空间而言,SMS 可能是个不错的选择。为了降低每次一页地扩展 SMS 容器的开销,应当运行 db2empfa命令。这会将数据库配置参数 MULTIPAGE_ALLOC 的值设置成 YES。

DMS 通常有更好的性能,并且它提供了分别地存储索引和 LOB 数据的灵活性。通常应当将一个表空间的多个容器分开存放在单独的物理卷上。这可以提高某些 I/O 的并行性。当有多个用户表空间和多个设备时,应当考虑应用程序逻辑,这样就可以尽可能平均地在这些设备上分配工作负载。

RAID 设备有它们自己的特殊考虑。EXTENTSIZE 应该等于 RAID 条带大小或者是它的倍数。PREFETCHSIZE 应该等于 RAID 条带大小乘以 RAID 并行设备数(或者等于该乘积的倍数),这个值应该是 EXTENTSIZE 的倍数。DB2 提供了自己的注册表变量,允许您增强您的特定环境。通过执行下面这个命令,可以在一个容器中启用 I/O 并行性:

db2set DB2_PARALLEL_IO=*

另一个注册表变量 DB2_STRIPED_CONTAINERS=ON 可以将容器标记大小从一个页更改成整个扩展块,因此就能使表空间扩展块和 RAID 条带一致。

至于性能评估的其它方面,要知道某个更改是否有益,唯一稳妥的方法就是进行基准测试。如果物理组织发生了更改,那么执行该任务稍微有些复杂,这是因为这时要更改表空间必须要付出相当大的精力。最实用的方法就是减少设计阶段中的案例数,这样的话稍后需要进行基准测试的案例就比较少了。只有在性能极其重要并且不同的设计之间有可能存在显著的性能差别时,才值得花时间和精力进行严格的基准测试来比较设计。应当把重点放在缓冲池上,确保没有将它们分配到虚拟内存中,并确保以最有效的方式利用它们。

有关移动数据库的考虑事项

在将数据库移到另一个系统之前, 始终应该重新评估它的调优参数和物理组织,即便这些系统是同一种平台也应如此。在实际情况中,DBA 将经过良好调优的数据库从具有 1 GB 内存的 Windows 服务器复制到具有 256 MB 内存的膝上型计算机中。在服务器上进行连接所花的时间小于一秒,而在膝上型计算机中却要用掉 45 分钟。通过减少缓冲池大小和其它内存参数就能解决这个问题。

如果平台不一样,那么这个问题就变得更难了。即使是在 UNIX 和 Windows 之间进行移动,在一个系统上已是最佳性能,在另一个系统上却未必如此。如果复制数据库是为了进行生产,那么应当重复调优过程。如果必须将数据库移到 zSeries™,那么这里讨论的某些内容则不适用,而应该参考有关的手册和红皮书。在 iSeries 系统上,物理设置和调优是在数据库环境之外一起完成的,应当参考 iSeries™ 系统管理手册。

结束语

我们在本文中介绍了许多内容,但是您应当了解的有关数据库设计和性能的知识决不仅限于此。我们着重讨论了数据库设计的两个比较大的问题,而没有深入研究查询优化和应用程序考虑事项的细节。设计数据库是第一位的,因为这是其它所有事情的前提,因此您的初始规划应该非常全面。为了方便您的学习,我们在下面提供了其它联机参考资料,这样您就可以继续学习有关本主题的内容。

参考文档

http://www.ibm.com/developerworks/cn/data/library/techarticles/0212wieser/0212wieser.html

DB2 开发者园地的文章:

  • 更多内容请访问 Information Management 专区 查看更多的文章、教程和多媒体课堂等技术资源。
  • 访问 DB2 存储琐事 了解 DB2 存储相关的技术资源。
  • 访问 IBM Database Magazine 的 Tuning Up for OLTP and Data Warehousing 了解有关 OLTP 和数据仓库的内容。
  • 下载 信息管理软件试用版 体验信息管理软件的强大功能。

--------

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

简介

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'"
           

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

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

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

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

  1. 通过发出 ALTER TABLESPACE 命令,在线的将 DMS 转换成自动存储表空间;
  2. 通过数据库恢复重定向离线的将 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 数据库表空间享受到自动存储特性带来的好处。

http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-1003liux/

------------------------------

深入理解DB2表空间(Tablespace)

表空间是数据库系统中数据库逻辑结构与操作系统物理结构之间建立映射的重要存储结构,它作为数据库与实际存放数据的容器之间的中间层,用于指明数据库中数据的物理位置。任何数据库的创建都必须显式或隐式的为其指定表空间,且数据库中的所有数据都位于表空间中。

用户可以根据硬件环境以及成本等需求,通过指定建立在不同容器上的表空间来自由选择数据的物理存储位置。同时由于备份和恢复可以在表空间级别执行,用户能够进行更多粒度的备份恢复控制。

理解表空间前先理解容器。

容器(Container)

容器是物理存储设备,可以通过目录名,设备名或文件名进行标识。事实上,这也正是三种容器类型。设备容器(如磁带等)和文件容器被同等看待,通常直接将其理解为数据文件(磁盘存储内部结构中有介绍,数据文件中包含若干Extent。)。系统管理表空间只能使用目录容器,数据库管理表空间只能使用设备容器和文件容器。

容器被分配给某个表空间,单个表空间可以使用多个容器,但容器只能属于一个表空间。容器通常位于本地磁盘上,某些远程网络设备或文件也能作为表空间的容器,但由于网络延迟与可靠性方面的原因,远程容器对数据库安全与性能会造成影响,因此不建议使用远程容器。

按照管理方式的不同对数据库表空间类型进行了划分

DB2数据库系统的表空间有三种管理类型:

系统管理表空间(SMS,System-Managed Space)

SMS表空间由操作系统的文件系统管理器分配并管理。在这种表空间中,数据存储空间完全由操作系统管理,SMS表空间能够使用的唯一容器是目录容器,SMS表空间可以定义多个容器,目录容器可以根据需要增加大小,因此SMS表空间的大小是可以动态增加的。但是一旦SMS表空间创建,就不能再为表空间增加或删除容器了。SMS表空间中通常包含多个文件,这些文件代表了存储在文件系统空间中的表对象,比如表数据,表索引,表大对象都是单独占用一个或若干个文件的。一旦为表指定了SMS表空间,那么表中的数据就不允许分开存储,即表的常规数据,索引,大对象数据不能位于不同的表空间中。在DB2 V9之前的数据库版本中,创建数据库(创建数据库时如果不指定表空间则会默认创建3个表空间)或表空间的默认类型就是SMS表空间。另外,只有DB2数据库允许有系统管理表空间,Oracle数据库的表空间都是数据库管理的,不存在系统管理表空间。

举个SMS表空间的简单例子:创建一个以containers1目录为容器的SMS表空间MYSPACE。再创建一张表TEST,其常规数据,索引,大对象均位于MYSPACE表空间中(如果三者指定不同的表空间则表创建会失败,事实上,指定了常规数据的表空间为SMS表空间后,索引和大对象的表空间也就默认了)。表创建完成后,物理磁盘上的数据是这样的:

db2 表空间 缓冲池简介第 1 节:定义第 2 节:性能含义结束语参考文档DB2 9.7 中如何将数据库管理表空间转换为自动存储表空间深入理解DB2表空间(Tablespace) DB2利用表空间备份重建数据库

其中SQL00002.DAT数据文件存放表中的常规数据;SQL00002.DTR数据文件存放由于重组,表连接等产生的临时数据。SQL00002.INX数据文件存放表中的索引。还有LF后缀的存放LONG VARCHAR或LONG VARGRAPHIC数据,LB后缀的存放BLOB,CLOB和DBLOB数据,LBA后缀的存放LB后缀文件的分配和可用空间信息等。另外顺便说下图中的SQLTAG.NAM文件。事实上每一个容器都有一个TAG数据结构用于标识容器属于哪一个实例的哪一个数据库的哪一个表空间。对于DMS表空间的容器,TAG位于第一个Extent内,对于SMS表空间的容器,则是以SQLTAG.NAM文件的形式存在。

使用SMS表空间的每一个表都会在表空间的容器(也就是目录)下对应产生一系列的SQL*.DAT ,SQL*.INX等文件。表和其对应的文件的信息存放在SYSIBM.SYSTABLES这个系统编目表中,每个表对应一个FID(表所在的文件组编号)和TID(表所在的表空间编号),可以使用查询语句进行查询:

Select fid,tid, name from sysibm.systables where name='TEST';

数据库管理表空间(DMS,Database-Managed Space)

DMS表空间由数据库管理系统(DBMS)自己管理控制,本质上讲,这种类型的表空间是为了最大程度满足数据库管理器的需要而设计并实现的一种特定目的的文件系统。DMS表空间是由有限数量的容器所组成的,DMS表空间可以使用的容器有设备容器和文件容器,这些容器的空间都是预先分配的且不允许修改大小的,但是与SMS表空间不同的是,DMS表空间允许添加容器。也就是说,SMS表空间和DMS表空间分别通过扩大容器大小和增加容器数量的方式实现表空间大小的增加。DMS表空间创建时需要手动指定一个或多个容器。以文件为容器的表空间创建完以后就是一个单独的文件。使用DMS表空间的表的数据可以分开存储,即为常规数据,索引和大对象数据指定不同的DMS表空间。

DMS自动存储表空间(Automatic Storage DMS)

自动存储表空间不是真正意义上的独立类型的表空间。它是DMS存储的另外一种处理方法。DMS需要很多的维护操作,而自动存储器则是作为一种简化的空间管理手段,能够自动进行表空间的管理维护,它是DB2 V8.8.2中引入的概念,目前取代SMS成为默认的表空间类型。

三种表空间的对比

三种表空间在各方面的区别是非常多的,下表显示了一些主要的区别:

db2 表空间 缓冲池简介第 1 节:定义第 2 节:性能含义结束语参考文档DB2 9.7 中如何将数据库管理表空间转换为自动存储表空间深入理解DB2表空间(Tablespace) DB2利用表空间备份重建数据库

除了使用 SMS 表空间可以简化管理之外,SMS和DMS存储模型之间最显著的差异是表空间的最大大小。在使用 SMS 时,DBA 最多只能在表空间中放 64GB 的数据。将页面大小改为 32K,可以将这个限制扩大到 512GB,但代价是每个页面上的可用空间可能会更少。改为 DMS 模型会将表空间限制扩大到 2TB(4K 页面大小的情况下)。如果将页面大小改为 32K,可用空间可以增长到 16TB。尽管还有让表大小突破 64GB 限制的其他方法,但是最简单的方法可能是一开始就使用 DMS 表空间。(为什么会有这些限制后面介绍)

DMS与自动存储DMS

那么DMS和自动存储哪种方式更佳呢?自动存储允许 DBA 为数据库设置在创建所有表空间容器时可以使用的存储路径。DBA 不必显式地定义表空间的位置和大小,系统将自动地分配表空间。在 DB2 9 中,数据库在创建时将启用自动存储,除非 DBA 显式地覆盖这个设置。 

启用自动存储的数据库有一个或多个相关联的存储路径。表空间可以定义为 “由自动存储进行管理”,它的容器由 DB2 根据这些存储路径进行分配。数据库只能在创建时启用自动存储。对于在最初没有启用自动存储的数据库,不能在以后启用这个特性。同样,对于在最初启用了自动存储的数据库,也不能在以后禁用这个特性。 

下面的表总结了管理非自动存储和自动存储之间的一些差异。

db2 表空间 缓冲池简介第 1 节:定义第 2 节:性能含义结束语参考文档DB2 9.7 中如何将数据库管理表空间转换为自动存储表空间深入理解DB2表空间(Tablespace) DB2利用表空间备份重建数据库

引入自动存储模型的主要目的是简化 DMS 表空间的管理,同时保持其性能特征。有的时候 DBA 必须定义使用的表空间的所有特征,但是许多应用程序都会从自动存储提供的简化管理获益。

上述是按照管理方式的不同对数据库表空间类型进行了划分,事实上,根据用途的不同,表空间也可以划分为五种类型:

根据用途的不同,表空间也可以划分为五种类型

系统表空间(SYSCATSPACE)

系统表空间又称为系统编目表空间,DB2系统编目表是DB2数据库保存所有DB2对象元数据的地方,在Oracle数据库中,被称为数据字典。而系统编目表就存放在系统表空间中。系统表空间是数据库创建时自动创建的,且每个数据库必须有且仅有一个系统表空间,系统表空间被强制命名为SYSCATSPACE。系统表空间默认是SMS表空间,也可以显式指定为DMS表空间。

系统工具表空间(SYSTOOLSPACE)

系统工具表空间是供DB2管理工具和SQL管理例程使用的特定表空间,系统工具表空间不能被显式创建,只有第一次使用下面任一工具或过程时才会自动创建:ADMIN_COPY_SCHEMA 过程 ,ADMIN_DROP_SCHEMA 过程, 管理任务调度程序, 改变表笔记本, ALTOBJ 过程, 自动重组(包括 db.tb_reorg_req 运行状况指示器), 自动收集统计信息(包括 db.tb_runstats_req 运行状况指示器), 配置自动维护向导, db2look 命令, 设计顾问程序, GET_DBSIZE_INFO 过程, 存储管理工具,SYSINSTALLOBJECTS 过程。其中管理任务调度程序、ADMIN_COPY_SCHEMA 和 ADMIN_DROP_SCHEMA 过程的首次使用不会创建系统工具表空间,但是他们使用的是系统工具表空间。

用户表空间(USERSPACE)

用户表空间也是数据库创建时自动创建的,表空间名称为USERSPACE1,数据库中的用户表默认存放于这个表空间中,用户表空间是可选的,一个数据库可以有多个用户表空间。必须至少有一个用户表空间(没有用户表空间的话数据库无法存放用户数据)。用户表空间也可以是SMS表空间或DMS表空间,通常使用DMS表空间。

临时表空间(TEMPSPACE)

临时表空间也是数据库创建时自动创建的,数据库管理器使用临时表空间在执行SQL操作时存储临时数据,例如排序,表重组,索引创建以及表链接等操作所产生的中间表都由临时表空间存储,数据库必须至少有一个临时表空间,也可以有多个。创建数据库时默认创建的临时表空间名称为TEMPSPACE1,且为SMS表空间。但是这个表空间的名称可以是任意的,当另外的临时表空间被创建后,该默认临时表空间也可以被删除。(但必须保证数据库有一个临时表空间)。临时表空间也可以是DMS表空间。另外,DB2支持系统临时表空间和用户临时表空间两种类型,系统临时表空间必须存在,用户临时表空间可以有0个或多个,用来声明临时表。

除了根据管理和用途划分表空间类型,还可以根据容量将表空间划分为常规表空间和大型表空间。但是这里的常规表空间和大型表空间都是针对DMS表空间而言,SMS表空间大小上限还不及常规表空间。

行指针

首先考虑一个问题:逻辑上,数据以数据行(元组)的形式保存在数据库的表中,但物理上,根据数据库磁盘存储的知识(数据库深入学习笔记----磁盘存储内部结构),数据肯定是存储在数据文件上的,确切的说是存储在数据块(页)上。那么,数据库是如何根据表中的行寻址到物理磁盘上数据页中的数据呢?

Oracle和DB2的解决方案是使用一种新的数据结构:行指针(或行指示器),Oracle数据库中称为ROWID,DB2中称为RID。在实际的数据库表中,每张表都会附加一个特定的隐藏列,即行指针列,也就是说,每一行数据都有一个行指针属性,它指向该行数据在物理磁盘中的具体位置。实际上不管是Oracle还是DB2,行指针都是可以参与SQL查询的(毕竟是有效的行属性。Oracle中的ROWID可以直接当作属性进行查询,DB2中则需要使用rid函数查询RID)如下图是DB2数据库的RID格式:

db2 表空间 缓冲池简介第 1 节:定义第 2 节:性能含义结束语参考文档DB2 9.7 中如何将数据库管理表空间转换为自动存储表空间深入理解DB2表空间(Tablespace) DB2利用表空间备份重建数据库

根据容量将表空间划分

常规表空间

在DB2 V9之前,RID具有4个字节(32位)长度,其中3个字节用于数据页寻址,最后1个字节用于数据页内槽号寻址(《数据库深入学习笔记----磁盘存储内部结构》介绍过,每一行数据都是一条记录,存储在数据页的数据存储空间里,每一条记录都对应槽目录中的一个槽号)。

由RID的结构我们就可以计算出数据页能够容纳的记录数(行数)和表空间的容量了:

因为一个RID只有1个字节(8位)槽号,所以,一个数据页存储的记录数的最大值为255条(2的8次方-1,为什么要减1?这是因为磁盘存储那篇文章已经讲过,有的数据页是会有一个可用空间控制记录(FSCR)的,所以需要预留)。(说明:8位能寻址的范围就是0-255,槽号编号就只能是0-255,如果记录再多,就无法被槽目录编号了,无法被寻址,数据存了也是白存。)

同理,可以根据3个字节的页号,得出一个表空间最多能容纳16777216(16M,2的24次)个数据页。那么,如果是一个数据页4KB的话,表空间大小就是16M*4KB=64GB了。如果一个数据页32KB的话,就是16M*32KB=512GB。(DB2表空间支持的页面大小有4KB,8KB,16KB和32KB四种,一个表空间只能使用一种大小的数据页)

可以想象,如果数据库表中的行长度(一行所占用的存储空间)太小,由于一个数据页理论上最多只能存储255行(实际上,每一页允许存储的记录数通常少于255条),那必然造成数据页空间的浪费,比如4KB页,长度为12B的行存满页面也只占用12B*255=3060B的空间,剩下的1036KB多的空间只能浪费。下表显示了页面空间被浪费前的最小行长度:

db2 表空间 缓冲池简介第 1 节:定义第 2 节:性能含义结束语参考文档DB2 9.7 中如何将数据库管理表空间转换为自动存储表空间深入理解DB2表空间(Tablespace) DB2利用表空间备份重建数据库

一旦表空间中满足了最大页限制,有以下三种方案可供选择:

1.在视图中把这些表连接起来(多个表空间中的表在视图中合在一起);

2.使用DB2的数据库分区功能(DPF,Database Partitioning Feature),横跨多个分区将数据进行组合;

3.使用范围分区表。

无论哪种方案都需要将一些数据进行迁移并可能对应用程序进行修改,这无疑是很繁琐的。

大型表空间

为了能够让数据页中容纳更多的行(记录)以及表空间中容纳更多的数据页,DB2 V9引入了一种新的行指针(RID,行指示器)格式。数据页标记由3个字节增加到4个字节,槽位由1个字节增加到2个字节,这种6字节的RID格式最终将表空间大小上限扩充到原来的32倍。即4KB页的表空间最大容量为2TB,32KB页的表空间最大容量为16TB。同时,每个数据页所能容纳的行数理论上也扩大为65000多行,但由于规定每一行的最小长度为12B左右,所以,实际上4KB页能容纳的最大行数为4KB/12KB=341行左右,32KB页则是2300行左右。

下表是4种页实际用于存储数据的空间大小和实际允许存放的行数:

db2 表空间 缓冲池简介第 1 节:定义第 2 节:性能含义结束语参考文档DB2 9.7 中如何将数据库管理表空间转换为自动存储表空间深入理解DB2表空间(Tablespace) DB2利用表空间备份重建数据库

这种RID格式很好的解决了表空间大小受限以及数据页空间浪费(不再受制于槽号,而是行长度)的问题。但同时也带来了管理上的挑战,比如备份和恢复。事实上,当表开始增长到TB级的时候,就应该考虑使用一些诸如表分区,数据库分区等技术来进行大型数据量的管理了。

使用旧的4字节RID格式的表空间就是常规表空间,使用新的6字节RID格式的表空间就是大型表空间了。DB2 V9中大型表空间是DMS表空间的默认类型,当然也可以显式的创建常规表空间(指明表空间为REGULAR)。很显然,SMS表空间是不可能支持大型表空间的。

支持6字节RID格式的表空间包括:系统临时表空间,用户临时表空间,用户常规表空间。也就是说,只有系统表空间是不能创建为大型表空间的。因为目前的编目表不足以达到能够及时保证较大的表空间大小的状态。

大型表空间在DB2 V9之前叫长型表空间,用于存储长型或 LOB 表列,以弥补常规表空间在处理长型或LOB数据上的不足。

常规表空间向大型表空间的迁移

DB2 V9不会自动将常规表空间升级为大型表空间,但是可以手动升级:ALTER TABLESPACE tablespacename CONVERT TO LARGE。

ALTER命令不会物理地改变表空间的结构,只是改变了编目方式以指示表空间可以支持6字节的RID格式。要注意的是:

1.执行LARGE升级后需要立即COMMIT WORK,进行事务提交,否则表空间上会持有排它锁,同时在该表空间中对表所做的其他工作不会继续执行,直到该锁解除为止。

2.一旦表空间被修改为LARGE,为了更好的利用6字节RID的优势,还需要继续数据重组和索引重组。如果不进行索引重组,那么先前存在的表将延续每页255行以及3字节数量的限制,因为索引使用的仍是旧的RID,无法索引到超出原范围的页。而数据重组(表重组)与索引重组的影响不同,索引重组影响表空间中页的数量,表重组影响的是页中存放的行数。

http://blog.csdn.net/idber/article/details/8092919

--------------------------http://www.itpub.net/thread-1361575-1-1.html DB2 存储: 表空间

表空间是数据库及存储在该数据库中的表之间的逻辑层。表空间在数据库中创建,表在表空间中创建……

表空间按管理方式分:

操作系统管理(SMS),或者由数据库管理(DMS),自动存储表空间

(System Management Space,SMS)(Database Management Space,DMS)。

按类型分为:

规则表空间、大对象表空间、系统临时表空间、用户临时表空间。规则表空间中包含用户数据的表。默认用户表空间名为USERSPACE1,索引也存储在规则表空间中,另外系统目录表也放在规则表空间中。默认的系统目录表空间名为SYSCATSPACE。

临时表空间分为系统临时表空间和用户临时表空间。

系统临时表空间用来存储各种数据操作(排序、重组表、创建索引、连接表)中所需的内部临时数据,虽然可以创建任意多个系统临时表空间,但建议用户只使用大多数表所使用的页大小创建一个,默认系统临时表空间名为TEMPSPACE1。

用户临时表空间用来存储已说明全局临时表(已说明全局临时表存储的是应用程序临时数据)。用户临时表空间不是在数据库创建时默认创建的。

SMS每个容器是操作系统的文件空间中的一个目录;DMS每个容器是一个固定的、预分配的文件,或是物理设备。

SMS的管理比较简单,由操作系统自动管理,空间的大小随数据量的变化系统自动调整。

DMS是由数据库管理的,空间大小在创建时确定,空间不够时要手工添加或删除部分数据以释放空间。

大多数情况下,DMS的性能比SMS好。

1、系统管理空间(SMS)

数据存放在文件系统的文件中

使用操作系统的标准I/O函数来访问数据

除非需要,否则空间不会被额外分配

适用于小型,个人数据库以及存储空间变化频繁的数据库

对维护和监控要求较低

[ibmdb2]/root #chown -R db2inst2:db2grp2 /db2data

[ibmdb2]/root #chmod -R 775 /db2data

[ibmdb2]/root #

---例一:创建一个SMS表空间:su - db2inst2

unix: 

CREATE TABLESPACE tbs1 MANAGED BY SYSTEM USING ('/db2data/tbs1')

windows:

CREATE TABLESPACE RESOURCE MANAGED BY SYSTEM USING ('d:\acc_tbsp','e:\acc_tbsp','f:\acc_tbsp')

完成的结果为在D、E、F三个磁盘上创建了三个名称为acc_tbsp的文件夹,每个文件夹下面都有一个名为SQLTAG.NAM的文件。

db2 => CREATE TABLESPACE tbs1 MANAGED BY SYSTEM USING ('/db2data/tbs1')

DB20000I  The SQL command completed successfully.

./tbs1:

total 4

4 -rw------- 1 db2inst2 db2grp2 512 Oct 19 04:26 SQLTAG.NAM----例二:删除例一所创建的SMS表空间

db2 => drop tablespace tbs1

DB20000I  The SQL command completed successfully.

运行完这条命令,相应的表空间会从DB2注册表中删除,但是磁盘上的三个文件夹仍然存在,需要手工删除。

2、数据库管理空间(DMS)数据存储在文件或者Raw设备中

能够绕过操作系统的I/O函数从而增加性能

适用于对数据库性能要求比较高的应用程序

需要较频繁的维护和监控

用命令行方式创建DMS表空间的简单语法:

  CREATE TABLESPACE ; 

  MANAGED BY DATABASE USING (FILE ' ;' 

  或者

  CREATE TABLESPACE ; 

  MANAGED BY DATABASE USING (DEVICE ' ;' 当容器空间不足时,可以通过设置参数来自动增加容器空间

CREATE TABLESPACE tbsp2

PAGESIZE 8K

MANAGED BY DATABASE

USING (FILE ' /storage/dms1' 10 M) AUTORESIZE YES

----例三:在Windows上创建一个DMS表空间,使用各自有500页的两个文件容器:

CREATE TABLESPACE TBS MANAGED BY DATABASE USING (FILE '/db2data/tbs_01' 500, FILE '/db2data/tbs_02' 500)运行结果为:在D、E磁盘的db2data文件夹下面各创建了一个名为acc_tbsp的文件,大小都为2000K(默认情况下每页大小为4K)。

db2 => create tablespace tbs managed by database using (file '/db2data/tbs_01' 500, file '/db2data/tbs_02' 500)

DB20000I  The SQL command completed successfully.

[[email protected] db2data]$ ls -lsa

total 4036

   4 drwxrwxr-x  3 db2inst2 db2grp2    4096 Oct 19 04:39 .

   8 drwxr-xr-x 27 root     root       4096 Oct 18 15:45 ..

  16 drwxrwxr-x  2 db2inst2 db2grp2   16384 Aug 29 14:02 lost+found

2004 -rw-------  1 db2inst2 db2grp2 2048000 Oct 19 04:39 tbs_012004 -rw-------  1 db2inst2 db2grp2 2048000 Oct 19 04:39 tbs_02

----例四:在例三所创建的表空间中添加一个容器:alter tablespace tbs add(file '/db2data/tbs_03' 500)

db2 => alter tablespace tbs add(file '/db2data/tbs_03' 500)

DB20000I  The SQL command completed successfully.

[[email protected] db2data]$ ls -ls

total 6028

  16 drwxrwxr-x 2 db2inst2 db2grp2   16384 Aug 29 14:02 lost+found

2004 -rw------- 1 db2inst2 db2grp2 2048000 Oct 19 04:39 tbs_01

2004 -rw------- 1 db2inst2 db2grp2 2048000 Oct 19 04:40 tbs_02

2004 -rw------- 1 db2inst2 db2grp2 2048000 Oct 19 04:40 tbs_03

----例五:用RESIZE子句更改例三所创建的表空间的容器的大小:

每个容器(文件)的大小变为550页。把容器的容量变大不会出错,但是如果容器中的数据已经充满,再把容器的容量缩小,则会引起错误。

alter tablespace tbs resize (file '/db2data/tbs_01' 550, file '/db2data/tbs_02' 550, file '/db2data/tbs_03' 550)db2 => alter tablespace tbs resize (file '/db2data/tbs_01' 550, file '/db2data/tbs_02' 550, file '/db2data/tbs_03' 550)

DB20000I  The SQL command completed successfully.

[[email protected] db2data]$ ls -lsk

total 6628

  16 drwxrwxr-x 2 db2inst2 db2grp2   16 Aug 29 14:02 lost+found

2204 -rw------- 1 db2inst2 db2grp2 2200 Oct 19 04:47 tbs_01

2204 -rw------- 1 db2inst2 db2grp2 2200 Oct 19 04:47 tbs_02

2204 -rw------- 1 db2inst2 db2grp2 2200 Oct 19 04:47 tbs_03

----例六:用EXTEND子句更改例三所创建的表空间的容器的大小:

该命令的运行结果为在原有容量的基础之上,每个容器再增加50页。

alter tablespace tbs extend (file '/db2data/tbs_01' 50, file '/db2data/tbs_02' 50, file '/db2data/tbs_03' 50) db2 => alter tablespace tbs extend (file '/db2data/tbs_01' 50, file '/db2data/tbs_02' 50, file '/db2data/tbs_03' 50)

DB20000I  The SQL command completed successfully.

[[email protected] db2data]$ ls -lsk

total 7228

  16 drwxrwxr-x 2 db2inst2 db2grp2   16 Aug 29 14:02 lost+found

2404 -rw------- 1 db2inst2 db2grp2 2400 Oct 19 04:50 tbs_01

2404 -rw------- 1 db2inst2 db2grp2 2400 Oct 19 04:50 tbs_02

2404 -rw------- 1 db2inst2 db2grp2 2400 Oct 19 04:50 tbs_03

[/color]----例七:删除例三中创建的DMS表空间:

运行的结果为在DB2的注册表中把TBS表空间删除,同时在磁盘上把相对应的文件夹和文件都一起自动删除。

drop tablespace tbsdb2 => drop tablespace tbs

DB20000I  The SQL command completed successfully.

[[email protected] db2data]$ ls -ls

total 16

16 drwxrwxr-x 2 db2inst2 db2grp2 16384 Aug 29 14:02 lost+found

[[email protected] db2data]$ pwd

/db2data

-----例八:在UNIX上创建一个DMS表空间,使用500页的1个逻辑卷:

chown db2inst2:db2grp2 /dev/sde1

create tablespace tbs managed by database using (device '/dev/sde1' 500)

db2 => create tablespace tbs managed by database using (device '/dev/sde1' 500)

DB20000I  The SQL command completed successfully.  上面语句中提到的UNIX设备必须已经存在,且实例拥有者和SYSADM组必须能够写入它们。

  特性                            SMS DMS

  能够在表空间中动态增加容器的数目吗 N Y

  能够把索引数据存放到不同表空间的表中吗 N Y

  能够把大对象数据存放到不同表空间的表中吗 N Y

  表可以分散存放到多个表空间中吗 N Y

  仅在需要时才分配空间吗 Y N

  表空间可以被放在不同的磁盘中吗 Y N

  创建之后,区段大小能够改变吗 N N

---例九:创建系统临时表空间:系统临时表只能存储在系统临时表空间中,所以数据库必须始终至少有一个系统临时表空间。

create system temporary tablespace temp managed by system using ('/db2data/temp')

db2 => create system temporary tablespace temp managed by system using ('/db2data/temp')

DB20000I  The SQL command completed successfully.

----例十:创建用户临时表空间:用户临时表空间用于存储已说明的临时表(用 DECLARE GLOBAL TEMPORARY TABLE 语句定义)

create user temporary tablespace usertemp managed by database using (file '/db2data/usertemp' 500)

db2 => create user temporary tablespace usertemp managed by database using (file '/db2data/usertemp' 500)

DB20000I  The SQL command completed successfully.

----例十一:用RENAME语句给表空间重命名:

用该语句给表空间重命名之后,将自动更改所有引用该表空间的目录记录,所以无须关心该表空间中的个别对象

rename tablespace tbs to tbs1

db2 => rename tablespace tbs to tbs1

DB20000I  The SQL command completed successfully.

-----在此处,如果重命名temp表空间,应该咋弄呢?

rename tablespace usertemp to user_temp

db2 => rename tablespace usertemp to user_temp

DB20000I  The SQL command completed successfully.

rename tablespace temp to sys_temp ---好像如果是系统临时表空间,刚这样操作报错,大家看看应该如何操作?

db2 => rename tablespace temp to sys_temp

DB21034E  The command was processed as an SQL statement because it was not a 

valid Command Line Processor command.  During SQL processing it returned:

SQL0707N  The name "SYS_TEMP" cannot be used because the specified identifier 

is reserved for system use.  SQLSTATE=42939----例十二:在RESOURCE表空间中创建一张名为T1的表:

CREATE TABLE T1(ABC INT) IN tbs1

db2 => CREATE TABLE T1(ABC INT) IN tbs1

DB20000I  The SQL command completed successfully.

3、自动存储表空间数据库允许使用自动存储时

数据库管理器能够自动分配容器(物理存储地址)

自动调整表空间的大小

对普通/大型表空间来使用数据库管理

对用户或系统临时表空间使用系统管理

CREATE DATABASE mydb AUTOMATIC STORAGE YES

CONNECT TO mydb

CREATE TABLESPACE tbsp1 MANAGED BY AUTOMATIC STORA

----------------------db2表空间经验整理

http://blog.csdn.net/zero_plus/article/details/6065787

------------------------表空间使用案例一  

DB2利用表空间备份重建数据库

http://blog.csdn.net/xcl168/article/details/17383401

----------------------------

继续阅读