最近一段时间因为工作的需要,一直在研究时序数据库,从InfluxDB到IOT DB,最后因为公司其他团队已确定使用Timescaledb,所以最后也就转向了Timescaledb。
我的工作分工主要是后台这块,实现和封装时序库常用的一些数据读写接口,最后卡在了回写历史数据的这个梗上。Timescaledb会对历史数据存储部分进行定期的压缩,已压缩的部分无法再进行更新、插入和删除。要对这部分数据进行操作,得手动解压,并涉及到压缩任务的停止和再启动的操作。查看官方文档发现针对回写数据有一个B的扩展包,经测试,可以解决回写的问题。
image.png
[以上内容摘自官方文档]
- 首先,对已压缩部分写入数据,报下面的错误
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.
- 下面进行解决以上问题的相关操作
-
在已安装好的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方法不会用新值替换旧值。