PolarDB-X支持通过LOCALITY来指定数据库或表的存储位置,以实现数据隔离或数据的均匀分布。本文介绍如何使用LOCALITY。

前提条件

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

语法

您可以在创建数据库或表的时候,通过LOCALITY来指定库表的存储位置,具体语法如下:

说明 通过LOCALITY语法指定了数据库或单表的位置之后,不支持再修改该库或该表的存储位置。
  • 创建数据库时指定该库的存储位置,语法如下:
    CREATE DATABASE db_name [LOCALITY=locality_option];
    
    locality_option:
        'dn=storage_inst_id_list'
        
    storage_inst_id_list:
        storage_inst_id[,storage_inst_id_list]
  • 创建单表时指定该表的存储位置,语法如下:
    CREATE TABLE tbl_name (create_definition, ...) [LOCALITY=locality_option];
    locality_option:
        'dn=storage_inst_id_list'
        
    storage_inst_id_list:
        storage_inst_id[,storage_inst_id_list]

示例

  • 在创建数据库时指定存储位置以实现数据隔离。
    1. 假设已有一个PolarDB-X 2.0实例,您可以通过如下命令查看实例中的存储节点:
      mysql> 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节点:
      mysql> CREATE DATABASE db1 LOCALITY='dn=polardbx-storage-0-master';
      说明
      • 若在创建数据库时未指定数据库的存储位置,系统将默认在所有存储节点中均匀分布数据库。
      • 数据库中分表的存储位置与该库的存储位置保持一致,以实现分表上的数据隔离。
      • 数据库中单表的存储位置不受该库存储位置的影响。创建单表时若未指定存储位置,则会被随机放置在一个存储节点上,且后续该PolarDB-X实例上创建的所有未指定存储位置的单表,均会被放置在该存储节点上。
    3. 创建成功后,您可以通过如下语句查看数据库的存储位置信息:
      mysql> SHOW CREATE DATABASE db1;

      返回结果如下:

      +----------+------------------------------------------------------------------------+
      | DATABASE | CREATE DATABASE                                                        |
      +----------+------------------------------------------------------------------------+
      | db1      | CREATE DATABASE `db1` /* LOCALITY = "dn=polardbx-storage-0-master" */  |
      +----------+------------------------------------------------------------------------+
      1 row in set
    4. 您还可以通过如下命令查看创建在该数据库下的逻辑分库和物理分库信息:
      mysql> 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 2.0实例,该实例上已有polardbx-storage-0-masterpolardbx-storage-1-master两个存储节点,其中polardbx-storage-1-master上已创建了一个数据库db1。现需要在db1库中创建一张表,并指定其的存储位置为polardbx-storage-0-master,语法如下:
    mysql>CREATE TABLE tb1 (id int) LOCALITY='dn=polardbx-storage-0-master';
    创建成功后,您可以通过如下语句查看该表的拓扑结构:
    mysql>SHOW TOPOLOGY FROM tb1;

    返回结果如下:

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