Timescaledb 回写历史数据

最近一段时间因为工作的需要,一直在研究时序数据库,从InfluxDB到IOT DB,最后因为公司其他团队已确定使用Timescaledb,所以最后也就转向了Timescaledb。

我的工作分工主要是后台这块,实现和封装时序库常用的一些数据读写接口,最后卡在了回写历史数据的这个梗上。Timescaledb会对历史数据存储部分进行定期的压缩,已压缩的部分无法再进行更新、插入和删除。要对这部分数据进行操作,得手动解压,并涉及到压缩任务的停止和再启动的操作。查看官方文档发现针对回写数据有一个B的扩展包,经测试,可以解决回写的问题。

image.png

[以上内容摘自官方文档]

扩展包的Git地址

  1. 首先,对已压缩部分写入数据,报下面的错误
INSERT into htsdb_data_scada_float (time,value,id,quality) values ('2021-07-29 15:51:26.329',99.99,45,0)
> ERROR:  insert/update/delete not permitted on chunk "_hyper_93_6_chunk"
HINT:  Make sure the chunk is not compressed.
  1. 下面进行解决以上问题的相关操作
  • 在已安装好的Timescaledb环境上执行扩展包内的3个sql语句(本地TDB版本是2.1.x)


    image.png
  • 建立一张与原数据表结构完全一致的临时表
CREATE TEMPORARY TABLE htsdb_data_scada_float_temp AS SELECT * FROM htsdb_data_scada_float WITH NO DATA;
  • 将数据插入临时表
INSERT into htsdb_data_scada_float_temp (time,value,id,quality) values ('2021-07-29 15:51:26.329',99.99,45,0);
  • 调用decompress_backfill(扩展包提供)函数
CALL decompress_backfill(staging_table=>'htsdb_data_scada_float_temp', destination_hypertable=>'htsdb_data_scada_float');

按以上步骤操作后,历史数据回写成功,不用再去关心解压和压缩的操作,执行过程中将自动完成。

遗留问题:
如果某个时间点已存在值,backfill方法不会用新值替换旧值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容