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語句在拆分表、廣播表和單表間進行轉換,同時還能對拆分表的拆分規則進行變更。
- 拆分表
使用
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
命令恢複執行失敗的拆分鍵變更任務。