全部產品
Search
文件中心

PolarDB:變更表類型及拆分規則(DRDS模式)

更新時間:Jul 06, 2024

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命令恢複執行失敗的拆分鍵變更任務。