PolarDB-X新增支持變更表的類型(即在單表、拆分表和廣播表三者間進行相互轉換),和變更拆分表的拆分規則(包括拆分函數或拆分列)。本文介紹相關語法和示例,本語法僅適用于DRDS模式數據庫。

前提條件

  • 僅內核小版本為5.4.8或以上的PolarDB-X實例支持變更拆分表的拆分規則。
  • 僅內核小版本為5.4.10或以上的PolarDB-X實例支持變更表的類型(即在單表、拆分表和廣播表三者間進行相互轉換)。
  • 僅內核小版本為5.4.13或以上的PolarDB-X實例支持變更帶有GSI的拆分表的拆分規則和表類型。

如何查看實例版本,請參見查看實例版本

注意事項

  • 表屬性變更后,主鍵拆分表將變成普通表(即不再適用原主鍵拆分表中的自動拆分規則或索引轉換規則)。更多詳情,請參見DRDS模式下的主鍵拆分
  • 若單表設置了自增列,在變更為廣播表或拆分表時,需提前為該表創建Sequence。如何創建Sequence,請參見CREATE SEQUENCE
  • 本文中關于變更拆分表、廣播表和單表的表類型示例,均在單表t_order的基礎上進行變更,t_order表的創建語句如下:
    CREATE TABLE t_order (
      `id` bigint(11) NOT NULL AUTO_INCREMENT BY GROUP,
      `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;

表類型

PolarDB-X實例支持3種類型的表:拆分表、廣播表和單表。您可以通過ALTER TABLE語句在拆分表、廣播表和單表間進行轉換,同時還能對拆分表的拆分規則進行變更。 1
  • 拆分表

    使用drds_partition_options子句進行拆分的表。

    drds_partition_options可以是如下分庫或分表子句:
    drds_partition_options:
        DBPARTITION BY db_partition_algorithm
        [TBPARTITION BY table_partition_algorithm [TBPARTITIONS number]]
    其中:
    • 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)
      說明 更多關于拆分函數的信息,請參見 拆分函數
  • 廣播表

    通過BROADCAST子句創建的表,系統會將該表復制到每個分庫上,并通過分布式事務實現數據一致性。

  • 單表

    未進行任何拆分或未指定BROADCAST子句的表。

單表或廣播表變為拆分表

  • 語法
    ALTER TABLE table_name drds_partition_options;
    說明
    • 更多關于drds_partition_options的信息,請參見表類型
    • 若單表設置了自增列,在變更為拆分表時,需提前為該表創建Sequence。如何創建Sequence,請參見CREATE SEQUENCE
  • 示例

    因業務擴展,單表t_order無法承載日益增長的數據。此時,您可以使用如下語句將該單表變更為拆分表(以order_id為拆分鍵):

    ALTER TABLE t_order dbpartition BY hash(`order_id`);

單表或拆分表變為廣播表

  • 語法
    ALTER TABLE table_name BROADCAST;
    說明 若單表設置了自增列,在變更為廣播表時,需提前為該表創建Sequence。如何創建Sequence,請參見 CREATE SEQUENCE
  • 示例
    您可以使用如下語句將單表或拆分表 t_order變更為廣播表:
    ALTER TABLE t_order BROADCAST;

廣播表或拆分表變為單表

  • 語法
    ALTER TABLE table_name SINGLE;
  • 示例
    您可以使用如下語句將廣播表或拆分表 t_order變更為單表:
    ALTER TABLE t_order SINGLE;

變更拆分表的拆分規則

  • 語法
    ALTER TABLE tbl_name drds_partition_options;
  • 示例
    假設已使用如下語句在 PolarDB-X數據庫中創建了一張拆分表 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;

相關文檔

拆分規則變更后,您可以通過如下命令查看表的拆分規則或拓撲結構:

常見問題

Q:為什么有時拆分鍵變更的DDL任務會執行失敗?此時該如何處理?

A:實例崩潰或唯一索引存在沖突等因素會導致拆分規則變更的DDL任務執行失敗。但這不會損壞原表任何數據,也不會阻塞正常的DML和查詢語句執行。當拆分鍵變更的DDL任務執行失敗時,您可以通過ROLLBACK DDL命令回滾該任務,然后再次嘗試變更。關于ROLLBACK DDL命令的詳情。

說明 暫不支持通過 RECOVER DDL命令恢復執行失敗的拆分鍵變更任務。