最近一段時(shí)間因?yàn)楣ぷ鞯男枰抑欤恢痹谘芯繒r(shí)序數(shù)據(jù)庫(kù)翎碑,從InfluxDB到IOT DB殖属,最后因?yàn)楣酒渌麍F(tuán)隊(duì)已確定使用Timescaledb颁糟,所以最后也就轉(zhuǎn)向了Timescaledb榛瓮。
我的工作分工主要是后臺(tái)這塊铺董,實(shí)現(xiàn)和封裝時(shí)序庫(kù)常用的一些數(shù)據(jù)讀寫接口,最后卡在了回寫歷史數(shù)據(jù)的這個(gè)梗上。Timescaledb會(huì)對(duì)歷史數(shù)據(jù)存儲(chǔ)部分進(jìn)行定期的壓縮精续,已壓縮的部分無(wú)法再進(jìn)行更新坝锰、插入和刪除。要對(duì)這部分?jǐn)?shù)據(jù)進(jìn)行操作重付,得手動(dòng)解壓顷级,并涉及到壓縮任務(wù)的停止和再啟動(dòng)的操作。查看官方文檔發(fā)現(xiàn)針對(duì)回寫數(shù)據(jù)有一個(gè)B的擴(kuò)展包确垫,經(jīng)測(cè)試弓颈,可以解決回寫的問(wèn)題。
[以上內(nèi)容摘自官方文檔]
- 首先删掀,對(duì)已壓縮部分寫入數(shù)據(jù)翔冀,報(bào)下面的錯(cuò)誤
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.
- 下面進(jìn)行解決以上問(wèn)題的相關(guān)操作
-
在已安裝好的Timescaledb環(huán)境上執(zhí)行擴(kuò)展包內(nèi)的3個(gè)sql語(yǔ)句(本地TDB版本是2.1.x)
- 建立一張與原數(shù)據(jù)表結(jié)構(gòu)完全一致的臨時(shí)表
CREATE TEMPORARY TABLE htsdb_data_scada_float_temp AS SELECT * FROM htsdb_data_scada_float WITH NO DATA;
- 將數(shù)據(jù)插入臨時(shí)表
INSERT into htsdb_data_scada_float_temp (time,value,id,quality) values ('2021-07-29 15:51:26.329',99.99,45,0);
- 調(diào)用decompress_backfill(擴(kuò)展包提供)函數(shù)
CALL decompress_backfill(staging_table=>'htsdb_data_scada_float_temp', destination_hypertable=>'htsdb_data_scada_float');
按以上步驟操作后,歷史數(shù)據(jù)回寫成功披泪,不用再去關(guān)心解壓和壓縮的操作纤子,執(zhí)行過(guò)程中將自動(dòng)完成。
遺留問(wèn)題:
如果某個(gè)時(shí)間點(diǎn)已存在值付呕,backfill方法不會(huì)用新值替換舊值计福。