天天看點

開發指南—透明分布式—變更表類型及拆分規則

前提條件

  • 僅核心小版本為5.4.8或以上的PolarDB-X執行個體支援變更拆分表的拆分規則。
  • 僅核心小版本為5.4.10或以上的PolarDB-X執行個體支援變更表的類型(即在單表、拆分表和廣播表三者間進行互相轉換)。

如何檢視執行個體版本,請參見

檢視執行個體版本

注意事項

  • 暫不支援變更帶有GSI的拆分表的拆分規則。
  • 表屬性變更後,主鍵拆分表将變成普通表(即不再适用原主鍵拆分表中的自動拆分規則或索引轉換規則)。更多詳情,請參見 主鍵拆分
  • 若單表設定了自增列,在變更為廣播表或拆分表時,需提前為該表建立Sequence。如何建立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語句在拆分表、廣播表和單表間進行轉換,同時還能對拆分表的拆分規則進行變更。

開發指南—透明分布式—變更表類型及拆分規則
  • 拆分表使用

    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,請參見
  • 示例因業務擴充,單表

    t_order

    無法承載日益增長的資料。此時,您可以使用如下語句将該單表變更為拆分表(以

    order_id

    為拆分鍵):
ALTER TABLE t_order dbpartition BY hash(`order_id`);      

單表或拆分表變為廣播表

ALTER TABLE table_name BROADCAST;      
  • 說明 若單表設定了自增列,在變更為廣播表時,需提前為該表建立Sequence。如何建立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

指令恢複執行失敗的拆分鍵變更任務。