**
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 | (间隔)调度程序在两次失败重试之间等待的时间 |
到这里也基本完结了 如有问题 请留言或者私聊我
顺便说一句TimescaleDB 的资料太少了 一起来完善吧 ,谢谢
来源:oschina
链接:https://my.oschina.net/u/4350128/blog/4839757