本文介紹Locality的使用方法。
Locality允許使用者在Auto模式下控制資料庫中各種粒度對象的實體儲存體位置,如資料庫、表、分區的儲存DN集合,從而針對不同業務的壓力進行資源隔離。
當前Locality的能力如下:
允許定義資料庫、表、分區層級的Locality屬性,擴容、分區變更以及其他DDL(縮容與備份除外)均會在保證Localiy約束的前提下改變資料分布。
允許變更表組、分區組層級的Locality屬性,修改後將自動觸發相應的非同步資料移轉任務。
版本限制
執行個體核心版本需為5.4.14或以上。
邏輯庫的分區類型需為Auto模式。
關於如何查看執行個體版本,請參見查看和升級執行個體版本。
注意事項
節點縮容後,涉及被縮容節點的Locality定義將會自動失效。
當前Locality屬性通過資料節點的ID定義,備份恢複後原有Locality屬性將會自動失效。
定義資料庫物件的Locality屬性
查看儲存節點資訊
假設已有一個PolarDB-X執行個體,您可以通過如下命令查看執行個體中的儲存節點:
SHOW STORAGE;返回結果如下:
+--------------------+----------------------------------+------------+-----------+----------+-------------+--------+-----------+-------+--------+
| STORAGE_INST_ID | LEADER_NODE | IS_HEALTHY | INST_KIND | DB_COUNT | GROUP_COUNT | STATUS | DELETABLE | DELAY | ACTIVE |
+--------------------+----------------------------------+------------+-----------+----------+-------------+--------+-----------+-------+--------+
| polardbx-ng28-dn-0 | polardbx-ng28-dn-0-cands-0:14289 | true | MASTER | 1 | 2 | 0 | false | null | null |
| polardbx-ng28-dn-1 | polardbx-ng28-dn-1-cands-0:14176 | true | MASTER | 1 | 1 | 0 | true | null | null |
| polardbx-ng28-dn-2 | polardbx-ng28-dn-2-cands-0:14568 | true | MASTER | 1 | 1 | 0 | true | null | null |
| polardbx-ng28-dn-3 | polardbx-ng28-dn-3-cands-0:16796 | true | MASTER | 1 | 1 | 0 | true | null | null |
| polardbx-ng28-gms | polardbx-ng28-dn-0-cands-0:14289 | true | META_DB | 2 | 2 | 0 | false | null | null |
+--------------------+----------------------------------+------------+-----------+----------+-------------+--------+-----------+-------+--------+STORAGE_INST_ID列為儲存節點名,也即當前在Locality中使用的名字。
INST_KIND列為儲存節點類型,值為META_DB的節點為中繼資料節點,不能用於儲存使用者資料。
STATUS列為儲存節點狀態,值為0的節點為可用節點。
DELTETABLE列表明該節點是否可被縮容,值為false的節點不可被縮容,其中包含中繼資料節點和一個指定儲存節點(下面簡稱為0號儲存節點)。
建立資料庫時指定儲存節點
在建立資料庫時指定儲存位置以實現資料隔離。
文法:
CREATE DATABASE database_name databse [database_option_list];在執行個體中建立一個Auto模式資料庫,並指定其locality,詳細文法請參見CREATE DATABASE。
樣本:
CREATE DATABASE db1 LOCALITY='dn=polardbx-ng28-dn-0,polardbx-ng28-dn-1,polardbx-ng28-dn-2' MODE = 'auto';您可以通過show create database查看資料庫的定義,也可以通過show ds查看當前資料庫中可用的儲存節點。
mysql> SHOW CREATE DATABASE `db1`;
+----------+--------------------------------------------------------------------------------------------------------------------+
| DATABASE | CREATE DATABASE |
+----------+--------------------------------------------------------------------------------------------------------------------+
| db1 | CREATE DATABASE `db1` /* MODE = 'auto' LOCALITY = "dn=polardbx-ng28-dn-0,polardbx-ng28-dn-1,polardbx-ng28-dn-2" */ |
+----------+--------------------------------------------------------------------------------------------------------------------+
1 row in set (0.04 sec)
mysql> SHOW DS;
+----+--------------------+--------------------+---------------------------------+----------------------+---------+
| ID | STORAGE_INST_ID | DB | GROUP | PHY_DB | MOVABLE |
+----+--------------------+--------------------+---------------------------------+----------------------+---------+
| 0 | polardbx-ng28-dn-0 | db1 | DB1_P00000_GROUP | db1_p00000 | 1 |
| 1 | polardbx-ng28-dn-1 | db1 | DB1_P00001_GROUP | db1_p00001 | 1 |
| 2 | polardbx-ng28-dn-2 | db1 | DB1_P00002_GROUP | db1_p00002 | 1 |
| 3 | polardbx-ng28-gms | information_schema | INFORMATION_SCHEMA_SINGLE_GROUP | polardbx_info_schema | 0 |
+----+--------------------+--------------------+---------------------------------+----------------------+---------+
4 rows in set (0.04 sec)資料庫的locality屬性必須包含0號節點,表和分區的locality屬性不受此限制。
建立單表時自動打散儲存節點
在建立單表時會自動將單表打散到多個儲存節點上,建立單表的物理表時將會自動根據DN節點上的單表數量和資料量進行均衡。
在執行個體中建立若干個邏輯單表,並指定其locality為"balance_single_table=on"。詳細文法請參見CREATE TABLE(AUTO模式)。
樣本:
CREATE TABLE t_sgl1 (
`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`)
) SINGLE locality = 'balance_single_table=on';
CREATE TABLE t_sgl2 (
`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`)
) SINGLE locality = 'balance_single_table=on';
CREATE TABLE t_sgl3 (
`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`)
) SINGLE locality = 'balance_single_table=on';
CREATE TABLE t_sgl4 (
`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`)
) SINGLE locality = 'balance_single_table=on';您可以通過show create table查看錶的定義,也可以通過show topology查看邏輯表的各個分區的資料分布情況。
mysql> SHOW CREATE TABLE `t_sgl1`;
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE | CREATE TABLE |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_order | CREATE TABLE `t_sgl1` (
`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`),
INDEX `l_i_order` (`order_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8
/* LOCALITY='balance_single_table=on' */ |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.05 sec)
mysql> SHOW TOPOLOGY `t_sgl1`;
+----+------------------+--------------------+----------------+-------------+--------------------+
| ID | GROUP_NAME | TABLE_NAME | PARTITION_NAME | PHY_DB_NAME | DN_ID |
+----+------------------+--------------------+----------------+-------------+--------------------+
| 1 | DB1_P00001_GROUP | t_sgl1_92mv_00000 | p1 | db1_p00001 | polardbx-ng28-dn-1 |
+----+------------------+--------------------+----------------+-------------+--------------------+
3 rows in set (0.15 sec)
mysql> SHOW TOPOLOGY `t_sgl2`;
+----+------------------+--------------------+----------------+-------------+--------------------+
| ID | GROUP_NAME | TABLE_NAME | PARTITION_NAME | PHY_DB_NAME | DN_ID |
+----+------------------+--------------------+----------------+-------------+--------------------+
| 1 | DB1_P00002_GROUP | t_sgl2_87fg_00000 | p1 | db1_p00002 | polardbx-ng28-dn-2 |
+----+------------------+--------------------+----------------+-------------+--------------------+
3 rows in set (0.15 sec)
mysql> SHOW TOPOLOGY `t_sgl3`;
+----+------------------+--------------------+----------------+-------------+--------------------+
| ID | GROUP_NAME | TABLE_NAME | PARTITION_NAME | PHY_DB_NAME | DN_ID |
+----+------------------+--------------------+----------------+-------------+--------------------+
| 1 | DB1_P00002_GROUP | t_sgl3_64uj_00000 | p1 | db1_p00001 | polardbx-ng28-dn-1 |
+----+------------------+--------------------+----------------+-------------+--------------------+
3 rows in set (0.15 sec)
mysql> SHOW TOPOLOGY `t_sgl4`;
+----+------------------+--------------------+----------------+-------------+--------------------+
| ID | GROUP_NAME | TABLE_NAME | PARTITION_NAME | PHY_DB_NAME | DN_ID |
+----+------------------+--------------------+----------------+-------------+--------------------+
| 1 | DB1_P00001_GROUP | t_sgl4_71mb_00000 | p1 | db1_p00002 | polardbx-ng28-dn-2 |
+----+------------------+--------------------+----------------+-------------+--------------------+
3 rows in set (0.15 sec)此時邏輯單表已經被自動打散到多個儲存節點上。
建立邏輯表時指定儲存節點
在建立邏輯表時指定儲存位置以實現資料隔離,目前Locality支援單表和Range、Hash、List三種分區方式的分區表。
文法:
CREATE [PARTITION] TABLE [IF NOT EXISTS] tbl_name
(create_definition, ...)
[table_options]
[table_partition_definition]
[local_partition_definition]在執行個體中建立一個邏輯表,並指定其locality。詳細文法請參見CREATE TABLE(AUTO模式)。
樣本:
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 locality = 'dn=polardbx-ng28-dn-1,polardbx-ng28-dn-2';您可以通過show create table命令查看錶的定義,也可以通過show topology命令查看邏輯表的各個分區的資料分布情況。
mysql> SHOW CREATE TABLE `t_order`;
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE | 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`),
INDEX `l_i_order` (`order_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8
/* LOCALITY='dn=polardbx-ng28-dn-1,polardbx-ng28-dn-2' */ |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.05 sec)
mysql> SHOW TOPOLOGY `t_order`;
+----+------------------+--------------------+----------------+-------------+--------------------+
| ID | GROUP_NAME | TABLE_NAME | PARTITION_NAME | PHY_DB_NAME | DN_ID |
+----+------------------+--------------------+----------------+-------------+--------------------+
| 0 | DB1_P00002_GROUP | t_order_18dV_00001 | p2 | db1_p00002 | polardbx-ng28-dn-2 |
| 1 | DB1_P00001_GROUP | t_order_18dV_00000 | p1 | db1_p00001 | polardbx-ng28-dn-1 |
| 2 | DB1_P00001_GROUP | t_order_18dV_00002 | p3 | db1_p00001 | polardbx-ng28-dn-1 |
+----+------------------+--------------------+----------------+-------------+--------------------+
3 rows in set (0.15 sec)邏輯表的locality屬性指定的儲存節點集合必須是資料庫對應儲存節點集合的子集。
如果所建的表為單表,則只允許聲明單個資料節點作為locality。
當邏輯表與表組匹配時,表與表組、分區和分區組的locality屬性必須完全相同才能匹配成功。
邏輯表、邏輯表的表組、邏輯表的GSI、邏輯表GSI的表組預設具備相同的locality屬性。
建立邏輯表的分區時指定儲存節點
在建立邏輯表時,通過指定分區層級的Locality,可以將同一張邏輯表的不同分區控制在不同DN上。
樣本:
CREATE TABLE orders_region(
order_id int AUTO_INCREMENT primary key,
customer_id int,
country varchar(64),
city varchar(64),
order_time datetime not null)
PARTITION BY LIST COLUMNS(country,city)
(
PARTITION p1 VALUES IN (('China','Shanghai')) LOCALITY = 'dn=polardbx-ng28-dn-2',
PARTITION p2 VALUES IN (('China','Beijing')) LOCALITY = 'dn=polardbx-ng28-dn-2',
PARTITION p3 VALUES IN (('China','Hangzhou')) ,
PARTITION p4 VALUES IN (('China','Nanjing')) ,
PARTITION p5 VALUES IN (('China','Guangzhou')) ,
PARTITION p6 VALUES IN (('China','Shenzhen')) ,
PARTITION p7 VALUES IN (('China','Wuhan')) ,
PARTITION p8 VALUES IN (('America','New York'))
) LOCALITY = 'dn=polardbx-ng28-dn-0,polardbx-ng28-dn-1';
您可以通過show create table查看錶的定義,也可以通過show topology查看邏輯表的各個分區的資料分布情況。
mysql> SHOW CREATE TABLE `orders_region`;
+---------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE | CREATE TABLE |
+---------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| orders_region | CREATE TABLE `orders_region` (
`order_id` int(11) NOT NULL AUTO_INCREMENT,
`customer_id` int(11) DEFAULT NULL,
`country` varchar(64) DEFAULT NULL,
`city` varchar(64) DEFAULT NULL,
`order_time` datetime NOT NULL,
PRIMARY KEY (`order_id`),
KEY `auto_shard_key_country_city` USING BTREE (`country`, `city`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
/* LOCALITY='dn=polardbx-ng28-dn-0,polardbx-ng28-dn-1' */
PARTITION BY LIST COLUMNS(`country`,`city`)
(PARTITION `p1` VALUES IN (('China','Shanghai')) ENGINE = InnoDB LOCALITY='dn=polardbx-ng28-dn-2',
PARTITION `p2` VALUES IN (('China','Beijing')) ENGINE = InnoDB LOCALITY='dn=polardbx-ng28-dn-2',
PARTITION `p3` VALUES IN (('China','Hangzhou')) ENGINE = InnoDB,
PARTITION `p4` VALUES IN (('China','Nanjing')) ENGINE = InnoDB,
PARTITION `p5` VALUES IN (('China','Guangzhou')) ENGINE = InnoDB,
PARTITION `p6` VALUES IN (('China','Shenzhen')) ENGINE = InnoDB,
PARTITION `p7` VALUES IN (('China','Wuhan')) ENGINE = InnoDB,
PARTITION `p8` VALUES IN (('America','New York')) ENGINE = InnoDB) |
+---------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.05 sec)
mysql> SHOW TOPOLOGY `orders_region`;
+----+------------------+--------------------------+----------------+-------------+--------------------+
| ID | GROUP_NAME | TABLE_NAME | PARTITION_NAME | PHY_DB_NAME | DN_ID |
+----+------------------+--------------------------+----------------+-------------+--------------------+
| 0 | DB1_P00002_GROUP | orders_region_RlsY_00000 | p1 | db1_p00002 | polardbx-ng28-dn-2 |
| 1 | DB1_P00002_GROUP | orders_region_RlsY_00001 | p2 | db1_p00002 | polardbx-ng28-dn-2 |
| 2 | DB1_P00001_GROUP | orders_region_RlsY_00003 | p4 | db1_p00001 | polardbx-ng28-dn-1 |
| 3 | DB1_P00001_GROUP | orders_region_RlsY_00004 | p5 | db1_p00001 | polardbx-ng28-dn-1 |
| 4 | DB1_P00001_GROUP | orders_region_RlsY_00006 | p7 | db1_p00001 | polardbx-ng28-dn-1 |
| 5 | DB1_P00000_GROUP | orders_region_RlsY_00002 | p3 | db1_p00000 | polardbx-ng28-dn-0 |
| 6 | DB1_P00000_GROUP | orders_region_RlsY_00005 | p6 | db1_p00000 | polardbx-ng28-dn-0 |
| 7 | DB1_P00000_GROUP | orders_region_RlsY_00007 | p8 | db1_p00000 | polardbx-ng28-dn-0 |
+----+------------------+--------------------------+----------------+-------------+--------------------+
8 rows in set (0.25 sec)分區的locality屬性必須是資料庫locality屬性的子集,但是可以不必從屬於邏輯表的locality屬性。
修改資料庫物件的Locality屬性
修改表組的儲存節點
支援動態變更表組的locality屬性。
文法:
ALTER TABLEGROUP identifier SET LOCALITY = locality_option
locality_option:
'dn=storage_inst_id_list'
| ''樣本:
以前文中的orders_region表為例,該表位於表組`tg3`中,現對其locality進行變更:
ALTER TABLEGROUP `tg3` SET LOCALITY = `dn=polardbx-ng28-dn-0`;變更操作後,表的拓撲如下:
mysql> SHOW TOPOLOGY `orders_region`;
+----+------------------+--------------------------+----------------+-------------+--------------------+
| ID | GROUP_NAME | TABLE_NAME | PARTITION_NAME | PHY_DB_NAME | DN_ID |
+----+------------------+--------------------------+----------------+-------------+--------------------+
| 0 | DB1_P00002_GROUP | orders_region_RlsY_00000 | p1 | db1_p00002 | polardbx-ng28-dn-2 |
| 1 | DB1_P00002_GROUP | orders_region_RlsY_00001 | p2 | db1_p00002 | polardbx-ng28-dn-2 |
| 2 | DB1_P00000_GROUP | orders_region_RlsY_00002 | p3 | db1_p00000 | polardbx-ng28-dn-0 |
| 3 | DB1_P00000_GROUP | orders_region_RlsY_00003 | p4 | db1_p00000 | polardbx-ng28-dn-0 |
| 4 | DB1_P00000_GROUP | orders_region_RlsY_00004 | p5 | db1_p00000 | polardbx-ng28-dn-0 |
| 5 | DB1_P00000_GROUP | orders_region_RlsY_00005 | p6 | db1_p00000 | polardbx-ng28-dn-0 |
| 6 | DB1_P00000_GROUP | orders_region_RlsY_00006 | p7 | db1_p00000 | polardbx-ng28-dn-0 |
| 7 | DB1_P00000_GROUP | orders_region_RlsY_00007 | p8 | db1_p00000 | polardbx-ng28-dn-0 |
+----+------------------+--------------------------+----------------+-------------+--------------------+
8 rows in set (0.17 sec)
聲明Locality的分區的資料分布仍然遵從原有的Locality約束,其他分區將根據表組的Locality約束進行資料移轉。
修改表組或分區組的locality將會在元資訊變更後快速返回,後台產生相應表組的分區遷移任務非同步執行。可通過information_schema.ddl_plan查詢對應的分區遷移任務REBALANCE TABLEGROUP tg3 的執行進度。
mysql> select * from information_schema.ddl_plan where table_schema = "db1";
+----+---------------------+---------------------+--------------+------------------------------------------------------------------+---------+-----------+----------+-------------+--------+--------+---------------------+---------------------+----------------+
| ID | plan_id | job_id | table_schema | ddl_stmt | state | ddl_type | progress | retry_count | result | extras | gmt_created | gmt_modified | resource |
+----+---------------------+---------------------+--------------+------------------------------------------------------------------+---------+-----------+----------+-------------+--------+--------+---------------------+---------------------+----------------+
| 1 | 1465819565798723584 | 1465819579241467904 | db1 | REBALANCE TABLEGROUP `tg3` EXPLAIN=false ASYNC=true DEBUG=false | SUCCESS | REBALANCE | 100 | 0 | | | 2022-05-24 14:37:58 | 2022-05-24 14:38:11 | tablegroup:tg3 |
+----+---------------------+---------------------+--------------+------------------------------------------------------------------+---------+-----------+----------+-------------+--------+--------+---------------------+---------------------+----------------+修改分區組的儲存節點
動態變更分區組的locality屬性。
文法:
ALTER TABLEGROUP identifier SET PARTITIONS part_name LOCALITY = locality_option
locality_option:
'dn=storage_inst_id_list'
| ''樣本:
以前文中的orders_region表為例,該表位於表組`tg3`中,現對其分區p3的locality進行變更:
ALTER TABLEGROUP `tg3` SET PARTITIONS p3 LOCALITY = `dn=polardbx-ng28-dn-1`;變更後表的拓撲如下:
mysql> show topology orders_region;
+----+------------------+--------------------------+----------------+-------------+--------------------+
| ID | GROUP_NAME | TABLE_NAME | PARTITION_NAME | PHY_DB_NAME | DN_ID |
+----+------------------+--------------------------+----------------+-------------+--------------------+
| 0 | DB1_P00002_GROUP | orders_region_RlsY_00000 | p1 | db1_p00002 | polardbx-ng28-dn-2 |
| 1 | DB1_P00002_GROUP | orders_region_RlsY_00001 | p2 | db1_p00002 | polardbx-ng28-dn-2 |
| 2 | DB1_P00001_GROUP | orders_region_RlsY_00002 | p3 | db1_p00001 | polardbx-ng28-dn-1 |
| 3 | DB1_P00000_GROUP | orders_region_RlsY_00003 | p4 | db1_p00000 | polardbx-ng28-dn-0 |
| 4 | DB1_P00000_GROUP | orders_region_RlsY_00004 | p5 | db1_p00000 | polardbx-ng28-dn-0 |
| 5 | DB1_P00000_GROUP | orders_region_RlsY_00005 | p6 | db1_p00000 | polardbx-ng28-dn-0 |
| 6 | DB1_P00000_GROUP | orders_region_RlsY_00006 | p7 | db1_p00000 | polardbx-ng28-dn-0 |
| 7 | DB1_P00000_GROUP | orders_region_RlsY_00007 | p8 | db1_p00000 | polardbx-ng28-dn-0 |
+----+------------------+--------------------------+----------------+-------------+--------------------+
8 rows in set (0.11 sec)修改表的Locality屬性
動態變更表的locality屬性,注意,該操作將會觸發資料移轉。
如須將設定了locality為"balance_single_table=on"的單表變更為相應分區表,需要顯式通過repartition消去LOCALITY屬性,例如:
ALTER TABLE t_sgl1 PARTITION BY HASH(ID) PARTITIONS 32 LOCALITY = "";如須直接變更邏輯表的locality屬性,同樣可以直接通過repatition操作修改LOCALITY屬性,例如:
ALTER TABLE t_sgl1 PARTITION BY HASH(ID) PARTITIONS 8 LOCALITY = "dn=dn1";DDL操作中的Locality屬性傳播
當前Auto模式下的分區變更操作包括alter table group和變更表類型及分區策略。
在分區變更操作中,新的分區組和表組一般自動繼承原有的Locality屬性,並且變更後的表組和分區組也將自動滿足資料分布約束,但是以下三種情形例外:
對於表的類型變更操作,當目標類型為單表或者廣播表時,表的locality屬性預設為空白。
對於明確涉及資料熱點的分區變更操作,新分區locality預設為空白。
對於merge partition操作,當原分區集合成員的locality不同時,新分區locality預設為空白。
分區變更操作涉及的Locality如下表所示:
類型(簡稱) | 變更對象 | 變更對象的Locality屬性是否不變 |
分區表拆分變更 | 表 | 是 |
表的類型變更 | 表 | 僅在單表變更為分區表時不變。 |
分區遷移(move partition) | 分區組 | 是 |
分區合并(merge partition) | 分區組 | 新分區僅在所有舊分區的locality屬性相同時繼承舊分區的locality。 |
分區分裂(split partition) | 分區組 | 是 |
分區按熱點分裂(split by hot value) | 分區組 | 否 |
分區熱點值提取(extract) | 分區組 | 否 |
分區刪除(drop partition) | 分區組 | - |
分區新增(add partition) | 分區組 | 是 |
LIST分區值修改(modify partition) | 分區組 | 是 |
分區重新命名(rename partition) | 分區組 | 是 |
典型使用情境
建庫時,可通過Localiy對邏輯庫層級的資料進行隔離,資料庫中的表和分區會自動分佈於指定DN範圍上。
建立單表時,可通過Locality指定單表的儲存節點,從而避免單表數量過多對0號節點的儲存壓力。
建立分區表時,可通過指定分區層級的Locality,將同一張邏輯表的不同分區控制在不同DN上。例如結合LIST分區可對同一張邏輯表中不同地區資料進行隔離,參見建立邏輯表的分區時指定儲存節點。
當資料分區產生熱點資料時,可通過分區變更和Locality屬性修改為熱點分區指定單獨的DN,從而隔離其實體儲存體資源,參見修改表的Locality屬性。