NEWS
Zurücksetzen einzelner Datenpunkte im SQL-Adapter
-
@bahnuhr ahh, da liegt der Hase im Pfeffer - deine Datenbank heißt nicht "iobroker".
Zufällig hieß die bei mir auch so.
iobroker.datapoints
ist die Tabelledatapoints
aus der Datenbankiobroker
Also 2 Dinge sollte man noch als Parameter an den Anfang setzen, die Instanz und den Namen der Datenbank - wobei der auch vermutlich weggelassen werden könnte da diese ja schon im SQL-Adapter festgelegt ist.
-
@bananajoe & @Scrounger @andi2055
Lieben Dank, wie lange suche ich schon eine Lösung meine Mio von Leichen los zu werden. Aber irgendwas mache ich falsch mit der Nutzung des Scripts.
- JS Adapter öffnen
- neues JS anlegen
- Script von bananajoe einfügen, speichern
- Script oben mit der Pfeiltaste starten und warten
.
.
. - nix passiert
- im Log steht nach wie vor:
javascript.0 2023-02-02 00:00:31.728 info script.js.010_Testen.SQL_Datenpunkte_löschen: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions javascript.0 2023-02-02 00:00:31.703 info Start javascript script.js.010_Testen.SQL_Datenpunkte_löschen javascript.0 2023-02-02 00:00:31.656 info Stop script script.js.010_Testen.SQL_Datenpunkte_löschen
Sollte da irgendwo irgendetwas passieren. Ja, ich will vorab einen "Trocken-Test" machen um dann letztendlich den Schritt wagen.
-
Hier mal Version V0.4.
In dieser kannst du oben auch den Datenbank-Namen festlegen.
Im Quelltext war der bisher fest verdrahtet aufiobroker
gesetzt, deine heißt aber z.B.ioBroker
Passe das an und teste noch einmal.// SQL_Delete_Dead_Objects // V0.3 // // Changelog: // ---------- // 10.08.2019 V0.1 Scrounger erste Version welche nicht mehr existierende Datenpunkte anzeigt https://forum.iobroker.net/post/289821 // 03.05.2022 V0.2 andi2055 erweitert das die Daten auch aus der Datenbank gelöscht werden https://forum.iobroker.net/post/798291 // 01.02.2023 V0.3 BananaJoe umgestellt das nun Datenpunkte ohne SQL-Protokollierung gefunden werden https://forum.iobroker.net/post/939101 // 02.02.2023 V0.4 BananaJoe SQL-Instanz Konfigurierbar / Datenbankname konfigurierbar // Einstellungen: // Hier das löschen einschalten! false = nur anzeigen / true = anzeigen und wirklich löschen const activate_delete = false; // Name der SQL-Instanz, normalerweiser sql.0 const sql_instance = 'sql.0'; // Name der SQL-Datenbank - Groß und Kleinschreibung beachten! const sql_dbname = 'iobroker'; // Funktion zum Suchen und Löschen async function wartung() { try { // Alle Datenpunkte holen bei welchen die SQL-Protokollierung aktiv ist: let datapointsActiveArray = new Array(); let datapointsActiceStrings = ""; await sendTo(sql_instance, 'getEnabledDPs', {}, function (result) { Object.entries(result).forEach((entry) => { const [key, value] = entry; //console.log(`${key}`); datapointsActiceStrings = datapointsActiceStrings + `${key}` + ";"; }); //console.log(datapointsActiceStrings); datapointsActiveArray = datapointsActiceStrings.split(';'); }); // alle Datenpunkte aus Db holen let datapoints = await getQueryResult(`SELECT * FROM ${sql_dbname}.datapoints`); if (datapoints) { let count = 0; let sum = 0; // Datenpunkte durchlaufen for (const datapoint of datapoints) { // prüfen ob kein Objekt in ioBroker existiert // if (!getObject(datapoint.name)) { // prüfen ob SQL-Protokollierung nicht aktiv ist if (!datapointsActiveArray.includes(datapoint.name)) { count++; // Daten des Datenpunktes in Tabelle 'ts_bool' zählen let countBool = 0; let booleanTableItems = await getQueryResult(`SELECT * FROM ${sql_dbname}.ts_bool WHERE id = ${datapoint.id}`); if (booleanTableItems && Object.keys(booleanTableItems).length > 0) { countBool = Object.keys(booleanTableItems).length; if (activate_delete) { sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_bool WHERE id = ${datapoint.id}`, function (result) { if (result.error) { console.error(result.error); } else { // show result console.log('Rows: ' + JSON.stringify(result.result)); } }); } } // Daten des Datenpunktes in Tabelle 'ts_number' zählen let countNumber = 0; let numberTableItems = await getQueryResult(`SELECT * FROM ${sql_dbname}.ts_number WHERE id = ${datapoint.id}`); if (numberTableItems && Object.keys(numberTableItems).length > 0) { countNumber = Object.keys(numberTableItems).length; if (activate_delete) { sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_number WHERE id = ${datapoint.id}`, function (result) { if (result.error) { console.error(result.error); } else { // show result console.log('Rows: ' + JSON.stringify(result.result)); } }); } } // Daten des Datenpunktes in Tabelle 'ts_string' zählen let countString = 0; let stringTableItems = await getQueryResult(`SELECT * FROM ${sql_dbname}.ts_string WHERE id = ${datapoint.id}`); if (stringTableItems && Object.keys(stringTableItems).length > 0) { countString = Object.keys(stringTableItems).length; if (activate_delete) { sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_string WHERE id = ${datapoint.id}`, function (result) { if (result.error) { console.error(result.error); } else { // show result console.log('Rows: ' + JSON.stringify(result.result)); } }); } } if (activate_delete) { sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.datapoints WHERE id = ${datapoint.id}`, function (result) { if (result.error) { console.error(result.error); } else { // show result console.log('Rows: ' + JSON.stringify(result.result)); } }); } console.warn(`DB id: ${datapoint.id} (type: ${datapoint.type}) -> number: ${countNumber}, string: ${countString}, bool: ${countBool} | ioBroker id: '${datapoint.name}'`); sum = sum + countBool + countNumber + countString; } } console.warn(`${count} Objects found, that not exist anymore in ioBroker, sum of items in tables: ${sum.toLocaleString().replace(/,/g, ".")}`); } } catch (err) { console.error(`[wartung] error: ${err.message}`); console.error(`[wartung] stack: ${err.stack}`); } } async function getQueryResult(query) { return new Promise((resolve, reject) => { sendTo(sql_instance, 'query', query, function (result) { if (!result.error) { resolve(result.result); } else { resolve(null); } }); }); } wartung();
In der nächsten Version könnte man eine Meldung ergänzen wenn er keine Datenpunkte gefunden hat - dann wäre vermutlich die Instanz oder der Name der Datenbank falsch.
Eventuell kann man sich den Namen der Datenbank auch vom Adapter holen. Den Namen einfach überall entfernen hatte nicht zum Erfolg geführt. -
@bananajoe Danke!
Das mit dem Case Sensitive hatte ich schon entdeckt und manuell alles in der v0.3 abgeändert. Lief dann auch wirklich los und es kamen die orangenen Zeilen im Log. Allerdings scheint für so eine Rechenleistung mein System zu brustschwach zu sein. Bin gerade dabei, mein System wieder hoch zu kriegen. Ist einfach abgeschmirrt.
-
@metaxa nicht abgeschmiert ... Geduld. Habe ich eben sogar auf meinem Hochleistungssystem gehabt. Sind ggf. halt hunderttausende vorn Abfragen.
Eventuell muss da halt noch eine Bremse rein. Und Statusanzeigen.
-
@bananajoe sagte in Zurücksetzen einzelner Datenpunkte im SQL-Adapter:
Eventuell muss da halt noch eine Bremse rein. Und Statusanzeigen.
Ich denke beides wäre sehr hilfreich, alleine das Backup der SQL Datenbank ist bei mir ~500MB groß. Bei mir kommen im Log ca. 84 Warnmeldungen, spätestens danach tut sich nix mehr und der Admin ist nicht mehr erreichbar. Ich habe das Gefühl, dass der JS Adapter neu startet, da plötzlich im Log sichtbar jedes Skript neu initialisiert wird.
Werde das System jetzt neu starten, danach nochmals dein Skript starten traue ich mich eigentlich nicht wirklich.
-
@metaxa sagte in Zurücksetzen einzelner Datenpunkte im SQL-Adapter:
Werde das System jetzt neu starten, danach nochmals dein Skript starten traue ich mich eigentlich nicht wirklich.
eventuell musst den Javascript-adapter vorher deaktivieren - wenn der startet, startet der auch alle skripte die gestartet waren. könnte auch über den Objektebaum gehen, weis aber gerade nicht wie.
Also keine Panik, ggf. warten, warten, warten
-
@bananajoe sagte in Zurücksetzen einzelner Datenpunkte im SQL-Adapter:
eventuell musst den Javascript-adapter vorher deaktivieren
Wie meinst du das? Ich kann dein Skript ja nur starten, wenn er läuft. Laut meinen Beobachtungen hat mein JS-Adapter inmitten des laufenden Prozesses deines Skripts neugestartet.
-
@metaxa ok ... wenn es viele sind braucht es wohl eher einen Limiter "Datenpunkte pro Start", also das er nicht alle Datenpunkte abarbeitet sondern nur Anzahl X pro Start.
Ich habe gerade mit einer Bremse experimentiert. Er sucht die Datenpunkte ohne Fahrschein und fragt dann die Wert die vorliegen ab um eine Zahl zu erhalten.
Mein einer Temperatursensor schickt z.B. alle 5 Sekunden einen Wert (war mir erst hierbei aufgefallen), das waren es dann über 200.000 Werte.
In diese Abfrage kann ich nicht pausieren (ok, ich könnte die limitieren, dann wird es aber komplizierter, dann bräuchte es noch einmal eine schleife drumherum um dann alle Werte zu verarbeiten)
Zwischen den Datenpunkten kann ich pausieren.
Bei zu vielen Datensätzen könnte der RAM ausgehen ... wenn da z.B. 500.000 Stück kommen.
Also vermutlich läuft es doch auf "maximal 50.000 Datensätze pro Runde) oder so. Also statt 500.000 zu verarbeiten immer nur "die ersten 50.000, dann die nächsten 50.000) usw.Ich bin jetzt kein SQL Profi, ich kann nur gut googeln, ich schau mal was ich da finde.
-
@bananajoe sagte in Zurücksetzen einzelner Datenpunkte im SQL-Adapter:
Ich bin jetzt kein SQL Profi, ich kann nur gut googeln, ich schau mal was ich da finde.
Ich weiß gar nicht wie man "SQL Profi" schreibt
Diese - sicher großteils unnötigen Datenmengen - liegen mir schon länger auf der Seele. Nur bin ich bis dato nicht einmal ansatzweise iwo fähig z.B. zu schauen, welche Datenpunkte haben das letzte mal vor x Tagen oder Monaten geschrieben. Bei denen kann ich davon ausgehen, dass das Logging deaktiviert oder der DP gar nicht mehr existiert. Also weg mit der Sammlung.
Wirklich ein großes DANKE für deine Zeit und deinen Aufwand!
-
@metaxa ok, wird länger dauern ...
Ich entwickle das Skript in einer 2. JavaScript Instanz ... und die geht bei nur nun auch öfter auf die Bretter wenn ich mit Schleifen und SQL-Abfragen rumspiele ... -
Also ... das Problem ist das der SQL-Server unter umständen halt so ausgelastet wird das der das System auf die Bretter schickt. Bei meinen Tests hatte ich es auch hinbekommen das der MySQL sich jedes Hz auf jedem CPU Kern gegriffen hat.
Im ioBroker klappt dann irgendwann was nicht - vermutlich vom Timing - und dann geht der aus die Bretter und startet alles möglich neu.Eventuell könnte man es lösen indem man das löschen dann von hand macht auf der MySQL-Konsole
Ich habe damit rumexperimentiert zumindest beim löschen immer nur 50 Datensätze zu nehmen, zu pausieren und dann die nächsten 50 ... aber keine Ahnung, auch mir ist dann gerade alles ausgetillt ...
Das Skript kann halt anzeigen welche Datensätze betroffen sind,
der Rest wären ein paar SQL Befehle auf der Konsole. Eigentlich die gleichen die das Skript abfeuert, nur das ioBroker dann nicht dazwischen ist. -
@bananajoe
Coole Sache. Bei mir legt allerdings schon die Abfrage das System lahm, ich habe aber auch eine riesige Menge an Leichen in der Datenbank. Muss mal bei Gelegenheit prüfen, ob ich das irgendwie häppchenweise aufräumen kann.Was zur Perfektion noch fehlt, wäre es, Aliase zu berücksichtigen. Ich weiß nicht, ob und wie man das bewerkstelligen könnte.
Danke auf jeden Fall für das Projekt.
-
@gaspode Was relativ leicht wäre das er nur die betreffenden Datenpunkte ausspuckt die Leichen sind.
Oder das er halt nur die ersten 100 Datensätze holt statt hunderttausender.Mit der Liste könnte man von Hand auf der Konsole aufräumen
Passe die letzte Funktion unten so an:
async function getQueryResult(query) { return new Promise((resolve, reject) => { sendTo(sql_instance, 'query', query + ' LIMIT 100', function (result) { if (!result.error) { resolve(result.result); } else { resolve(null); } }); }); }
In Zeile 3 habe ich da das
+ 'LIMIT 100'
drangebaut so das nur die 100 ersten Datensätze erfasst werden.
Und bitteconst activate_delete = false;
Beim löschen würde er trotzdem alle löschen - und das könnte halt auf die Performance gehen / die MySQL-Instanz an ihre Grenzen bringen.
Da sollte man das löschen eventuell von Hand machen in der Shell machen - bei gestoppten ioBroker. -
@bananajoe sagte in Zurücksetzen einzelner Datenpunkte im SQL-Adapter:
Das Skript kann halt anzeigen welche Datensätze betroffen sind
Selbst bei diesem Vorgang steigt mein JS-Adapter scheinbar schon aus.
@bananajoe sagte in Zurücksetzen einzelner Datenpunkte im SQL-Adapter:
Eventuell könnte man es lösen indem man das löschen dann von hand macht auf der MySQL-Konsole
Genau daran scheitere ich seit Jahren, ich finde mich bei diesem SQL einfach nicht zurecht.
Früher gabs einmal "History" auf der CCU, da kannt ich mich handlungsstark aus. -
@metaxa probiere mal meine Modifikation mit dem Limit oben aus.
Wenn die klappt schreibe ich dir hier eine kleine Anleitung rein wie du die Datenpunkte von Hand in MySQL bereinigen kannst.
Basis wäre halt das du die Namen der Datenpunkte hast die es betrifft.Ich würde das Log auf der Shell nehmen
tail -F /opt/iobroker/log/iobroker.current.log
Nach dem Durchlauf des Skripts beenden und die Zeilen aus dem Skript in eine Textdatei kopieren.
Die Logzeilen enthalten alle Informationen die man dafür braucht:23:30:27.648 warn javascript.1 (1701654) script.js.Tools.SQL_Verwaiste2: DB id: 132 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: '0_userdata.0.tasmota.Blitzwolf182-Loetstation.Energy-Power'
-
@bananajoe sagte in Zurücksetzen einzelner Datenpunkte im SQL-Adapter:
Ich würde das Log auf der Shell nehmen
Da kriege ich nicht alle Informationen wie im Log direkt unter ioB logs. Das schaut so aus:
javascript.0 2023-02-02 23:33:13.444 warn script.js.010_Testen.SQL_Datenpunkte_löschen: 83 Objects found, that not exist anymore in ioBroker, sum of items in tables: 7 776 javascript.0 2023-02-02 23:33:13.397 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 106 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'hm-rpc.0.LEQ1315252.2.CURRENT' javascript.0 2023-02-02 23:33:13.245 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 105 (type: 0) -> number: 3, string: 0, bool: 0 | ioBroker id: 'alias.0. nordtemp.ACTUAL' javascript.0 2023-02-02 23:33:13.199 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 104 (type: 1) -> number: 0, string: 100, bool: 0 | ioBroker id: 'squeezeboxrpc.0.Players.Moode-Bad.cmdPlayFavorite' javascript.0 2023-02-02 23:33:13.117 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 103 (type: 1) -> number: 0, string: 100, bool: 0 | ioBroker id: 'device-reminder.0.Brauchwasserpumpe.messageDP' javascript.0 2023-02-02 23:33:12.902 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 102 (type: 1) -> number: 0, string: 100, bool: 0 | ioBroker id: 'device-reminder.0.Dishwasher.messageDP' javascript.0 2023-02-02 23:33:12.804 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 100 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'sonoff.0.Kueche-LED-Power-32.ENERGY_Yesterday' javascript.0 2023-02-02 23:33:12.729 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 99 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'sonoff.0.Kueche-LED-Power-32.ENERGY_Total' javascript.0 2023-02-02 23:33:12.571 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 98 (type: 2) -> number: 0, string: 0, bool: 100 | ioBroker id: 'g-homa.0.1E493A.state' javascript.0 2023-02-02 23:33:12.523 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 97 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'sonoff.0.Gosund01-POW-Dishwasher.ENERGY_ApparentPower' javascript.0 2023-02-02 23:33:12.480 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 96 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'sonoff.0.Gosund01-POW-Dishwasher.ENERGY_Power' javascript.0 2023-02-02 23:33:12.342 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 95 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'sonoff.0.Gosund01-POW-Dishwasher.ENERGY_Current' javascript.0 2023-02-02 23:33:12.213 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 94 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'javascript.0.Wetterstation.Info.Letzte_Regenmenge' javascript.0 2023-02-02 23:33:12.022 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 92 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'javascript.0.Wetterstation.Regenrate' javascript.0 2023-02-02 23:33:11.922 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 90 (type: 1) -> number: 0, string: 100, bool: 0 | ioBroker id: 'javascript.0.Junkers.Solar.solarPump' javascript.0 2023-02-02 23:33:11.762 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 89 (type: 1) -> number: 0, string: 100, bool: 0 | ioBroker id: 'javascript.0.Wetterstation.Regenstatus' javascript.0 2023-02-02 23:33:11.579 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 88 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'javascript.0.Wetterstation.Regen_Tag' javascript.0 2023-02-02 23:33:11.425 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 87 (type: 2) -> number: 0, string: 0, bool: 100 | ioBroker id: 'hm-rpc.0.LEQ0073059.1.WORKING' javascript.0 2023-02-02 23:33:11.340 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 86 (type: 1) -> number: 0, string: 100, bool: 0 | ioBroker id: 'mqtt.0.ESP1-Garage-Poolsteuerung.status.LWT' javascript.0 2023-02-02 23:33:11.221 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 85 (type: 1) -> number: 0, string: 7, bool: 0 | ioBroker id: 'hm-rpc.2.CUX2800001.12.TIMER_SET' javascript.0 2023-02-02 23:33:11.173 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 84 (type: 1) -> number: 0, string: 7, bool: 0 | ioBroker id: 'hm-rpc.2.CUX2800001.14.TIMER_SET' javascript.0 2023-02-02 23:33:11.111 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 83 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'sonoff.0.SONOFF_32_POW.ENERGY_Total' javascript.0 2023-02-02 23:33:11.005 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 82 (type: 0) -> number: 78, string: 0, bool: 0 | ioBroker id: 'sonoff.0.SONOFF_32_POW.ENERGY_Yesterday' javascript.0 2023-02-02 23:33:10.832 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 81 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'hm-rpc.0.KEQ0965973.2.CURRENT' javascript.0 2023-02-02 23:33:10.745 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 80 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'hm-rpc.0.KEQ0965973.2.POWER' javascript.0 2023-02-02 23:33:10.536 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 79 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'hm-rpc.0.KEQ0968518.2.CURRENT' javascript.0 2023-02-02 23:33:10.380 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 75 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'hm-rpc.0.LEQ1275993.2.CURRENT' javascript.0 2023-02-02 23:33:10.279 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 74 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'hm-rpc.0.LEQ1275993.2.POWER' javascript.0 2023-02-02 23:33:09.943 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 73 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'hm-rpc.0.LEQ0532863.2.CURRENT' javascript.0 2023-02-02 23:33:09.838 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 72 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'hm-rpc.0.LEQ0532863.2.POWER' javascript.0 2023-02-02 23:33:09.674 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 70 (type: 2) -> number: 0, string: 0, bool: 100 | ioBroker id: 'hm-rpc.0.IEQ0168663.4.STATE' javascript.0 2023-02-02 23:33:09.617 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 69 (type: 2) -> number: 0, string: 0, bool: 100 | ioBroker id: 'a_andreas.0.eigene_dp.Bewegung.Aqara_01_Bewegung' javascript.0 2023-02-02 23:33:09.543 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 66 (type: 1) -> number: 0, string: 100, bool: 0 | ioBroker id: 'weatherunderground.0.forecast.0d.state' javascript.0 2023-02-02 23:33:09.469 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 64 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'sonoff.0.SONOFF_31.ENERGY_Power' javascript.0 2023-02-02 23:33:09.310 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 63 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'sonoff.0.SONOFF_30.ENERGY_Power' javascript.0 2023-02-02 23:33:09.026 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 62 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'proxmox.0.qemu_ioBroker-Prod.mem_lev' javascript.0 2023-02-02 23:33:08.735 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 61 (type: 2) -> number: 0, string: 0, bool: 100 | ioBroker id: 'g-homa.0.1BBAC0.state' javascript.0 2023-02-02 23:33:08.587 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 60 (type: 0) -> number: 1, string: 0, bool: 0 | ioBroker id: 'sonoff.0.SONOFF_30.ENERGY_Today' javascript.0 2023-02-02 23:33:08.332 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 59 (type: 0) -> number: 97, string: 0, bool: 0 | ioBroker id: 'sonoff.0.SONOFF_30.ENERGY_Yesterday' javascript.0 2023-02-02 23:33:08.223 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 58 (type: 0) -> number: 1, string: 0, bool: 0 | ioBroker id: 'sonoff.0.SONOFF_31.ENERGY_Today' javascript.0 2023-02-02 23:33:08.041 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 57 (type: 0) -> number: 78, string: 0, bool: 0 | ioBroker id: 'sonoff.0.SONOFF_31.ENERGY_Yesterday' javascript.0 2023-02-02 23:33:07.783 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 56 (type: 2) -> number: 0, string: 0, bool: 100 | ioBroker id: 'hm-rpc.1.JEQ0148994.13.STATE' javascript.0 2023-02-02 23:33:07.642 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 55 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'hm-rpc.0.KEQ0968518.2.POWER' javascript.0 2023-02-02 23:33:07.452 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 54 (type: 1) -> number: 0, string: 100, bool: 0 | ioBroker id: 'a_andreas.0.eigene_dp.MatrixDisplay.Matrix' javascript.0 2023-02-02 23:33:07.022 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 53 (type: 2) -> number: 0, string: 4, bool: 100 | ioBroker id: 'g-homa.0.22604E.state' javascript.0 2023-02-02 23:33:06.663 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 52 (type: 1) -> number: 0, string: 100, bool: 0 | ioBroker id: 'mqtt.0.ESP1-Garage-Poolsteuerung.Poolwasser.Beckentemperatur' javascript.0 2023-02-02 23:33:06.579 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 51 (type: 1) -> number: 0, string: 100, bool: 0 | ioBroker id: 'mqtt.0.ESP0-Kueche-ext-Eiskasten.Gefrierteil.Temperatur' javascript.0 2023-02-02 23:33:06.470 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 50 (type: 1) -> number: 0, string: 100, bool: 0 | ioBroker id: 'mqtt.0.ESP0-Kueche-ext-Eiskasten.Kühlschrank.Temperatur' javascript.0 2023-02-02 23:33:06.351 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 49 (type: 1) -> number: 0, string: 100, bool: 0 | ioBroker id: 'mqtt.0.ESP-Kueche-ext-Eiskasten.Gefrierteil.Temperatur' javascript.0 2023-02-02 23:33:06.219 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 48 (type: 1) -> number: 0, string: 100, bool: 0 | ioBroker id: 'mqtt.0.ESP-Kueche-ext-Eiskasten.Kühlschrank.Temperatur' javascript.0 2023-02-02 23:33:06.136 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 47 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'fullybrowser.0.192_168_0_121.Info.batteryLevel' javascript.0 2023-02-02 23:33:06.032 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 46 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'fullybrowser.0.192_168_0_121.Info.motionDetectorState' javascript.0 2023-02-02 23:33:05.962 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 45 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'hm-rpc.0.JEQ0194157.1.HUMIDITY' javascript.0 2023-02-02 23:33:05.867 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 44 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'mqtt.0.ESP-Garage-Poolsteuerung.Poolwasser.Beckentemperatur.neustarts_anzahl' javascript.0 2023-02-02 23:33:05.794 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 43 (type: 1) -> number: 0, string: 100, bool: 0 | ioBroker id: 'mqtt.0.ESP-Garage-Poolsteuerung.status.LWT' javascript.0 2023-02-02 23:33:05.661 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 42 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'mqtt.0.ESP-Garage-Poolsteuerung.Poolwasser.Beckentemperatur' javascript.0 2023-02-02 23:33:05.605 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 40 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'mqtt.0.WM_D1_M_Pool.Poolsteuerung.Temperatur_Pool_Mitte' javascript.0 2023-02-02 23:33:05.509 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 38 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'paw.0.TabAKarli.info.battery.level' javascript.0 2023-02-02 23:33:05.258 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 37 (type: 2) -> number: 0, string: 0, bool: 100 | ioBroker id: 'paw.0.TabAKarli.info.info.lcd' javascript.0 2023-02-02 23:33:05.015 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 36 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'landroid-s.0.mower.status' javascript.0 2023-02-02 23:33:04.937 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 35 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'landroid-s.0.calendar.mowTimeExtend' javascript.0 2023-02-02 23:33:04.711 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 34 (type: 2) -> number: 0, string: 0, bool: 100 | ioBroker id: 'landroid-s.0.mower.batteryCharging' javascript.0 2023-02-02 23:33:04.625 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 33 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'landroid-s.0.mower.batteryState' javascript.0 2023-02-02 23:33:04.423 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 32 (type: 1) -> number: 0, string: 100, bool: 0 | ioBroker id: 'yamaha.0.Realtime.raw' javascript.0 2023-02-02 23:33:03.996 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 28 (type: 2) -> number: 0, string: 0, bool: 100 | ioBroker id: 'hm-rpc.1.JEQ0310843.16.STATE' javascript.0 2023-02-02 23:33:03.850 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 26 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'paw.0.Susi_Tab3.info.battery.level' javascript.0 2023-02-02 23:33:03.788 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 25 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'hm-rpc.0.OEQ0301876.1.TEMPERATURE' javascript.0 2023-02-02 23:33:03.616 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 22 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'hm-rpc.0.MEQ1598807.1.TEMPERATURE' javascript.0 2023-02-02 23:33:03.427 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 18 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'hm-rpc.0.JEQ0393036.1.TEMPERATURE' javascript.0 2023-02-02 23:33:03.231 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 17 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'hm-rpc.0.JEQ0231719.1.TEMPERATURE' javascript.0 2023-02-02 23:33:03.154 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 16 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'hm-rpc.0.JEQ0194157.1.TEMPERATURE' javascript.0 2023-02-02 23:33:03.092 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 15 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'hm-rpc.0.JEQ0035658.1.TEMPERATURE' javascript.0 2023-02-02 23:33:03.021 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 14 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'hm-rpc.0.HEQ0510329.1.TEMPERATURE' javascript.0 2023-02-02 23:33:02.964 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 12 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'broadlink2.0.RM:.Temperature' javascript.0 2023-02-02 23:33:02.858 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 11 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'hm-rpc.0.FEQ0030851.1.TEMPERATURE' javascript.0 2023-02-02 23:33:02.709 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 10 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'hm-rpc.0.JEQ0686511.1.TEMPERATURE' javascript.0 2023-02-02 23:33:02.514 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 9 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'hm-rpc.0.OEQ0301876.2.SET_TEMPERATURE' javascript.0 2023-02-02 23:33:02.381 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 8 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'hm-rpc.0.OEQ0301876.2.ACTUAL_TEMPERATURE' javascript.0 2023-02-02 23:33:02.319 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 7 (type: 2) -> number: 0, string: 0, bool: 100 | ioBroker id: 'hm-rpc.0.NEQ0114995.1.STATE' javascript.0 2023-02-02 23:33:02.200 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 6 (type: 2) -> number: 0, string: 0, bool: 100 | ioBroker id: 'hm-rpc.0.IEQ0168663.1.STATE' javascript.0 2023-02-02 23:33:01.779 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 5 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'hm-rpc.0.MEQ1598807.2.TEMPERATURE' javascript.0 2023-02-02 23:33:01.537 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 4 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'weatherunderground.0.forecast.3h.temp' javascript.0 2023-02-02 23:33:01.230 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 3 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'weatherunderground.0.current.temp_c' javascript.0 2023-02-02 23:33:01.039 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 1 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'hm-rpc.0.JEQ0268366.1.HUMIDITY'
Hab gleich paar DP kontrolliert, die Ausgabe deines Scripts stimmt zu 100%
Was ist dies Zahl 83 am Ende deines adaptierten (Limit 100) Skripts?
-
Habe heute Abend meine ioBroker DB einmal direkt aus mySQL exportiert (unkomprimiert):
Wird wirklich Zeit da etwas zu unternehmen -
Ich habe jetzt über diese Oberfläche paar Datenpunkte gelöscht. Werden nun bei "löschen" auch die vielen Detaileinträge in sources, ts_bool, ts_counter, ts_number, ts_string gelöscht?
Ich habe jetzt dein Skript nochmals durchlaufen lassen, ja die ersten gelöschten Datenpunkte werden nicht mehr gefunden
@metaxa sagte in Zurücksetzen einzelner Datenpunkte im SQL-Adapter:
Ich habe jetzt über diese Oberfläche paar Datenpunkte gelöscht. Werden nun bei "löschen" auch die vielen Detaileinträge in sources, ts_bool, ts_counter, ts_number, ts_string gelöscht?
Ich antworte mir mal selbst: Nein, werden nicht gelöscht. Im Falle der ID 1 bleiben sämtliche Einträge in ts_number bestehen.
Ich warte bitte auf deine Anweisung, wie ich z.B. alle Einträge der ID lösche.
Lieben Dank
-
@metaxa was du mit der 83 meinst weis ich nicht - es sind 83 Datenpunkte ohne Fahrschein.
Das dein Export 1,2GB groß ist heißt auch nicht viel - die SQL Datei ist eine Textdatei welche die Anweisungen zum Import enthält. Die ist dadurch schon mal größer als die eigentlichen Daten.
Allerdings sehe ich da Datenpunkte vom Typ String - das könnten Platzfresser sein wenn diese viele lange Einträge haben.javascript.0 2023-02-02 23:33:12.902 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 102 (type: 1) -> number: 0, string: 100, bool: 0 | ioBroker id: 'device-reminder.0.Dishwasher.messageDP' javascript.0 2023-02-02 23:33:12.804 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 100 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'sonoff.0.Kueche-LED-Power-32.ENERGY_Yesterday'
So, die beiden Datenpunkte dort nehme ich als Beispiel.
Du musst auf die Shell / in die Bash / per puTTY auf den ioBroker.Dort musst du die Eingabeaufforderung von MySQL starten:
mysql -uandreas -p ioBroker
-uandreas
= Benutzernameandreas
-p
= du willst ein Passwort eingeben
ioBroker
= Name der Datenbank mit der du dich verbinden willst.
Er fragt nach dem Passwort, danach hast du einen Prompt:Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 64731 Server version: 10.6.11-MariaDB-0ubuntu0.22.04.1 Ubuntu 22.04 Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [iobroker]>
Bei mir steht MariaDB, bei dir eventuell auch oder MySQL, die funktionieren beide gleich.
[iobroker]
heisst das die Datenbank ausgewählt ist.Kleiner Test:
MariaDB [iobroker]> show tables; +--------------------+ | Tables_in_iobroker | +--------------------+ | datapoints | | sources | | ts_bool | | ts_counter | | ts_number | | ts_string | +--------------------+ 6 rows in set (0,001 sec)
Das sind die Tabellen in denen die Daten liegen. Aus denen können wir die Daten mit den obigen Informationen aus dem Log löschen:
javascript.0 2023-02-02 23:33:12.902 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 102 (type: 1) -> number: 0, string: 100, bool: 0 | ioBroker id: 'device-reminder.0.Dishwasher.messageDP'
device-reminder.0.Dishwasher.messageDP
hat in der Datenbank die id 102 (DB id: 102 (type: 1)
)
Und Daten in derts_string
Tabelle (number: 0, string: 100, bool: 0
)kurze Kontrolle:
MariaDB [iobroker]> select * from datapoints where id=102; +-----+----------------------------------------+------+ | id | name | type | +-----+----------------------------------------+------+ | 102 | device-reminder.0.Dishwasher.messageDP | 1 | +-----+----------------------------------------+------+ 1 row in set (0,001 sec)
Ok, stimmt, also löschen der Werte aus
ts_string
und ausdatapoints
:delete from ts_bool where id=102; delete from datapoints where id=102;
Beim ersten Befehl sollte in der Zusammenfassung stehen wie viele Datensätze er gelöscht hat,
beim 2. Befehl sollte es immer 1 (einer) sein weil es ja nur einen Eintrag gibt.Der erste Befehl ist es der dein System in die Knie zwingen kann wenn er dort viel löschen muss.
Dazu komme ich weiter unten noch einmal.javascript.0 2023-02-02 23:33:12.804 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 100 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'sonoff.0.Kueche-LED-Power-32.ENERGY_Yesterday'
sonoff.0.Kueche-LED-Power-32.ENERGY_Yesterday
hat in der Datenbank die id 100 (DB id: 100 (type: 01)
)
Und Daten in derts_number
Tabelle (number: 100, string: 0, bool: 0
)Beim löschen eben die andere Tabelle:
delete from ts_number where id=100; delete from datapoints where id=100;
und bei
bool
wäre es ebents_bool
Wenn du mit allen fertig bist kannst du perexit
die Konsole wieder verlassen.So, nun zu dem "in die Knie gehen".
Variante 1 ist den ioBroker vorher zu stoppensudo systemctl stop iobroker
Dann das löschen machen. Wenn es länger dauert, dauert es eben länger - Abwarten bis der Prompt wiederkommt. Das wird meist recht flott gehen - aber du wirst da ein oder mehrere Monster haben wo es dauern wird.
Variante 2 ist das löschen zu limitieren:
delete from ts_number where id=100 limit 5000;
würde nur die ersten 5.000 Datensätze löschen. Dabei wird das System / ein oder mehrere CPU-Kerne kurz auf Anschlag gehen und der Prompt kommt dann wieder. Als Ergebnis sollte da so etwas stehen:
5000 row in set (4,321 sec)
Ist die Zahl kleiner als dein Limit oder sogar 0 hast du alles gelöscht in der Tabelle. Ansonsten musst du das wiederholen.
Ob 5000 oder 50 so der 100.000 die richtige Zahl für dein System ist kann ich dir nicht sagen. Vermutlich kannst du bei
ts_number
eher höher greifen, beits_string
erst einmal niedriger.
Meine Geräte die einmal die Minute liefern mit 6 Monate Aufzeichnung haben 42.000 Datensätze.
Einer der Temperaturfühler hat alle 5 Sekunden gemeldet ... 280.000
der Shelly 3EM liefert alle 3 Sekunden und hat bei mir 2.673.105 Datensätze - pro Phase.Beim Abfragen des letzteren ging bei mir die CPU für einen Moment auf 100%. (aber nicht auf allen Kernen)
Wie viele es sind könntest du mit dem Befehl hier testen, der ging schon schneller:MariaDB [iobroker]> select COUNT(*) from ts_number where id=58; +----------+ | COUNT(*) | +----------+ | 2673128 | +----------+ 1 row in set (3,609 sec)
Halt 4 Sekunden vollgas. Wenn ich die Abfrage wie im Skript mache (
select COUNT(*) from ts_number where id=58;
) dann sind es schon ca. 11 Sekunden, also 3 mal so "schlimm"