NEWS
Pflege der InfluxDB
-
@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
-
Da müssen aber erst mal die richtigen Measurements im Script stehen. Gelöscht wird nur, wenn der Text absolut übereinstimmt.
-
Geht das dann schneller als die manuelle Auswahl mit drag und drop in den Editor und dann auf die Konsole kopiert? Das Bereinigen hat bei mir etwa 2h gedauert.