M5Stackの有線化の理由にラズパイ3上のDB書き込みに失敗することがままあるためだったが、よくよく調べるとメモリ不足でinfluxdbが再起動しているためだった。
メモリ不足が起きるとtsmファイルが読み込めずに破損判定され、ファイル名に.badマークが付きファイルが持つ期間分のデータが欠損することになる。
しかし、実際にtsmファイルが壊れていることは少ないためリネームして戻してみたが再びbadとなることから、badマークのtsmをエクスポート・インポートする作業で戻せないかやってみた。
Grokやcopilotにいろいろ聞きながら手順が確立できたので、メモ。
- エクスポートのツールtsm_restoreをビルド
- .tsm.badをテキストでエクスポート
- テキストファイルをインポート
cacheサイズが48mでもcannot allocate memoryになっていたので16mまで落としたが、メモリ不足しないようであればリネームだけでも戻せるかもしれない。
【tsm_restoreのビルド】
githubよりcloneしたら、tsm_restoreディレクトリに移って下記を実行。
go mod tidyが暗号化pkgあたりでエラーで止まるが、そのままビルドに進んでもバイナリは生成された。
使用したgoはv1.15である。
$ sudo apt install golang $ go mod_init tsm_restore $ go mod tidy $ go build -o tsm_restore
【エクスポート・インポート】
パイプでつなぐと1行でエクスポートとインポートができる
$ sudo ./tsm_restore/tsm_restore -db <dbname> -rp <pilocyname> -p <filename.tsm.bad> | influx -import -path /dev/stdin - precision=ns
成功すると以下のように結果が出る
2025/12/11 18:16:43 Processed 0 commands 2025/12/11 18:16:43 Processed 44 inserts 2025/12/11 18:16:43 Failed 0 inserts
【influxdb.conf】
cache-max-memory-size = "16m" cache-snapshot-memory-size = "5m" series-id-set-cache-size = 100




