postgresql数据库 TimescaleDB 定时压缩超表 删除超表(块)

自古美人都是妖i 提交于 2020-12-25 10:01:07

**

postgresql数据库 TimescaleDB 定时压缩超表 删除超表(块)

**
在工作中 使用postgresql数据库 TimescaleDB 时序库进行存储实时数据,采集的数据量过大,提供的内存不足,因此考虑如何保存数据

TimescaleDB数据库中的超级表
TimescaleDB数据库自身带着函数就可以实现
**
TimescaleDB数据库所携带函数
在这里插入图片描述
在这里插入图片描述




一 .压缩 SELECT compress_chunk()

**
为了尽量不丢失数据,避免删除数据 我首先考虑把数据压缩,用他自带的函数 SELECT compress_chunk()

1查询时间 show_chunks()

CREATE OR REPLACE FUNCTION "hrmw"."show_chunks"("hypertable" regclass=NULL::regclass, "older_than" any=NULL::unknown, "newer_than" any=NULL::unknown)
  RETURNS SETOF "pg_catalog"."regclass" AS '$libdir/timescaledb-1.7.1', 'ts_chunk_show_chunks'
  LANGUAGE c STABLE
  COST 1
  ROWS 1000

show_shunks() 用法

select show_shunks(); --查看所有块
select  show_shunks(超表名); --查看某个超表底下的所有块
SELECT show_chunks(older_than => INTERVAL '10 days', newer_than => INTERVAL '20 days');
-- 查询10天到20天的的块

来查询 180天的数据

SELECT show_chunks('超表名',older_than => INTERVAL '180 days', newer_than => INTERVAL '182 days');

2.compress_chunk()压缩函数

CREATE OR REPLACE FUNCTION "hrmw"."compress_chunk"("uncompressed_chunk" regclass, "if_not_compressed" bool=false)
  RETURNS "pg_catalog"."regclass" AS '$libdir/timescaledb-1.7.1', 'ts_compress_chunk'
  LANGUAGE c VOLATILE STRICT
  COST 1

2.1先把超表变成可压缩

ALTER TABLE '超表名' SET (
timescaledb.compress,
timescaledb.compress_segmentby = '主键(字段名)',
timescaledb.compress_orderby = '时间字段 DESC');

2.2压缩分区
–压缩 SELECT compress_chunk();
压缩180天的数据

SELECT compress_chunk( '_timescaledb_internal._hyper_4_238_chunk');
-- SELECT compress_chunk( '_timescaledb_internal.分区名(块)');

–查询压缩后空间状态

SELECT * FROM timescaledb_information.compressed_chunk_stats;

–解压缩

SELECT decompress_chunk('_timescaledb_internal._hyper_4_26_chunk');
-- SELECT decompress_chunk('_timescaledb_internal.分区名(块)');

3.运用函数 自动压缩 180天

CREATE 
	OR REPLACE FUNCTION "hrmw"."target_compress_chunk" ( ) RETURNS "pg_catalog"."void" AS $BODY$ DECLARE--定义变量
	t_accid VARCHAR;--变量
strSQL VARCHAR ( 1000 );
BEGIN--函数开始
	t_accid := ( SELECT show_chunks ( '超表名', older_than => INTERVAL '180 days', newer_than => INTERVAL '182 days' ) );
	strSQL := 'select compress_chunk(''' || t_accid || ''' ,true);';
	EXECUTE strSQL;
	
END;--结束
$BODY$ LANGUAGE plpgsql VOLATILE COST 100

**

4.添加 定时任务

**
(每天2:30 自动压缩 180天的分区(块))
运用postgresql数据库自带的pgadmin工具创建定时任务
需添加的代码:


SET search_path TO hrmw;
select hrmw.target_compress_chunk();--执行函数target_compress_chunk()

第一步
添加定时任务
第二部
在这里插入图片描述
在这里插入图片描述
第三步
确定定时任务时间
二 删除分区
因为压缩后数据还是不少 最后只能删除数据 删除半年前的数据
批量删除 可以用 drop_chunks()函数
我比较懒 我用了自动化策略
add_drop_chunks_policy()









 #创建策略 只保留保留最近半年的数据(直接删除块)
SELECT add_drop_chunks_policy('conditions', INTERVAL '6 months');

查询策略

select * from timescaledb_information.drop_chunks_policies;

每个超表只能有一个策略

字段名 描述
hypertable (REGCLASS)应用策略的超级表的名称
older_than (间隔)运行该策略时,将丢弃比此时间长得多的块
cascade (布尔值)是否在级联选项打开的情况下运行策略,这将导致依赖对象以及块被丢弃。
job_id (INTEGER)为实施drop_chunks策略而设置的后台作业的I
schedule_interval (间隔)作业运行的间隔
max_runtime (间隔)后台作业调度程序在停止作业之前将允许其运行的最长时间
max_retries (整数)如果作业失败,将重试该作业的次数
retry_period (间隔)调度程序在两次失败重试之间等待的时间

参考资料
https://blog.csdn.net/woai243779594/article/details/107544310?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control

到这里也基本完结了 如有问题 请留言或者私聊我
顺便说一句TimescaleDB 的资料太少了 一起来完善吧 ,谢谢

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!