创建列存快照

本文介绍如何创建、修改列存快照。

版本限制

实例版本需要在5.4.20及以上,且引擎版本为MySQL 5.7或MySQL 8.0。

说明

准备工作

在使用列存快照功能前,需要先调整数据库的一些参数配置。连接数据库后,执行如下步骤:

说明

PolarDB-X提供了多种连接数据库的方式。具体信息,请参见连接数据库

  • 执行如下代码,为所有写入事务开启严格的外部一致性保证:

    SET GLOBAL ENABLE_EXTERNAL_CONSISTENCY_FOR_WRITE_TRX = TRUE;
    说明
    • 需要使用高权限账号执行。

    • 返回结果中如果有warnings,则代表执行没成功,请检查您是否使用的是高权限账号。

    • 开启事务的严格外部一致性保证后,所有事务都会严格执行两阶段提交。

  • 关闭列存索引自适应心跳(可选):

    CALL polardbx.columnar_set_config('columnar_heartbeat_interval_ms_self_adaption', false);
    说明

    建议您关闭列存索引自适应心跳,以避免产生过多的元数据。

创建列存快照

列存快照是基于列存索引实现的,因此,您可以通过创建列存索引的语法CREATE CLUSTERED COLUMNAR INDEX,在其中特别指定columnar_options中的type参数为snapshot创建对应的列存快照。更多信息,请参见创建和使用CCI

语法

CREATE
    CLUSTERED COLUMNAR INDEX snapshot_name    
    ON tbl_name (index_sort_key_name,...)    
    [partition_options] 
    columnar_options='{
      "k1":"v1",
      "k2":"v2",
    }'

columnar_options:
    "type":"snapshot"
    "snapshot_retention_days":"7"
    "auto_gen_columnar_snapshot_interval":"30"

参数说明:

参数名称

是否必填

说明

type

是否创建该表的列存快照。取值如下:

  • snapshot:表示会创建相应的列存快照。

  • default(默认值):表示不创建列存快照。

snapshot_retention_days

列存快照的保留时间,单位为天,取值范围如下:

  • 大于等于1且小于等于366。

  • 默认值为7(如果存在全局设置则优先取全局设置),即列存快照保留时间为7天。

说明
  • 超过保留时间,系统不保证该快照一定能被查询到。

  • 该参数与设置时区无关。

  • 示例:

    snapshot_retention_days的值为7时,即在T0时刻生成的快照,会至少保留T0+7天,在T0+7天之后,不保证该快照一定能被查询到。

auto_gen_columnar_snapshot_interval

自动生成列存快照点的时间间隔,单位为分钟,取值范围如下:

  • 默认值为-1(如果存在全局设置则优先取全局设置),表示不会自动生成快照点。

  • 除默认值-1外,其余取值应大于等于5。

说明

设置后,每过auto_gen_columnar_snapshot_interval分钟,系统将自动调用CALL polardbx.columnar_flush(schema_name, table_name, index_name)生成一个快照点(第一次自动调用可能会有1分钟的延时),您也可以手动调用该指令生成快照。更多信息,请参见生成快照点

示例

创建列存快照有以下4种方式:

  • 在创建表的同时创建列存索引与列存快照:

    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`),
      CLUSTERED COLUMNAR INDEX `seller_snapshot` (`seller_id`)
        PARTITION BY HASH(`order_id`)
        PARTITIONS 16
        COLUMNAR_OPTIONS='{
          "type":"snapshot",
          "snapshot_retention_days":"7",
          "auto_gen_columnar_snapshot_interval":"30"
        }'
    ) ENGINE=INNODB DEFAULT CHARSET=UTF8 PARTITION BY HASH(`order_id`) PARTITIONS 16;
  • 使用CREATE CLUSTERED COLUMNAR INDEX语句为表创建列存索引与列存快照:

    CREATE CLUSTERED COLUMNAR INDEX `seller_snapshot` ON t_order (`seller_id`) 
    PARTITION BY HASH(`order_id`) 
    PARTITIONS 16 
    COLUMNAR_OPTIONS='{
      "type":"snapshot",
      "snapshot_retention_days":"7",
      "auto_gen_columnar_snapshot_interval":"30"
    }';
  • 使用ALTER语句,为表创建列存索引与列存快照:

    ALTER TABLE t_order ADD CLUSTERED COLUMNAR INDEX `seller_snapshot` (`seller_id`) 
    partition by hash(`order_id`) 
    partitions 16 
    columnar_options='{
      "type":"snapshot",
      "snapshot_retention_days":"10",
      "auto_gen_columnar_snapshot_interval":"30"
    }';
  • 为已有列存索引的表创建列存快照:

    CALL polardbx.columnar_set_config(<cci_id>, 'type', 'snapshot');
    说明

    其中cci_id为列存索引的ID,您可通过SHOW COLUMNAR STATUS语句来查看列存索引的ID。更多信息,请参见SHOW COLUMNAR STATUS

调整列存快照的属性

  • 为指定的列存快照调整保留时间和自动生成快照点的时间间隔,示例如下:

    -- 修改保留时间为10天
    CALL polardbx.columnar_set_config(<cci_id>, 'snapshot_retention_days', 10);
    
    -- 修改为每隔 10 分钟生成一个快照点
    CALL polardbx.columnar_set_config(<cci_id>, 'auto_gen_columnar_snapshot_interval', 10);
    
    -- 关闭自动生成快照点
    CALL polardbx.columnar_set_config(<cci_id>, 'auto_gen_columnar_snapshot_interval', -1);
  • 为列存快照的属性设置全局默认值,示例如下:

    -- 修改全局默认的自动生成快照点的时间间隔为20分钟
    CALL polardbx.columnar_set_config('auto_gen_columnar_snapshot_interval', 20);
    -- 修改全局默认的列存快照保留时间为7天
    CALL polardbx.columnar_set_config('snapshot_retention_days', 7);
    说明
    • 设置后,只对新建的列存快照生效,对已经创建的列存快照没有影响。

    • 创建列存快照时,如果不显式设置snapshot_retention_daysauto_gen_columnar_snapshot_interval 的值,系统会使用这两个参数的全局配置作为该列存快照的属性。

删除列存快照

  • 删除列存索引

    DROP INDEX `seller_snapshot` ON t_order;
  • 删除表

    DROP TABLE t_order;

查看列存快照定义

您可以通过如下代码,查看列存快照的定义:

SHOW FULL CREATE TABLE t_order;