在工作中 使用postgresql数据库 TimescaleDB 时序库进行存储实时数据,采集的数据量过大,提供的内存不足,因此考虑如何保存数据
TimescaleDB数据库中的超级表
TimescaleDB数据库自身带着函数就可以实现
为了尽量不丢失数据,避免删除数据 我首先考虑把数据压缩,用他自带的函数 SELECT compress_chunk()
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');
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
ALTER TABLE '超表名' SET (
timescaledb.compress,
timescaledb.compress_segmentby = '主键(字段名)',
timescaledb.compress_orderby = '时间字段 DESC');
–压缩 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.分区名(块)');
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
(每天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;
删除策略
SELECT remove_drop_chunks_policy('conditions');
每个超表只能有一个策略
字段名 | 描述 |
---|---|
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 的资料太少了 一起来完善吧 ,谢谢