前提條件
- 僅核心小版本為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;
- 說明
- 示例因業務擴充,單表
無法承載日益增長的資料。此時,您可以使用如下語句将該單表變更為拆分表(以t_order
為拆分鍵):order_id
ALTER TABLE t_order dbpartition BY hash(`order_id`);
單表或拆分表變為廣播表
ALTER TABLE table_name BROADCAST;
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;
相關文檔
拆分規則變更後,您可以通過如下指令檢視表的拆分規則或拓撲結構:
- 檢視表拆分規則,請參見 SHOW FULL RULE [FROM tablename]
- 檢視表拓撲結構,請參見 SHOW TOPOLOGY FROM tablename
常見問題
Q:為什麼有時拆分鍵變更的DDL任務會執行失敗?此時該如何處理?
A:執行個體崩潰或唯一索引存在沖突等因素會導緻拆分規則變更的DDL任務執行失敗。但這不會損壞原表任何資料,也不會阻塞正常的DML和查詢語句執行。當拆分鍵變更的DDL任務執行失敗時,您可以通過
ROLLBACK DDL
指令復原該任務,然後再次嘗試變更。關于
ROLLBACK DDL
指令的詳情,請參見
復原任務說明 暫不支援通過
RECOVER DDL
指令恢複執行失敗的拆分鍵變更任務。