PolarDB-X 2.0支持变更拆分表的拆分规则,包括变更拆分函数和拆分列。本文介绍如何变更拆分表的拆分规则。

前提条件

PolarDB-X 2.0内核小版本需为5.4.8或以上。

使用限制

暂不支持变更带有GSI的拆分表的拆分规则。

语法

alter table tbl_name drds_partition_options

上述语句中的drds_partition_options可以是如下分库或分表子句:

drds_partition_options:
    DBPARTITION BY db_partition_algorithm
    [TBPARTITION BY table_partition_algorithm [TBPARTITIONS num]]

其中:

  • db_partition_algorithm支持如下函数:
    db_partition_algorithm:
        HASH([col_name])
      | {YYYYMM|YYYYWEEK|YYYYDD|YYYYMM_OPT|YYYYWEEK_OPT|YYYYDD_OPT}(col_name)
      | UNI_HASH(col_name)
      | RIGHT_SHIFT(col_name, n)
      | RANGE_HASH(col_name, col_name, n)
  • table_partition_algorithm支持如下函数:
    table_partition_algorithm:
        HASH(col_name)
      | {MM|DD|WEEK|MMDD|YYYYMM|YYYYWEEK|YYYYDD|YYYYMM_OPT|YYYYWEEK_OPT|YYYYDD_OPT}(col_name)
      | UNI_HASH(col_name)
      | RIGHT_SHIFT(col_name, n)
      | RANGE_HASH(col_name, col_name, n)
说明 关于支持的拆分函数详情,请参见拆分函数概述

使用示例

假设已使用如下语句在PolarDB-X 2.0数据库中创建了一张t_order表(根据order_id列进行库级拆分):
CREATE TABLE t_order (
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `order_id` varchar(20) DEFAULT NULL,
  `buyer_id` varchar(20) DEFAULT NULL,
  `seller_id` varchar(20) DEFAULT NULL,
  `order_snapshot` longtext DEFAULT NULL,
  `order_detail` longtext DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `l_i_order` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
dbpartition by hash(`order_id`);
现需要对t_order表的拆分规则作出如下变更:
  • 根据order_id列进行库级拆分。
  • buyer_id列做表级拆分。
  • 每个分库包含3个分表。

您可以使用如下语句实现上述变更:

alter table `t_order` dbpartition by hash(order_id) tbpartition by hash(buyer_id) tbpartitions 3;

拆分规则变更后,您可以通过如下语句查看新的表结构来确认变更是否成功:

mysql> show full rule from t_order\G;

返回结果如下:

*************************** 1. row ***************************
                   ID: 0
           TABLE_NAME: t_order
            BROADCAST: 0
           JOIN_GROUP: NULL
ALLOW_FULL_TABLE_SCAN: 1
      DB_NAME_PATTERN: TEST7_{000000}_GROUP
         DB_RULES_STR: ((#order_id,1,4#).hashCode().abs().longValue() % 4)
      TB_NAME_PATTERN: t_order_2tva_VhJE_{0}
         TB_RULES_STR: ((#buyer_id,1,3#).hashCode().abs().longValue() % 3)
       PARTITION_KEYS: buyer_id
order_id
     DEFAULT_DB_INDEX: TEST7_SINGLE_GROUP
1 row in set (0.05 sec)

常见问题

实例崩溃或唯一索引存在冲突等因素会导致拆分规则变更的DDL任务执行失败。但这不会损坏原表任何数据,也不会阻塞正常的DML和查询语句执行。当拆分键变更的DDL任务执行失败时,您可以通过ROLLBACK DDL命令回滚该任务,然后再次尝试变更。关于ROLLBACK DDL命令的详情,请参见回滚任务

说明 暂不支持通过RECOVER DDL命令恢复执行失败的拆分键变更任务。