ALTER DATABASE PARTITION GROUP 语句
使用 ALTER DATABASE PARTITION GROUP 语句可将一个或多个数据库分区添加到数据分区组中,也可以从数据库分区组删除一个或多个数据库分区。
调用
此语句可嵌入应用程序中或者以交互方式发出。 它是一个可执行语句,仅当 DYNAMICRULES 运行行为对于程序包有效时才能动态编译 (SQLSTATE 42509)。
授权
语句的授权标识必须具有 SYSCTRL 或 SYSADM 权限。
语法
描述
- db-partition-name
- 为数据库分区组命名。 这是一部分名称。 它是普通或定界 SQL 标识。 它必须是目录中描述的数据库分区组。 您不能指定 IBMCATGROUP 与 IBMTEMPGROUP(SQLSTATE 42832)。
- ADD DBPARTITIONNUM
- 指定要添加至数据库分区组的特定数据库分区。 DBPARTITIONNUMS 是 DBPARTITIONNUM 的同义词。 在数据库分区组中,任何指定的数据库分区均必须尚未被定义(SQLSTATE 42728)。
- DROP DBPARTITIONNUM
- 指定要从数据库分区组中删除的特定数据库分区。 DBPARTITIONNUMS 是 DBPARTITIONNUM 的同义词。 在数据库分区组中必须已定义所有指定的数据库分区(SQLSTATE 42729)。 db-partitions-子句
- 指定要添加或删除的数据库分区。
- db-partition-number1
- 指定特定的数据库分区号。
- 目标 db-partition-number2
- 指定数据库分区号的范围。 db-partition-number2 的值必须大于或等于 db-partition-number1 的值(SQLSTATE 428A9)。
db-partition-options - LIKE DBPARTITIONNUM 数据库分区号
- 指定数据库分区组中现有表空间的容器将与指定的 db-partition-number 上的容器相同。 指定的数据库分区必须是在此语句之前就存在于数据库分区组中且未包括在同一语句的 DROP
DBPARTITIONNUM 子句中的分区。
对于定义为使用自动存储器的表空间,即使用 CREATE TABLESPACE 语句的 MANAGED BY AUTOMATIC STORAGE 子句创建的表空间,或根本未为其指定 MANAGED BY 子句的表空间,容器将不必与来自指定分区的容器相匹配。 数据库管理器将根据与数据库相关联的存储路径来自动指定容器,这可能会也可能不会导致使用同一个容器。 每个表空间的大小基于创建表空间时指定的初始大小,它可能与指定分区上的表空间的当前大小不匹配。
- WITHOUT TABLESPACES
- 指定不会在新添加的一个或多个数据库分区上创建数据库分区组中现有表空间的容器。 必须使用使用 db-partitions-子句 或 MANAGED BY AUTOMATIC STORAGE 子句的 ALTER TABLESPACE 语句来定义用于此数据库分区组上定义的表空间的容器。 如果未指定此选项,那么在新添加的数据库分区上为在数据库分区组上定义的每个表空间指定缺省容器。
对于已定义为使用自动存储器的表空间,即使用 CREATE TABLESPACE 语句的 MANAGED BY AUTOMATIC STORAGE 子句创建的表空间,或根本未为其指定 MANAGED BY 子句的表空间,将忽略此选项。 没有办法来推迟为这些表空间创建容器。 数据库管理器将根据与数据库相关联的存储路径来自动指定容器。 每个表空间的大小将基于创建表空间时指定的初始大小。
规则
- 必须在
db2nodes.cfg文件中定义由编号指定的每个数据库分区(SQLSTATE 42729)。 - db-partitions-clause 中列出的每个 db-partition-number 必须用于唯一的数据库分区 (SQLSTATE 42728)。
- 有效的数据库分区号介于 0 和 999 之间(其中包括 0 和 999)(SQLSTATE 42729)。
- 数据库分区不能出现在 ADD 和 DROP 子句中(SQLSTATE 42728)。
- 数据库分区组中必须至少保留一个数据库分区。 您不能从数据库分区组中删除最后一个数据库分区(SQLSTATE 428C0)。
- 如果在添加数据库分区时未指定 LIKE DBPARTITIONNUM 子句或 WITHOUT TABLESPACES 子句,那么缺省情况下将使用数据库分区组中现有数据库分区的最小数据库分区号(例如 2),然后继续进行操作,就好像已指定了 LIKE DBPARTITIONNUM 2 一样。 对于要用作缺省值的现有数据库分区,它必须具有为数据库分区组中的所有表空间定义的容器(SYSCAT.DBPARTITIONGROUPDEF 的列 IN_USE 不是“T”)。
- 如果“添加数据库分区服务器”请求暂挂或正在进行,那么 ALTER DATABASE PARTITION GROUP 语句可能失败(SQLSTATE 55071)。 如果新数据库分区服务器是以联机方式添加至实例,并且并非所有应用程序都知道该新数据库分区服务器,那么此语句也可能失败(SQLSTATE 55077)。
注意
- 当数据库分区被添加至数据库分区组时,将为数据库分区建立目录条目(请参阅 SYSCAT.DBPARTITIONGROUPDEF)。 分发映射会立即更改为包括新的数据库分区,同时出现指示器(IN_USE),表明在下列情况下数据库分区位于分发映射中:
- 数据库分区组中未定义表空间,或者
- 数据库分区组中定义的表空间中未定义表,并且未指定 WITHOUT TABLESPACES 子句。
分发映射未更改,指示器(IN_USE)已设置为指示在下列任何一种情况下分发映射中未包括数据库分区:- 表存在于数据库分区组中的表空间中,或者
- 表空间存在于数据库分区组中,并且 WITHOUT TABLESPACES 子句已被指定(除非所有表空间已定义为使用自动存储器,在此情况下,将忽略 WITHOUT TABLESPACES 子句)
要更改分发映射,必须使用 REDISTRIBUTE DATABASE PARTITION GROUP 命令。 这将重新分发数据、更改分发映射和更改指示器。 如果指定了 WITHOUT TABLESPACES 子句,那么在试图重新分发数据之前,需要添加表空间容器。
- 当从数据库分区组中删除数据库分区时,将会更新该数据库分区的目录条目(请参阅 SYSCAT.DBPARTITIONGROUPDEF)。 如果在数据库分区组中定义的表空间中未定义表,那么分发映射将立即更改为排除已删除的数据库分区,并且会删除该数据库分区组中数据库分区的条目。 如果表存在,那么不会更改分发映射,并且指示器(IN_USE)被设置为指示数据库分区正在等待被删除。 REDISTRIBUTE DATABASE PARTITION GROUP 命令必须用于重新分发数据,并且从数据库分区组中删除数据库分区的条目。
- 语法替代方法: 为了与先前版本的 Db2® 和其他数据库产品兼容,支持以下语法替代方法。 这些备用项是非标准的,不应使用。
- 可指定 NODE 来代替 DBPARTITIONNUM
- 可指定 NODES 来代替 DBPARTITIONNUMS
- 可指定 NODEGROUP 来代替 DATABASE PARTITION GROUP
示例
假定您有一个具有以下数据库分区的六分区数据库: 0 , 1 , 2 , 5 , 7 和 8。 将两个数据库分区 (3 和 6) 添加到系统。
- 示例 1: 假定要将数据库分区 3 和 6 添加到名为 MAXGROUP 的数据库分区组,并具有表空间容器 (例如数据库分区 2 上的表空间容器)。 该语句如下所示:
ALTER DATABASE PARTITION GROUP MAXGROUP ADD DBPARTITIONNUMS (3,6)LIKE DBPARTITIONNUM 2 - 示例 2:假设您想要删除数据库分区 1,并且要将数据库分区 6 添加至数据库分区组 MEDGROUP。 您将使用 ALTER TABLESPACE 为数据库分区 6 单独定义表空间容器。 该语句如下所示:
ALTER DATABASE PARTITION GROUP MEDGROUP ADD DBPARTITIONNUM(6)WITHOUT TABLESPACES DROP DBPARTITIONNUM(1)
