全部產品
Search
文件中心

PolarDB:變更表類型及分區策略(AUTO模式)

更新時間:Jul 06, 2024

本文介紹了變更表類型(即在單表、廣播表和分區表三者間進行相互轉換)及分區策略(包括拆分函數或分區列)的相關文法和樣本。本文法僅適用於AUTO模式資料庫。

前提條件

  • 僅適用於分區模式為auto/partitioning的邏輯庫(請參見CREATE DATABASE);
  • 僅核心小版本為5.4.13或以上的PolarDB-X執行個體支援變更表的類型和分區策略。
  • 僅核心小版本為5.4.13或以上的PolarDB-X執行個體支援對帶有GSI的分區表進行分區變更。
  • 僅核心小版本為5.4.14或以上的PolarDB-X執行個體支援將普通分區錶轉為預設主鍵分區表。
  • 僅核心小版本為5.4.14或以上的PolarDB-X執行個體支援修改預設主鍵分區表的分區數。

如何查看執行個體版本,請參見查看執行個體版本

注意事項

  • 表屬性變更後,主鍵分區表將變成普通表(即不再適用原主鍵分區表中的自動分區策略或索引轉換規則)。更多詳情,請參見AUTO模式下的主鍵拆分
  • 本文中關於變更分區表、廣播表和單表的表類型樣本,均在單表t_order1的基礎上進行變更,t_order1表的建立語句如下:
    CREATE TABLE t_order1 (
      `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語句將表的類型在分區表、廣播表和單表之間進行轉換,同時還能對分區表的分區策略進行變更。

  • 分區表

    使用partition_options分區子句進行建立的表。

    partition_options可以是如下子句:
      partition_options:
        PARTITION BY
              HASH({column_name | partition_func(column_name)})
            | KEY(column_list)
            | RANGE{({column_name | partition_func(column_name)}) 
            | RANGE COLUMNS(column_list)}
            | LIST{({column_name | partition_func(column_name)}) 
            | LIST COLUMNS(column_list)} }
        partition_list_spec
    說明 更多關於分區策略的資訊,請參見CREATE TABLE(AUTO模式)
  • 廣播表

    通過BROADCAST子句建立的表,系統會將該表複製到每個分庫上,並通過分散式交易實現資料一致性。更多詳情,請參見單表

  • 單表

    通過SINGLE子句建立的表。更多詳情,請參見單表

單表或廣播表變為分區表

  • 文法
    ALTER TABLE table_name partition_options;
    說明

    更多關於partition_options的資訊,請參見CREATE TABLE(AUTO模式)

  • 樣本

    因業務擴充,單表t_order1無法承載日益增長的資料。此時,您可以使用如下語句將該單表變更為分區表(以order_id為分區鍵,採用KEY分區策略):

    ALTER TABLE t_order1 PARTITION BY KEY(`order_id`);
    如需指定分區數量,可以使用如下語句:
    ALTER TABLE t_order1 PARTITION BY KEY(`order_id`) PARTITIONS 8;

單表或分區表變為廣播表

  • 文法
    ALTER TABLE table_name BROADCAST;
  • 樣本
    您可以使用如下語句將單表或分區表t_order1變更為廣播表:
    ALTER TABLE t_order1 BROADCAST;

廣播表或分區表變為單表

  • 文法
    ALTER TABLE table_name SINGLE;
  • 樣本
    您可以使用如下語句將廣播表或分區表t_order1變更為單表:
    ALTER TABLE t_order1 SINGLE;

變更分區表的分區策略

  • 文法
    ALTER TABLE tbl_name partition_options;
  • 樣本1
    假設已使用如下語句在PolarDB-X資料庫中建立了一張分區表t_order(根據order_id列進行KEY分區):
      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 
      PARTITION BY KEY(`order_id`);
    現需要對t_order表的分區策略作出如下變更:
    • 根據order_id列以及buyer_id進行KEY分區。
    • 共包含8個分區。

    您可以使用如下語句實現上述變更:

    ALTER TABLE t_order PARTITION BY KEY(order_id, buyer_id) PARTITIONS 8;
    變更後執行show create table t_order,返回如下資訊:
    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,
      `order_detail` longtext,
      PRIMARY KEY (`id`),
      KEY `l_i_order` (`order_id`),
      KEY `auto_shard_key_order_id_buyer_id` USING BTREE (`order_id`, `buyer_id`)
    ) ENGINE = InnoDB DEFAULT CHARSET = utf8
    PARTITION BY KEY(`order_id`,`buyer_id`)
    PARTITIONS 8
  • 樣本2
    假設已使用如下語句在PolarDB-X資料庫中建立了一張分區表t_order(根據id列進行RANGE分區):
      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 
      PARTITION BY RANGE(`id`)
      (
        PARTITION p1 VALUES LESS THAN (100),
        PARTITION p2 VALUES LESS THAN (1000),
        PARTITION P3 VALUES LESS THAN MAXVALUE
      );
    現需要對t_order表的分區策略作出如下變更:
    • 根據order_id列以及buyer_id進行KEY分區;
    • 總共包含16個分區。

    您可以使用如下語句實現上述變更:

    ALTER TABLE t_order PARTITION BY KEY(order_id, buyer_id) PARTITIONS 16;
    變更後執行show create table t_order,返回如下資訊:
    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,
      `order_detail` longtext,
      PRIMARY KEY (`id`),
      KEY `l_i_order` (`order_id`),
      KEY `auto_shard_key_order_id_buyer_id` USING BTREE (`order_id`, `buyer_id`)
    ) ENGINE = InnoDB DEFAULT CHARSET = utf8
    PARTITION BY KEY(`order_id`,`buyer_id`)
    PARTITIONS 16

分區表變為預設主鍵分區表

  • 文法
    ALTER TABLE table_name REMOVE PARTITIONING;
  • 樣本

    假設已使用如下語句在PolarDB-X資料庫中建立了一張分區表t_order(根據order_id列進行KEY分區):

    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 
    PARTITION BY KEY(`order_id`);

    現需要對t_order表的分區策略作出如下變更:

    • 將其改成按照主鍵列id進行KEY分區;
    • show create table t_order 不再對外展示分區資訊。

    您可以使用如下語句實現上述變更:

    ALTER TABLE t_order REMOVE PARTITIONING;

    變更後執行show create table t_order,返回如下資訊:

    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;
    重要
    • 該轉換會保留原表已經存在的GLOBAL INDEX,而LOCAL INDEX會變為GLOBAL INDEX。
    • 單表或者廣播表不可直接轉成預設主鍵拆分表。

變更預設主鍵分區表的分區數

  • 文法
    ALTER TABLE table_name PARTITIONS partition_count;
    說明 僅預設主鍵拆分表可以使用該指令一鍵改變分區數,且轉換後依然是預設主鍵分區表。
  • 樣本

    假設已使用如下語句在PolarDB-X資料庫中建立了一張分區表t_order(預設根據id列進行KEY分區):

    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;

    執行show full create table t_order 可以看到該表具體的分區方式以及分區數:

    CREATE PARTITION 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,
      `order_detail` longtext,
      PRIMARY KEY (`id`),
      GLOBAL INDEX /* l_i_order_$d8df */ `l_i_order` (`order_id`) PARTITION BY KEY (`order_id`, `id`) PARTITIONS 16,
      LOCAL KEY `_local_l_i_order` (`order_id`)
    ) ENGINE = InnoDB DEFAULT CHARSET = utf8
    PARTITION BY KEY(`id`)
    PARTITIONS 16

    現需要對t_order表的分區策略作出如下變更:

    • 將分區數從16改為32。
    • 不會將改預設主鍵分區錶轉為普通分區表。
    • 同時修改原表上的 GLOBAL INDEX 的分區數。

    您可以使用如下語句實現上述變更:

    ALTER TABLE t_order PARTITIONS 32;

    變更後執行show full create table t_order,返回如下資訊:

    CREATE PARTITION TABLE `t_order` (
      `id` bigint(11) NOT NULL,
      `order_id` varchar(20) DEFAULT NULL,
      `buyer_id` varchar(20) DEFAULT NULL,
      `seller_id` varchar(20) DEFAULT NULL,
      `order_snapshot` longtext,
      `order_detail` longtext,
      PRIMARY KEY USING BTREE (`id`),
      GLOBAL INDEX /* l_i_order_$d8df */ `l_i_order` (`order_id`) PARTITION BY KEY (`order_id`, `id`) PARTITIONS 32,
      LOCAL KEY `_local_l_i_order` (`order_id`)
    ) ENGINE = InnoDB DEFAULT CHARSET = utf8
    PARTITION BY KEY(`id`)
    PARTITIONS 32

相關文檔

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

常見問題

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

A:執行個體崩潰或唯一索引存在衝突等因素會導致分區變更的DDL任務執行失敗。但這不會損壞原表任何資料,也不會阻塞正常的DML和查詢語句執行。當分區變更的DDL任務執行失敗時,您可以通過CANCEL DDL命令復原該任務,然後再次嘗試變更。關於CANCEL DDL命令的詳情,請參見CANCEL DDL