NEWS
Pflege der InfluxDB
-
otto@neuheizung:~ $ influx bucket list --org privat --token KTLmduvh_2ocvh25GueyRrQmob_hcMaVqg2XJUnEuE2iFYhhretw-PtP-sBEAsQiQOD0u68fhpwFnmrBAZXYZ== ID Name Retention Shard group duration Organization ID Schema Type bd3baaf8e14d8ac9 _monitoring 168h0m0s 24h0m0s 2d3c37361d7b8576 implicit 3fa5f9c2ffa043d0 _tasks 72h0m0s 24h0m0s 2d3c37361d7b8576 implicit 7b6dd0929a6bb818 iobroker 17520h0m0s 168h0m0s 2d3c37361d7b8576 implicit -
OK. keine Wildcards. Direkt eingegeben:
influx delete --bucket iobroker --token KTLmduvh_2ocvh25GueyRrQmob_hcMaVqg2XJUnEuE2iFYhhretw-PtP-sBEAsQiQOD0u68fhpwFnmrBAZeXYZ== --org privat --start 1970-01-01T00:00:00Z --stop '2030-12-31T23:59:59Z' --predicate '_measurement="storage_bucket_measurement_num"'löscht auch nicht.
@Laser sagte in backitup Speicherort:
OK. keine Wildcards. Direkt eingegeben:
influx delete --bucket iobroker --token KTLmduvh_2ocvh25GueyRrQmob_hcMaVqg2XJUnEuE2iFYhhretw-PtP-sBEAsQiQOD0u68fhpwFnmrBAZeXYZ== --org privat --start 1970-01-01T00:00:00Z --stop '2030-12-31T23:59:59Z' --predicate '_measurement="storage_bucket_measurement_num"'löscht auch nicht.
Hm, dann sollte das gehen. Wie stellst du fest, dass das Measurement nicht gelöscht wurde? Und ist der Scraper gelöscht?
-
-
Ich habe die Benutzeroberfläche der influxDB geöffnet. Im Data Explorer suche ich z.B. nach "storage". Alle Measurements mit "storage" werden gelistet. Das zu löschende ist immer wieder vorhanden. Auch mit alter Zeit.@Laser sagte in backitup Speicherort:
Das zu löschende ist immer wieder vorhanden
Die Liste wird erst nach einem richtigen Refresh der Seite aktualisiert.
-
@Laser sagte in backitup Speicherort:
OK. keine Wildcards. Direkt eingegeben:
influx delete --bucket iobroker --token KTLmduvh_2ocvh25GueyRrQmob_hcMaVqg2XJUnEuE2iFYhhretw-PtP-sBEAsQiQOD0u68fhpwFnmrBAZeXYZ== --org privat --start 1970-01-01T00:00:00Z --stop '2030-12-31T23:59:59Z' --predicate '_measurement="storage_bucket_measurement_num"'löscht auch nicht.
Hm, dann sollte das gehen. Wie stellst du fest, dass das Measurement nicht gelöscht wurde? Und ist der Scraper gelöscht?
Dann fällt mir nur noch ein:
Und ist der Scraper gelöscht?
Der würde nämlich sofort die Measurements wieder anlegen.
EDIT: und in deinem Screenshot sehe ich das Measurement "storage_bucket_measurement_num" nicht.
-
ich hab das mal abgetrennt und verschoben
hat ja mit bsckitup nichts mehr zu tun.hoffentlich hab ich nichts vergessen
-
OK. Das ist richtig. Über backitup bin ich nur drauf gekommen, weil die Datenbank so riesig war und backitup streikte. Wo ist es denn jetzt?
-
Mein NAS ist ein Eigenbau mit Banana Pi. Und openmediavault. Da kann ich nur Version3 auswählen. Keine Unterversion. Wenn das Backup fertig ist, stelle ich im Backitup auf 3.1.1. Möchte jetzt nicht eingreifen. Die Datenbank ist wirklich riesig. Und wächst unaufhaltsam. Vermutlich speichere ich immer noch unnötig viele Daten. Ändern- da habe ich Bedenken, daß Alles auf einmal weg ist.
@Laser sagte in Pflege der InfluxDB:
Ändern- da habe ich Bedenken, daß Alles auf einmal weg ist
Hi,
die InfluxDB kann man doch auch mit SQL-Befehlen bedienen, soweit ich aus der Doku sehe. Ich verwende als langjähriger SQL-Datenbank-Entwickler lieber die mysql, aber die Befehlsstruktur ist sehr ähnlich:
mysql: SELECT * FROM iobroker.ts_number WHERE ts <= xxxxxxxx; Zum Löschen alter Daten **(VORSICHT, DATENBANK VORHER UNBEDINGT SICHERN!!)** DELETE FROM iobroker.ts_number WHERE ts <= xxxxxxxx; InfluxDB: SELECT * FROM "absolutismus" WHERE time = '2016-07-31T20:07:00Z'Der IOB sammelt die Daten [Edit Begin] aller Datenpunkte, bei denen die DB-Speicherung aktiviert ist, [Edit end] in der Datenbank-Tabelle "ts_number" und diese wird schnell sehr groß, wenn man im Sekundentakt speichert. Mein Backup zur mysql-DB hat jetzt nach einem Jahr etwa 4 MB.
Die 2 wichtigsten Tabellen sind:

In der Tabelle "datapoints" legt der IOB die Datenpunkte bei denen die DB-Speicherung aktiviert ist, als Referenz zur Tabelle "ts_Number" an:

Und damit kann man die Datenmengen schon gut im Zaum halten ;-) Vielleicht hilft euch das etwas. Fragen generell zu SQL kann ich gern beantworten.
Gruß, Fuzzy
-
@Laser sagte in Pflege der InfluxDB:
Das wäre wieder eine neue Baustelle
Umstellen würde ich auch nicht. Aber wenn die Ähnlichkeiten zwischen InfluxDB und MYSQL sehr ähnlich sind, könntest du das Knowhow von mysql nutzen. Ich werde mal auf meinem Testsystem die InfluxDB ansehen.
-
Ich habe diese Baustelle auch, aber das Anwachsen der Datenbank ist bei mir aufgrund dessen beschränkt, dass mein iobroker bucket in der influx Datenbank eine Retain-Zeit von einem Jahr hat.

Wenn man Daten für ein Jahr aufgehäuft hat, und keine neuen Datenreihen hinzugekommen sind, sollte DIESES Bucket nicht mehr größer werden, weil hinten so viele Daten herausfallen, wie vorne neu hinzukommen...Hatte mir eigentlich vorgenommen, weitere "Langzeit" Buckets anzulegen, in die gewisse Datenreihen durch Agenten aus dem Jahres-Bucket vor dem Löschen transferiert werden.
Nach drei Jahren interessiert es nicht mehr wie die Momentan-Leistungsaufnahme am Stromzähler am 15.2.2023 um 16:30 war ... Da will man vielleicht noch wissen, wie viel Strom im Februar 2023 verbraucht worden ist ....
Bin aber bisher nicht dazu gekommen ...
Seit Dezember ist meine alte Gasheizung durch eine Wärmepumpe ersetzt, und jetzt wird es eigentlich dringend, man will ja vergleichen, was die Energieverbräuche angeht ... und wenn die Gas-Messreihen langsam weggefressen werden ....
https://docs.influxdata.com/influxdb/v2/process-data/common-tasks/downsample-data/
-
@Laser sagte in Pflege der InfluxDB:
Ändern- da habe ich Bedenken, daß Alles auf einmal weg ist
Hi,
die InfluxDB kann man doch auch mit SQL-Befehlen bedienen, soweit ich aus der Doku sehe. Ich verwende als langjähriger SQL-Datenbank-Entwickler lieber die mysql, aber die Befehlsstruktur ist sehr ähnlich:
mysql: SELECT * FROM iobroker.ts_number WHERE ts <= xxxxxxxx; Zum Löschen alter Daten **(VORSICHT, DATENBANK VORHER UNBEDINGT SICHERN!!)** DELETE FROM iobroker.ts_number WHERE ts <= xxxxxxxx; InfluxDB: SELECT * FROM "absolutismus" WHERE time = '2016-07-31T20:07:00Z'Der IOB sammelt die Daten [Edit Begin] aller Datenpunkte, bei denen die DB-Speicherung aktiviert ist, [Edit end] in der Datenbank-Tabelle "ts_number" und diese wird schnell sehr groß, wenn man im Sekundentakt speichert. Mein Backup zur mysql-DB hat jetzt nach einem Jahr etwa 4 MB.
Die 2 wichtigsten Tabellen sind:

In der Tabelle "datapoints" legt der IOB die Datenpunkte bei denen die DB-Speicherung aktiviert ist, als Referenz zur Tabelle "ts_Number" an:

Und damit kann man die Datenmengen schon gut im Zaum halten ;-) Vielleicht hilft euch das etwas. Fragen generell zu SQL kann ich gern beantworten.
Gruß, Fuzzy
sagte in Pflege der InfluxDB:
Und damit kann man die Datenmengen schon gut im Zaum halten
Weitere Tipps zur Vermeidung der Datenflut:
Erstellen einer neuen Datenbanktabelle "statistik".

CREATE TABLE iobroker.statistik( id INTEGER NOT NULL AUTO_INCREMENT, name TEXT NOT NULL, date DATETIME NOT NULL, val INT NOT NULL, PRIMARY KEY (id,date)) ENGINE = InnoDB; CREATE INDEX IX_statistik01 ON iobroker.statistik(name);[Edit] Erstellen eines JavaScripts "Jahresabschluss" (läuft nur einmal im Jahr am 2.1.):
const idStatistikdaten = 'alias.0.Diagrammdaten.Statistikdaten'; let dtHeute = new Date(Date.now()); let intVJahr = dtHeute.getFullYear() - 1; let intVVJahr = dtHeute.getFullYear() - 2; let strSQL; let IntAnzDS = 0; function sendToPromise(iSQL) { return new Promise((resolve, reject) => { sendTo('sql.0', 'query', iSQL, function (result) { try { IntAnzDS = JSON.stringify(result.result); IntAnzDS = JSON.stringify(result.result); IntAnzDS = IntAnzDS.replace('[{"AnzahlDS":', ''); IntAnzDS = Number(IntAnzDS.replace('}]', '')); resolve(IntAnzDS); } catch { console.error(result.error); } }); }); } //------------- Prüfen, ob Vorjahresdaten in der Statistik bereits vorhanden sind -> Abbruch -------------------------------- (async () => { try { strSQL = "SELECT COUNT(id) as AnzahlDS FROM iobroker.statistik WHERE DATE_FORMAT(date, '%Y') = " + intVJahr + ";"; const res = await sendToPromise(strSQL); //const count = Number(res?.result?.[0]?.AnzahlDS ?? res?.rows?.[0]?.AnzahlDS ?? 0); //console.log('AnzahlDS:'+ IntAnzDS); await DatenbankAktualisieren(IntAnzDS); } catch (err) { console.error('Fehler:', err); } })(); function DatenbankAktualisieren (iCount) { if (iCount == 0) { //------------- JahresMonatsdaten in die Tabelle iobroker.statistik verdichten -------------------------------- strSQL = "INSERT INTO iobroker.statistik (id, name, date, val) " + "SELECT id, name, DATE_FORMAT(tsDate, '%Y-%m-01 00:00:00') as Datum, CONVERT(SUM(val), INT) as val " + "FROM iobroker.vw_number " + "WHERE DATE_FORMAT(tsDate, '%Y') = " + intVJahr + " " + "GROUP BY id, name, DATE_FORMAT(tsDate, '%Y-%m') " + "ORDER BY id, name, DATE_FORMAT(tsDate, '%Y-%m');"; sendTo('sql.0', 'query', strSQL, function (result) { if (result.error) { console.error(result.error); } else { setState (idStatistikdaten,JSON.stringify(result.result)); } }); //------------- alte JahresMonatsdaten löschen -------------------------------- strSQL = "DELETE FROM iobroker.ts_number WHERE SUBSTRING(from_unixtime(SUBSTRING(ts, 1, 10)),1,4) = " + intVVJahr + ";"; sendTo('sql.0', 'query', strSQL, function (result) { if (result.error) { console.error(result.error); } else { console.log("Die Daten des Jahres " + intVVJahr + " wurden gelöscht."); } }); console.log("Die Daten von " + intVJahr + " wurden in die Tabelle statistik verdichtet angefügt (YYYY-MM-01)"); } else { console.log("Das Jahr " + intVJahr + " wurde bereits abgeschlossen "); } }[Edit] Mit der Tabelle "statistiken" lassen sich nahezu beliebig viele Vorjahre auswerten oder in Diagrammen darstellen. Natürlich kann man die Abfragebedingungen erweitern, so dass nur bestimmte Datenpunkte in die Statistiktabelle laufen (z.B. WHERE id in (1,25,67,123,555 ...).
Fragen zu SQL-Datenbanken kann ich gern beantworten.
Gruß, Fuzzy
-
Ich habe vor einiger Zeit ein Skript zum Löschen Alter InfuxDB Measurements geschrieben. Dieses kann Datenpunkte die nicht mehr aktualisiert werden recht einfach löschen. Eventuell hilft euch dies weiter. 😜
https://forum.iobroker.net/topic/80965/influxdb-alten-datenmüll-löschen