DB2 V9.7 for Linux, UNIX, and Windows

创建表空间

在一个数据库内创建表空间,会将容器分配到表空间,并在数据库系统目录中记录它的定义和属性。

关于此任务

对于自动存储器表空间,数据库管理器将根据与数据库关联的存储器路径将容器指定给表空间。

对于非自动存储器表空间而言,在创建表空间时,您必须知道将要使用的容器的路径名、设备名或文件名。另外,对于您为 DMS 表空间创建的每个设备容器或文件容器,您还必须知道可以为每个容器分配的存储器空间量。

过程

示例

示例 1:在 Windows 上创建 SMS 表空间。以下 SQL 语句将创建名为 RESOURCE 的 SMS 表空间,这个表空间使用三个不同驱动器上的三个不同目录中的容器:
CREATE TABLESPACE RESOURCE
      MANAGED BY SYSTEM
      USING ('d:\acc_tbsp', 'e:\acc_tbsp', 'f:\acc_tbsp')
示例 2:在 Windows 上创建 DMS 表空间。以下 SQL 语句将创建一个 DMS 表空间,这个表空间有两个文件容器,每个容器的大小均为 5000 页:
CREATE TABLESPACE RESOURCE
      MANAGED BY DATABASE
      USING (FILE'd:\db2data\acc_tbsp' 5000,
             FILE'e:\db2data\acc_tbsp' 5000)

在前面两个示例中,为容器提供了显式的名称。但是,如果指定相对容器名,那么将在为该数据库创建的子目录中创建容器。

在创建表空间容器时,数据库管理器会创建任何不存在的目录级别。例如,如果将容器指定为 /project/user_data/container1,而目录 /project 不存在,那么数据库管理器会创建目录 /project/project/user_data

数据库管理器创建的任何目录都是使用 PERMISSION 711 创建的。对于受防护进程访问,PERMISSION 711 是必需的。这意味着实例所有者拥有读写访问权和执行访问权,且其他人拥有执行访问权。任何具有执行访问权的用户还拥有遍历表空间容器目录的权限。 因为只有实例所有者具有读写访问权,所以在创建多个实例时,可能会出现下列方案:
  • 使用与上面描述的相同的目录结构,假定目录级别 /project/user_data 不存在。
  • user1 创建一个实例(缺省情况下命名为 user1),接着创建一个数据库,然后创建一个表空间,且 /project/user_data/container1 作为该表空间的一个容器。
  • user2 创建一个实例(缺省情况下命名为 user2),接着创建一个数据库,然后尝试创建一个表空间,且 /project/user_data/container2 作为该表空间的一个容器。

因为数据库管理器根据第一个请求使用 PERMISSION 700 创建了目录级别 /project/user_data,所以 user2 没有对这些目录级别的访问权,因此不能在这些目录中创建 container2。在此情况下,CREATE TABLESPACE 操作将失败。

解决此冲突有两种方法:
  1. 在创建表空间之前创建目录 /project/user_data,并将许可权设置为 user1 和 user2 创建表空间所需的任何访问权。如果所有级别的表空间目录都存在,那么数据库管理器不会修改访问权。
  2. 在 user1 创建 /project/user_data/container1 之后,将 /project/user_data 的许可权设置为 user2 创建表空间所需的任何访问权。

如果数据库管理器创建了一个子目录,那么在删除该表空间时数据库管理器也可能将该子目录删除。

在此方案中,假定这些表空间与特定的数据库分区组无关。如果未在该语句中指定下列参数,将使用缺省数据库分区组 IBMDEFAULTGROUP:
IN database_partition_group_name
示例 3:在 AIX® 上创建 DMS 表空间。通过使用各有 10000 页的三个逻辑卷,下列 SQL 语句在 AIX 系统上创建了一个 DMS 表空间,并指定它们的 I/O 特征:
CREATE TABLESPACE RESOURCE
      MANAGED BY DATABASE
      USING (DEVICE '/dev/rdblv6' 10000,
             DEVICE '/dev/rdblv7' 10000,
             DEVICE '/dev/rdblv8' 10000)
      OVERHEAD 7.5
      TRANSFERRATE 0.06

在此 SQL 语句中提到的 UNIX 设备必须已经存在,且实例所有者和 SYSADM 组必须能够写入这些设备。

示例 4:在 UNIX 系统上创建 DMS 表空间。以下示例将在 UNIX 多分区数据库中称为 ODDGROUP 的数据库分区组上创建一个 DMS 表空间。ODDGROUP 必须是先前使用 CREATE DATABASE PARTITION GROUP 语句创建的。在本示例中,假定 ODDGROUP 数据库分区组由编号为 1、3 和 5 的数据库分区组成。在所有数据库分区上都使用具有 10000 个 4 KB 页的 /dev/hdisk0 设备。另外,还为每个数据库分区声明了包含 40000 个 4 KB 页的设备。
CREATE TABLESPACE PLANS IN ODDGROUP
       MANAGED BY DATABASE
       USING (DEVICE '/dev/HDISK0' 10000, DEVICE '/dev/n1hd01' 40000)
             ON DBPARTITIONNUM 1
            (DEVICE '/dev/HDISK0' 10000, DEVICE '/dev/n3hd03' 40000)
             ON DBPARTITIONNUM 3
            (DEVICE '/dev/HDISK0' 10000, DEVICE '/dev/n5hd05' 40000)
             ON DBPARTITIONNUM 5

通过使用顺序预取工具(它使用并行 I/O),数据库管理器可以极大地提高顺序 I/O 的性能。

示例 5:创建页大小大于缺省值的 SMS 表空间。您还可以创建一个表空间,它使用的页大小比缺省的 4 KB 大小更大。下列 SQL 语句在 Linux 和 UNIX 系统上创建一个具有 8 KB 页大小的 SMS 表空间。
CREATE TABLESPACE SMS8K
      PAGESIZE 8192
      MANAGED BY SYSTEM
      USING ('FSMS_8K_1')
      BUFFERPOOL BUFFPOOL8K
注意相关联的缓冲池也必须具有相同的 8 KB 页大小。

只有在激活了创建的表空间所引用的缓冲池之后才能使用该表空间。

可以使用 ALTER TABLESPACE 语句对 DMS 表空间添加、删除容器或调整容器的大小,并修改表空间的 PREFETCHSIZE、OVERHEAD 和 TRANSFERRATE 设置。在执行 ALTER TABLESPACE SQL 语句之后应尽快落实发出表空间语句的事务,以防止发生系统目录争用。

注: PREFETCHSIZE 值应该是 EXTENTSIZE 值的倍数。例如,如果 EXTENTSIZE 是 10,那么 PREFETCHSIZE 应为 20 或 30。还应该考虑通过将 PREFETCHSIZE 设置为 AUTOMATIC 来让数据库管理器自动确定预取大小。

直接 I/O(DIO)由于可以绕过在文件系统级别进行高速缓存,从而改进内存性能。此过程可减少 CPU 开销并使得更多的内存可用于数据库实例。

并行 I/O(CIO)具有 DIO 的优点,并且还可以消除串行化写访问权。

DIO 和 CIO 在 AIX 上受支持;DIO 在 HP-UX、Solaris、Linux 和 Windows 操作系统上受支持。

关键字 NO FILE SYSTEM CACHING 和 FILE SYSTEM CACHING 是 CREATE 和 ALTER TABLESPACE SQL 语句的一部分,允许您指定将对每个表空间使用 DIO 还是 CIO。当 NO FILE SYSTEM CACHING 有效时,只要可能,数据库管理器都会尝试使用“并行 I/O”(CIO)。在不支持 CIO 的情况下(例如,当使用了 JFS 时),将取而使用 DIO。

发出 CREATE TABLESPACE 语句时,缺省情况下将打开已删除的表的恢复功能。此功能使您可使用表空间级的复原和前滚操作来恢复已删除的表数据。这样可比数据库级的恢复要快,且您的数据库将对用户保持可用。

但是,如果有许多删除表操作要恢复或者如果历史记录文件很大,那么正向恢复时已删除的表的恢复功能可能会影响性能。

如果您打算运行许多删除表操作,并且使用循环日志记录或您不想恢复任何已删除的表,那么可能想要禁用此功能。要禁用此功能,可以在发出 CREATE TABLESPACE 语句时显式将 DROPPED TABLE RECOVERY 选项设置为 OFF。此外,可以通过使用 ALTER TABLESPACE 语句关闭现有表空间的已删除的表的恢复功能。