冷数据分层存储的开启和使用

本文介绍如何开启冷数据分层存储功能,以及开启功能后的使用方式。

使用限制

  • PolarDB PostgreSQL版Oracle语法兼容 2.0)且内核小版本为2.0.14.21.0及以上支持冷数据分层存储功能。

  • 开启冷数据分层存储功能后,无法关闭该功能,只能删除冷数据。如果没有存储数据,开启该功能本身不会产生费用。

  • 开启热备的PolarDB PostgreSQL版(兼容Oracle)集群不支持开启冷数据分层存储功能。

    说明

    如以上场景您需要开启冷数据分层存储功能,请联系我们处理。

  • 开启冷数据分层存储功能后,如果您的PolarDB PostgreSQL版(兼容Oracle)集群已经开启热备,不支持更换主可用区

    说明

    如以上场景您存在更换主可用区需求,请联系我们处理。

  • 暂不支持的DDL:

    • 暂不支持在OSS表空间中创建数据库:CREATE DATABASE dbname TABLESPACE OSS;

    • 暂不支持将已有数据库一次性转入OSS表空间:ALTER DATABASE dbname SET TABLESPACE OSS;

开启方式

  1. 购买按量付费集群购买包年包月集群,登录PolarDB控制台

  2. 单击目标集群ID,进入集群基本信息页。

  3. 在左侧导航栏选择配置与管理 > 冷数据分层存储,进入PolarDB冷数据分层存储页面。

  4. 单击一键开启,进入数据归档列表页面。

    image (1).png

  5. 在页面上可以查看实例基本信息数据归档列表,在数据归档列表一栏,可以分别查看整表归档列表分区表归档列表

说明
  • 如果当前还没有存入任何冷数据,数据归档列表会呈现空白状态。

  • 开启之后,数据默认存储在自带的云盘高速存储介质上,需要通过简单的处理才能将数据冷存,即转存入OSS。具体操作步骤请参考数据冷存的几种模式

数据冷存的几种模式

数据冷存是指将数据表/索引/物化视图转存入OSS,转存后不再占用或者极少量占用数据库云盘存储空间,从而大大降低数据库的存储成本。数据冷存后,所有的增删改查SQL都透明,无需做任何修改。

普通表/索引/物化视图冷存

  • 将已有数据表/索引/物化视图冷存。

    ALTER  TABLE  tblname  SET  TABLESPACE OSS;
    ALTER  INDEX  idxname  SET TABLESPACE OSS;
    ALTER Materialized View mvname SET TABLESPACE OSS;
    说明

    在对表执行ALTER TABLE tblname SET TABLESPACE OSS时,默认只会将表本身的数据转存至OSS,表上建立的索引需要单独再执行ALTER INDEX才能将索引数据也转存至OSS。

  • 直接在OSS存储中新建数据表/索引/物化视图。

    • 方式一:CREATE时指定TABLESPACE OSS。

      CREATE TABLE tblname (...) TABLESPACE OSS;
      CREATE TABLE tblname(...) TABLESPACE OSS as SELECT ...;
      CREATE INDEX idxname ON tblname(columnname) TABLESPACE OSS;
      CREAE INDEX idxname ON tblename USING GiST(columnname) TABLESPACE OSS;
      CREATE MATERIALIZED VIEW table_name TABLESPACE OSS AS query [ WITH [ NO ] DATA ];
    • 方式二:设置默认表空间为OSS表空间。

      SET default_tablespace = 'oss';
      CREATE  TABLE  tblname  (...) ;
      CREATE  INDEX  idxname ON  tblname(columnname);
      CREAE  INDEX  idxname  ON tblename USING GiST(columnname);
      CREATE MATERIALIZED VIEW  table_name  AS query [ WITH [ NO ] DATA ];
      说明

      这种方式设置默认表空间为OSS后,所有的创建表、索引、物化视图操作都会直接将对象建立在OSS存储上。如果不需要创建冷存对象时,需要将默认表空间进行重置:

      RESET default_tablespace;

LOB字段独立冷存

LOB字段是指PolarDB PostgreSQL版(兼容Oracle)中的blob、text、json、jsonb、array类型以及时空类型字段,这些类型往往单个对象较大,占用的存储空间较多,但更新频率不高。为了支持这类场景的降本需求,PolarDB PostgreSQL版(兼容Oracle)冷数据分层存储功能支持将大对象字段单独进行冷存,其余字段的存储保持不变。LOB字段支持SQL一键冷存,具体使用方式如下:

--创建带有大对象字段的表
CREATE TABLE  test_large_object(id serial, val text);

--将大对象字段独立冷存
ALTER TABLE test_large_object alter column val set (storage_type='oss');

--写入大对象数据,此时写入的text字段内容存储在OSS上
INSERT INTO test_large_object(val) VALUES((SELECT string_agg(random()::text, ':') FROM generate_series(1, 10000)));
说明

需要提前设置大对象字段的存储为OSS,之后写入的数据才会存入OSS。

分区表冷存

分区表是一种比较常见的冷存对象,在冷存功能使用上有一些特殊的方式。

  • 全部分区表冷存。

    • 方式一:依次将已经存在的分区子表转为冷存。

      --prt1为分区表(父表)
      --prt1_p1为prt1的子表
      --prt2_p2为prt1的另一张子表
      --对所有的子表执行alter操作
      ALTER  TABLE  prt1_p1  SET  TABLESPACE OSS;
      ALTER  TABLE  prt1_p2  SET  TABLESPACE OSS;
    • 方式二:将分区表主表直接创建在OSS tablespace上。

      CREATE TABLE prt1 (a int, b int) PARTITION BY RANGE(a) TABLESPACE OSS;
      
      --分区子表默认都继承了父亲tablespace属性,直接将表创建在oss tablespace上
      CREATE TABLE prt1_p1 PARTITION OF prt1 FOR VALUES FROM (0) TO (250);
      CREATE TABLE prt1_p2 PARTITION OF prt1 FOR VALUES FROM (250) TO (500);
    • 方式三:设置默认表空间为OSS表空间后再创建分区表。

      SET default_tablespace = 'oss';
      CREATE  TABLE  prt1 (a int, b int) PARTITION BY RANGE(a);
      CREATE TABLE prt1_p1 PARTITION OF prt1 FOR VALUES FROM (0) TO (250);
      CREATE TABLE prt1_p2 PARTITION OF prt1 FOR VALUES FROM (250) TO (500);
  • 部分分区子表冷存:

    当只需要将已过期(低频访问)的分区子表转为冷数据时,可以直接对子表进行更换表空间操作。未过期(高频访问)的分区子表无需任何改变,仍存储在数据库云盘中,这样既不影响分区表的访问性能,又降低了存储成本。

    --prt1为分区表(父表)
    --prt1_p1为prt1的未过期子表
    --prt2_p2为prt1的已过期子表
    --对已过期子表执行alter操作
    ALTER  TABLE  prt1_p2  SET  TABLESPACE OSS;

数据冷热分层

冷数据物化缓存

您可以通过修改polar_smgrcache_size参数来设置冷数据物化缓存的大小。

  1. 登录PolarDB控制台

  2. 单击目标集群ID,进入集群基本信息页。

  3. 在左侧导航栏选择配置与管理 > 参数配置,找到polar_smgrcache_size参数,单击修改参数

  4. 参考以下示例设置polar_smgrcache_size参数。

    设置值

    缓存大小

    0

    0(缓存被关闭)

    1

    1 GB

    2

    2 GB

    128

    128 GB(当前支持的最大值)

  5. 单击左上角的提交修改,在弹出的保存改动对话框中,单击确定。修改该参数后,集群会重启。

说明
  • PolarDB PostgreSQL版(兼容Oracle)在开启冷数据分层存储功能时,默认会在云盘上开辟很小量的物化缓存空间,用于存储元数据及一些IO合并。如果要追求更高的性能,可根据数据量及使用场景在控制台将物化缓存做调整,调整后重启数据库立即生效。

  • 开启并使用了冷数据分层存储功能后,如果将polar_smgrcache_size参数调整为0,则会关闭缓存功能,这可能会导致崩溃恢复变得非常慢,且重启期间无法重新打开该参数。如果出现这种情况,可以联系我们申请重新打开缓存功能,加速崩溃恢复。

开启冷数据物化缓存后,您可以通过如下方式查询缓存使用情况:

-- 创建扩展
CREATE extension polar_monitor;

-- 查询物化缓存基本使用情况
SELECT * FROM polar_smgrcaches;

-- 字段说明:
  -- smgrcache:缓存id
  -- relfilenode:该缓存对应的表文件
  -- relchunknumber:该缓存在表文件中的位置
  -- nblocks:该缓存的大小
  -- dirty:是否为脏
  -- usagecount:使用计数
  -- pinning_backends:引用计数

-- 强制将物化缓存刷到OSS中
SELECT polar_flush_smgrcache(); 

-- 强制淘汰物化缓存
SELECT polar_evict_smgrcache(); 

冷数据的访问

冷数据增删改查

冷存数据(即已经存储在OSS表空间中的对象)做增删改查的SQL都是透明的,无需进行任何改动。

冷数据恢复

数据转存至OSS时会进行压缩处理,如果要将已经存储在OSS中的数据恢复至云盘存储,需确保云盘上有足够的存储空间,通常要比OSS上的存储空间增大约1.4~4倍。

冷数据清除

删除冷存表/索引/物化视图的SQL也是透明的,无需进行任何改动。

DELETE  FROM tblname WHERE ...;
TRUNCATE  TABLE  tblname;
DROP  TABLE  tblname;
...