暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PolarDB MySQL之分区表创建只读分区和创建混合分区

xiaozhuo 2024-07-29
166

创建只读分区

更新时间:2023-12-18 16:29:19

您可以将分区和二级子分区设置为只读状态,用于保护数据不受任何用户或触发器执行的DML操作的影响。

只读分区如下图所示:只读分区

语法

  • 新建表时创建只读分区

     
    CREATE TABLE [IF NOT EXISTS] [schema.]table_name
        table_definition [READ {ONLY | WRITE}]
        partition_options;

    其中partition_options为:

     
    PARTITION BY
        { RANGE{(expr) | COLUMNS(column_list)} }
        [(partition_definition [, partition_definition] ...)]

    partition_definition为:

     
        PARTITION partition_name
            [VALUES LESS THAN {expr | MAXVALUE}]
            [READ {ONLY | WRITE}]
            [[STORAGE] ENGINE [=] engine_name]
            [COMMENT [=] 'string' ]
            [DATA DIRECTORY [=] 'data_dir']
            [INDEX DIRECTORY [=] 'index_dir']
            [MAX_ROWS [=] max_number_of_rows]
            [MIN_ROWS [=] min_number_of_rows]
            [TABLESPACE [=] tablespace_name]




  • 修改表时创建只读分区

     
    ALTER TABLE tbl_name
        [alter_option [, alter_option] ...]
        [partition_options]

    其中partition_options为:

     
    partition_options:
        partition_option [partition_option] ...

    partition_option为:

     
    partition_option: {
        ADD PARTITION (partition_definition)

    partition_definition为:

     
        PARTITION partition_name
            [VALUES LESS THAN {expr | MAXVALUE}]
            [READ {ONLY | WRITE}]
            [[STORAGE] ENGINE [=] engine_name]
            [COMMENT [=] 'string' ]
            [DATA DIRECTORY [=] 'data_dir']
            [INDEX DIRECTORY [=] 'index_dir']
            [MAX_ROWS [=] max_number_of_rows]
            [MIN_ROWS [=] min_number_of_rows]
            [TABLESPACE [=] tablespace_name]

    其中alter_option为:

     
    alter_option: {
        table_options
      | ADD [COLUMN] col_name column_definition
            [FIRST | AFTER col_name]
      | ADD [COLUMN] (col_name column_definition,...)
      | ADD {INDEX | KEY} [index_name]
            [index_type] (key_part,...) [index_option] ...
      | ADD {FULLTEXT | SPATIAL} [INDEX | KEY] [index_name]
            (key_part,...) [index_option] ...
      | ADD [CONSTRAINT [symbol]] PRIMARY KEY
            [index_type] (key_part,...)
            [index_option] ...
      | ADD [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY]
            [index_name] [index_type] (key_part,...)
            [index_option] ...
      | ADD [CONSTRAINT [symbol]] FOREIGN KEY
            [index_name] (col_name,...)
            reference_definition
      | ADD [CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]
      | DROP {CHECK | CONSTRAINT} symbol
      | ALTER {CHECK | CONSTRAINT} symbol [NOT] ENFORCED
      | ALGORITHM [=] {DEFAULT | INSTANT | INPLACE | COPY}
      | ALTER [COLUMN] col_name {
            SET DEFAULT {literal | (expr)}
          | SET {VISIBLE | INVISIBLE}
          | DROP DEFAULT
        }
      | ALTER INDEX index_name {VISIBLE | INVISIBLE}
      | CHANGE [COLUMN] old_col_name new_col_name column_definition
            [FIRST | AFTER col_name]
      | [DEFAULT] CHARACTER SET [=] charset_name [COLLATE [=] collation_name]
      | CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
      | {DISABLE | ENABLE} KEYS
      | {DISCARD | IMPORT} TABLESPACE
      | DROP [COLUMN] col_name
      | DROP {INDEX | KEY} index_name
      | DROP PRIMARY KEY
      | DROP FOREIGN KEY fk_symbol
      | FORCE
      | LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}
      | MODIFY [COLUMN] col_name column_definition
            [FIRST | AFTER col_name]
      | ORDER BY col_name [, col_name] ...
      | RENAME COLUMN old_col_name TO new_col_name
      | RENAME {INDEX | KEY} old_index_name TO new_index_name
      | RENAME [TO | AS] new_tbl_name
      | {WITHOUT | WITH} VALIDATION
    }

分区表创建混合分区

产品详情

您可以通过创建混合分区(Hybrid Partition)的方式来访问存储在不同引擎中的数据。

混合分区原理如下图所示:


混合分区的基本原理是将分区表中的分区存储在不同的存储介质上,以达到冷热数据分离管理的目的。比如将热数据存储在本地PFS上,冷数据存储在OSS上,这样可以极大地降低冷数据的存储成本,且不影响热数据的查询性能,也不影响对热数据执行DML操作。

说明
  • 创建混合分区表功能目前处于灰度阶段。如需使用,请前往配额中心,根据配额IDpolardb_mysql_hybrid_partition找到配额名称,在对应的操作列单击申请来开通该功能。

  • 如需了解更多关于创建混合分区的内容,请搜索钉钉群号加群进行咨询。钉钉群号:24490017825。

前提条件

  • 集群版本需为PolarDB MySQL版8.0.2版本且Revision version为8.0.2.2.5及以上。您可以通过查询版本号来确认集群版本。

  • OSS上已存在需要创建的分区的数据文件,且数据文件名称需要符合以下命名规则:

    • 扩展名和分区标记需大写。

    • 表名和分区名与数据库中的名称保持一致。

    示例:假设表t1p1分区为CSV引擎,则该分区的数据文件命名为:t1#P#p1.CSV

注意事项

  • 创建的混合分区表至少需要包含一个在InnoDB引擎上创建的分区。

  • 创建包含二级分区的混合分区表时,一级分区的引擎必须和表的引擎保持一致,且二级分区至少需要包含一个在InnoDB引擎上创建的分区。

  • 混合分区表的分区类型目前仅支持RANGELIST 类型。

  • 暂不支持对混合分区表中的OSS分区执行DML操作(包括INSERTUPDATEDELETELOAD)。

  • 集群版本为PolarDB MySQL版8.0.2.2.17版本及以上时,支持对混合分区表执行ADDDROP操作。其它版本暂不支持对混合分区表执行ADDDROP操作。

参数说明

使用混合分区表时,您可以根据实际使用场景在PolarDB集群的参数配置中设置以下参数。

参数

说明

loose_hybrid_partition_query_mix_engine_enabled

查询混合分区表时,是否查询非InnoDB引擎中的分区数据。取值如下:

  • ON(默认):查询混合分区表时,查询非InnoDB引擎中的分区数据。

  • OFF:查询混合分区表时,不查询非InnoDB引擎中的分区数据。

创建混合分区

您可以通过已有的OSS Server来创建混合分区,如果当前不存在OSS Server,您可以通过以下语法来创建OSS Server:

 
CREATE SERVER oss_server_name
FOREIGN DATA WRAPPER oss
OPTIONS(EXTRA_SERVER_INFO '{"oss_endpoint": "<my_oss_endpoint>",
"oss_bucket": "<my_oss_bucket>", "oss_access_key_id": "<my_oss_access_key_id>",
"oss_access_key_secret": "<my_oss_access_key_secret>", "oss_prefix":"<my_oss_prefix>", "oss_sts_token": "<my_oss_sts_token>"}');
说明

集群版本为PolarDB MySQL版8.0.2版本且Revision version为8.0.2.2.6及以上时,支持使用my_oss_sts_token参数。

参数说明如下表所示:

参数

类型

备注

oss_server_name

字符串

OSS server名称。

说明

该参数为全局参数,且全局唯一。该参数不区分大小写,最大长度不超过64个字符,超过64个字符的名称会被自动截断。您可以将OSS server名称指定为带引号的字符串。

my_oss_endpoint

字符串

OSS对应区域的域名。

说明

如果是从阿里云的主机访问数据库,应该使用内网域名(即带有“internal”的域名),避免产生公网流量。

my_oss_bucket

字符串

数据文件所在OSS的bucket,需要通过OSS预先创建。

my_oss_access_key_id

字符串

OSS账号ID。

my_oss_access_key_secret

字符串

OSS账号KEY。

my_oss_prefix

字符串

OSS路径前缀。用于指定数据文件的存放路径。不能包含特殊字符,也不能为空。

my_oss_sts_token

字符串

OSS临时访问凭证。获取OSS临时访问凭证详情请参见获取临时访问凭证

说明

my_oss_sts_token参数值有默认的过期时间。如果my_oss_sts_token已过期,您需要通过以下命令重置EXTRA_SERVER_INFO中的全部参数值。

 
ALTER SERVER server_name OPTIONS(EXTRA_SERVER_INFO '{"oss_endpoint": "<my_oss_endpoint>",
"oss_bucket": "<my_oss_bucket>", "oss_access_key_id": "<my_oss_access_key_id>",
"oss_access_key_secret": "<my_oss_access_key_secret>", "oss_prefix":"<my_oss_prefix>", "oss_sts_token": "<my_oss_sts_token>"}');

创建混合分区表,示例如下:

 
CREATE TABLE t2(a1 INT, a2 VARCHAR(30), a3 VARCHAR(256))
CONNECTION = "oss_server_name"
PARTITION BY RANGE(a1)
(
   PARTITION p1 values less than (1000) ENGINE = CSV,
   PARTITION p2 values less than (2000) ENGINE = CSV,
   PARTITION p3 values less than (3000) ENGINE = INNODB
);

查询混合分区

您可以通过以下两种方式来查询不同引擎的分区数据。

  • 在控制台将 hybrid_partition_query_mix_engine_enabled参数设置为ON,执行查询语句时,查询结果中就会包含非InnoDB分区的数据。示例如下:

     
    SELECT * FROM t1;

    其中,t1表示需要查询的混合分区表。

  • 在控制台将 hybrid_partition_query_mix_engine_enabled参数设置为OFF,查询指定分区中的数据。示例如下:

     
    SELECT * FROM t1 partition (p1);

    其中,t1表示需要查询的混合分区表,p1表示需要查询的分区。

最后修改时间:2024-07-29 10:09:47
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论