PolarDB-X支持通过LOCALITY关键字来指定数据库或单表的存储位置,以实现数据隔离或数据的均匀分布。本文介绍了DRDS模式数据库中使用LOCALITY的方法。本语法仅适用于DRDS模式数据库。

前提条件

实例版本需为5.4.10或以上。关于如何查看实例版本,请参见查看实例版本

注意事项

通过LOCALITY语法指定了数据库或单表的位置之后,不支持再修改该库或该表的存储位置。

创建数据库时指定存储位置

在创建数据库时指定存储位置以实现数据隔离。

  1. 假设已有一个PolarDB-X实例,您可以通过如下命令查看实例中的存储节点:
    SHOW STORAGE;

    返回结果如下:

    +---------------------------+--------------------+------------+-----------+----------+-------------+
    | STORAGE_INST_ID           | LEADER_NODE        | IS_HEALTHY | INST_KIND | DB_COUNT | GROUP_COUNT |
    +---------------------------+--------------------+------------+-----------+----------+-------------+
    | polardbx-storage-1-master | 1.1.1.1:3308       | true       | MASTER    | 2        | 6           |
    | polardbx-storage-meta     | 1.1.1.1:3306       | true       | META_DB   | 2        | 2           |
    | polardbx-storage-0-master | 1.1.1.1:3306       | true       | MASTER    | 2        | 8           |
    +---------------------------+--------------------+------------+-----------+----------+-------------+
    说明
    • polardbx-storage-1-masterpolardbx-storage-0-master为存储节点,用于存储用户数据。
    • polardbx-storage-meta为元数据的存储节点,不用于存储用户数据。
  2. 在该实例中创建一个数据库,并通过如下命令指定其存储位置为 polardbx-storage-0-master节点:
    CREATE DATABASE db1 LOCALITY='dn=polardbx-storage-0-master';
    说明
    • 若在创建数据库时未指定数据库的存储位置,系统将默认在所有存储节点中均匀分布数据库。
    • 数据库中分布式表的存储位置与该库的存储位置保持一致,以实现分表上的数据隔离。
    • 数据库中单表的存储位置不受所在数据库存储位置的影响。创建单表时若未指定存储位置,则会被随机放置在一个存储节点上,且后续该PolarDB-X实例上创建的所有未指定存储位置的单表,均会被放置在该存储节点上。
  3. 创建成功后,您可以通过如下语句查看数据库的存储位置信息:
    SHOW CREATE DATABASE db1;

    返回结果如下:

    +----------+------------------------------------------------------------------------+
    | DATABASE | CREATE DATABASE                                                        |
    +----------+------------------------------------------------------------------------+
    | db1      | CREATE DATABASE `db1` /* LOCALITY = "dn=polardbx-storage-0-master" */  |
    +----------+------------------------------------------------------------------------+
    1 row in set
  4. 您还可以通过如下命令查看创建在该数据库下的逻辑分库和物理分库信息:
    SHOW DS;

    返回结果如下:

    +----+---------------------------+-----+------------------+------------+---------+
    | ID | STORAGE_INST_ID           | DB  | GROUP            | PHY_DB     | MOVABLE |
    +----+---------------------------+-----+------------------+------------+---------+
    | 0  | polardbx-storage-0-master | db1 | DB1_000000_GROUP | db1_000000 | 1       |
    | 1  | polardbx-storage-0-master | db1 | DB1_000001_GROUP | db1_000001 | 1       |
    | 2  | polardbx-storage-0-master | db1 | DB1_P00000_GROUP | db1_p00000 | 1       |
    | 3  | polardbx-storage-0-master | db1 | DB1_SINGLE_GROUP | db1_single | 0       |
    +----+---------------------------+-----+------------------+------------+---------+
    4 rows in set
    说明 以返回结果中ID为0的一行为例,表示在存储节点 polardbx-storage-0-master中的数据库db1下创建了逻辑分库DB1_000000_GROUP,物理分库db1_000000。

创建单表时指定存储位置

在创建单表时指定存储位置以实现数据的均匀分布。

说明 PolarDB-X的表分为两种,一种是分布式表,简称分表;一种是单表。创建单表时若未指定存储位置,则会被随机放置在一个存储节点上,且后续再创建的单表,均会被放置在该存储节点上,造成数据分布不均匀的情况。通过LOCALITY来指定单表存放于其他的存储节点,可以有效解决这一问题,实现数据的均匀分布。关于分布式表的信息,详情请参见 拆分函数
假设已有一个 PolarDB-X实例,该实例上已有 polardbx-storage-0-masterpolardbx-storage-1-master两个存储节点,其中 polardbx-storage-1-master上已创建了一个数据库 db1。现需要在 db1库中创建一张表,并指定其的存储位置为 polardbx-storage-0-master,语法如下:
CREATE TABLE tb1 (id int) LOCALITY='dn=polardbx-storage-0-master';
创建成功后,您可以通过如下语句查看该表的拓扑结构:
SHOW TOPOLOGY FROM tb1;

返回结果如下:

+----+------------------+------------+
| ID | GROUP_NAME       | TABLE_NAME | 
+----+------------------+------------+
| 0  | DB1_000000_GROUP | tb1        |
+----+------------------+------------+
1 row in set
说明 以上返回结果表示tb1表位于DB1_000000_GROUP分库。