创建表空间

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

关于本任务

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

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

如果要指定 PREFETCHSIZE,那么使用的值必须是 EXTENTSIZE 值的倍数。 例如,如果 EXTENTSIZE 是 10,那么 PREFETCHSIZE 应为 20 或 30。 应该通过指定 AUTOMATIC 作为值,让数据库管理器自动确定预取大小。

将关键字 NO FILE SYSTEM CACHING 和 FILE SYSTEM CACHING 用作 CREATE TABLESPACE 语句的一部分来指定数据库管理器是使用直接 I/O (DIO) 还是使用并行 I/O (CIO) 来访问表空间。 如果指定 NO FILE SYSTEM CACHING,那么只要可能,数据库管理器就会尝试使用 CIO。 在不支持 CIO 的情况下(例如,如果使用的是 JFS),数据库管理器会改用 DIO。

发出 CREATE TABLESPACE 语句时,缺省情况下将打开已删除的表的恢复功能。 此功能使您可使用表空间级的复原和前滚操作来恢复已删除的表数据。 这样可比数据库级的恢复要快,且您的数据库将对用户保持可用。 但是,如果有许多删除表操作要恢复或者如果历史记录文件很大,那么正向恢复时已删除的表的恢复功能可能会影响性能。

如果计划删除许多表并且使用循环日志记录或者不想恢复任何已删除的表,请在发出 CREATE TABLESPACE 语句时通过将 DROPPED TABLE RECOVERY 选项显式设置为 OFF 来禁用已删除的表的恢复功能。 此外,也可以在创建表空间之后使用 ALTER TABLESPACE 语句来关闭已删除的表的恢复功能。

过程

  • 要使用命令行来创建自动存储器表空间,请输入下列任一语句:
    CREATE TABLESPACE name
    
    CREATE TABLESPACE name
          MANAGED BY AUTOMATIC STORAGE

    假定在自动存储器数据库中创建表空间,以上两条语句是等同的;缺省情况下,除非您另有指定,否则在此类数据库中创建的表空间将是自动存储器表空间。

  • 要使用命令行来创建 SMS 表空间,请输入:
    CREATE TABLESPACE name
          MANAGED BY SYSTEM
          USING ('path')
    重要信息: 对于用户定义的永久表空间,不推荐使用 SMS 表空间类型,在将来的发行版中可能会将其除去。 尚未不推荐将 SMS 表空间类型用于目录表空间和临时表空间。 欲了解更多信息,请参阅 SMS永久表空间已弃用
  • 要使用命令行来创建 DMS 表空间,请输入:
    CREATE TABLESPACE name
          MANAGED BY DATABASE
          USING (FILE 'path' size)
    注意,在缺省情况下,会将 DMS 表空间创建为大型表空间。

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

    重要信息: 对于用户定义的永久表空间,不推荐使用 DMS 表空间类型,在将来的发行版中可能会将其除去。 尚未不推荐将 DMS 表空间类型用于目录表空间和临时表空间。 更多信息,请参阅 DMS 永久表空间已弃用

示例

示例 1: 在 Windows 上创建自动存储器表空间。
以下 SQL 语句在称为 STOGROUP1 的存储器组中创建称为 RESOURCE 的自动存储器表空间:
CREATE TABLESPACE RESOURCE
      MANAGED BY AUTOMATIC STORAGE
      USING STOGROUP STOGROUP1
示例 2: 在 Windows 上创建 SMS 表空间。
以下 SQL 语句将创建名为 RESOURCE 的 SMS 表空间,这个表空间使用三个不同驱动器上的三个不同目录中的容器:
CREATE TABLESPACE RESOURCE
      MANAGED BY SYSTEM
      USING ('d:\acc_tbsp', 'e:\acc_tbsp', 'f:\acc_tbsp')
示例 3: 在 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
示例 4: 在 AIX®上创建 DMS 表空间。
以下 SQL 语句使用每个 10 000 页的三个逻辑卷在 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 组必须能够写入这些设备。

示例 5: 在 UNIX 系统上创建 DMS 表空间。
以下示例在 UNIX 多分区数据库中名为 ODDGROUP 的数据库分区组上创建 DMS 表空间。 ODDGROUP 必须是先前使用 CREATE DATABASE PARTITION GROUP 语句创建的。 在这种情况下,假定 ODDGROUP 数据库分区组由编号为 1 , 3 和 5 的数据库分区组成。 在所有数据库分区上,使用设备 /dev/hdisk0 for 10000 4 KB 页面。 另外,还为每个数据库分区声明了包含 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 的性能。

示例 6:创建页大小大于缺省值的 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 页大小。

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