NEWS
Repariere SQL-Datenbank
-
Hallo,
um die SQL-Datenbank mal wieder auf einen konsistenten Stand zu bringen bin ich wie folgt vorgegangen:
Erweitere die Datenbank:
(PS: mit mysql iobroker -pPASSWORT -e "sql…" kann man SQL-Kommandos starten )
Achtung: Ja nach DB-Größe laufen die Kommandos durchaus ein paar Minuten
ALTER TABLE `datapoints` ADD `type0` BIGINT NOT NULL COMMENT 'Number' ; ALTER TABLE `datapoints` ADD `type1` BIGINT NOT NULL COMMENT 'String' ; ALTER TABLE `datapoints` ADD `type2` BIGINT NOT NULL COMMENT 'Bool' ;
Fülle die neuen Spalten. Wenn mehr als eine gefüllt ist, ist der Datenpunkt korrupt.
UPDATE datapoints SET datapoints.type0 = (SELECT count(*) FROM ts_number WHERE id = datapoints.id group by id) UPDATE datapoints SET datapoints.type1 = (SELECT count(*) FROM ts_string WHERE id = datapoints.id group by id) UPDATE datapoints SET datapoints.type2 = (SELECT count(*) FROM ts_bool WHERE id = datapoints.id group by id)
Jetzt suche alle, die nicht konsistent sind:
SELECT * FROM datapoints WHERE (type = 0 and (type1>0 or type2>0)) or (type = 1 and (type0>0 or type2>0)) or (type = 2 and (type1>0 or type0>0))
Das waren bei mir mal so schlappe 120 Datenpunkte (basierend auf den div. Fehlern im sql-Adapter).
Jetzt muß man leider per Hand jeden durchgehen und den richtigen Typ setzen.
Ein Anhaltspunkt ist meistens dafür wo die meisten Datenpunkte geschrieben wurden.
type 0 = Number type 1 = String (Zeichenkette) type 2 = bool (Wahrheitswert)
Leider bleiben jetzt noch die leeren Datenpunkte (also wo noch nie etwas geloggt wurde oder die zu alt sind und nicht mehr verwendet)
SELECT * FROM `datapoints` where type0+type1+type2=0
Auch hier muss man nach den obigen Muster vorgehen. Oder man löscht die Punkte (da hier in den letzten Jahren nichts passiert ist).
(EXECUTE, PRESS und STATE sind meist bool)
Wenn die typen alle stimmen, dann:
DELETE FROM ts_number WHERE id not in (select id from datapoints where type=0) DELETE FROM ts_string WHERE id not in (select id from datapoints where type=1) DELETE FROM ts_bool WHERE id not in (select id from datapoints where type=2)
Jetzt sollte
SELECT * FROM datapoints WHERE (type = 0 and (type1>0 or type2>0)) or (type = 1 and (type0>0 or type2>0)) or (type = 2 and (type1>0 or type0>0))
keine Zeilen mehr als Ergebnis liefern.
Für mich habe ich
mysql iobroker -pPASSWORT -e "UPDATE datapoints SET datapoints.type0 = (SELECT count(*) FROM ts_number WHERE id = datapoints.id group by id)" mysql iobroker -pPASSWORT -e "UPDATE datapoints SET datapoints.type1 = (SELECT count(*) FROM ts_string WHERE id = datapoints.id group by id)" mysql iobroker -pPASSWORT -e "UPDATE datapoints SET datapoints.type2 = (SELECT count(*) FROM ts_bool WHERE id = datapoints.id group by id)"
in eine Batchdatei geschrieben und lasse das einmal Nachts ausführen, so habe ich immer eine aktuelle Statistik.
-
Interessant ist ob es jetzt "sauber "bleibt. Das würde mich besonders interessieren
-
Interessant ist ob es jetzt "sauber "bleibt. Das würde mich besonders interessieren `
Ich werte das jetzt automatisch einmal am Tag aus. Wir werden sehen …
-
Hallo,
fast sauber, nur:
id name type type0 type1 type2 Zeit 541 tankerkoenig.0.stations.cheapest.e5.short 1 36866 20 0 0000-00-00 00:00:00 547 tankerkoenig.0.stations.cheapest.e10.short 1 36638 20 0 0000-00-00 00:00:00 554 tankerkoenig.0.stations.cheapest.diesel.short 1 36736 20 0 0000-00-00 00:00:00 557 tankerkoenig.0.stations.0.e10.short 1 26838 3 0 0000-00-00 00:00:00 559 tankerkoenig.0.stations.0.e5.short 1 27166 3 0 0000-00-00 00:00:00 568 tankerkoenig.0.stations.0.diesel.short 1 27041 3 0 0000-00-00 00:00:00 598 tankerkoenig.0.stations.1.diesel.short 1 27719 3 0 0000-00-00 00:00:00 608 tankerkoenig.0.stations.8.diesel.short 1 37852 19 0 0000-00-00 00:00:00 613 tankerkoenig.0.stations.8.e5.short 1 37618 19 0 0000-00-00 00:00:00 614 tankerkoenig.0.stations.5.e5.short 1 28453 7 0 0000-00-00 00:00:00 617 tankerkoenig.0.stations.1.e5.short 1 27883 3 0 0000-00-00 00:00:00 631 tankerkoenig.0.stations.2.e10.short 1 37516 20 0 0000-00-00 00:00:00 632 tankerkoenig.0.stations.2.e5.short 1 37541 20 0 0000-00-00 00:00:00 634 tankerkoenig.0.stations.8.e10.short 1 37476 19 0 0000-00-00 00:00:00 644 tankerkoenig.0.stations.9.e5.short 1 25786 2 0 0000-00-00 00:00:00 647 tankerkoenig.0.stations.9.diesel.short 1 25216 2 0 0000-00-00 00:00:00 649 tankerkoenig.0.stations.9.e10.short 1 25292 2 0 0000-00-00 00:00:00 673 tankerkoenig.0.stations.2.diesel.short 1 37535 19 0 0000-00-00 00:00:00 683 tankerkoenig.0.stations.3.e10.short 1 28897 6 0 0000-00-00 00:00:00 693 tankerkoenig.0.stations.3.diesel.short 1 29077 7 0 0000-00-00 00:00:00 695 tankerkoenig.0.stations.4.e5.short 1 28897 7 0 0000-00-00 00:00:00 699 tankerkoenig.0.stations.6.e10.short 1 27042 3 0 0000-00-00 00:00:00 705 tankerkoenig.0.stations.6.e5.short 1 27402 4 0 0000-00-00 00:00:00 711 tankerkoenig.0.stations.7.e5.short 1 28626 3 0 0000-00-00 00:00:00 715 tankerkoenig.0.stations.7.e10.short 1 28297 3 0 0000-00-00 00:00:00 719 tankerkoenig.0.stations.7.diesel.short 1 28402 3 0 0000-00-00 00:00:00 730 tankerkoenig.0.stations.3.e5.short 1 29203 6 0 0000-00-00 00:00:00 731 tankerkoenig.0.stations.5.e10.short 1 28338 7 0 0000-00-00 00:00:00 738 tankerkoenig.0.stations.6.diesel.short 1 26843 4 0 0000-00-00 00:00:00 744 tankerkoenig.0.stations.4.e10.short 1 28596 7 0 0000-00-00 00:00:00 748 tankerkoenig.0.stations.4.diesel.short 1 28746 7 0 0000-00-00 00:00:00 754 tankerkoenig.0.stations.5.diesel.short 1 28384 7 0 0000-00-00 00:00:00
Warum da short von number auf string gewechselt ist?
Im Datenpunkt steht allerdings auch Zeichenkette.
Es sind keine "NULL" Werte mehr aufgetaucht. (Danke für den Schalter).
-
Der Typ in der dB der gesetzt ist gewinnt an sich es sei denn ein „speichern als“ ist gesetzt. Wenn beiden nicht da ist dann wird der offizielle Typ des Objekts genommen. So sollte es sein.
-
Der Typ in der dB der gesetzt ist gewinnt an sich es sei denn ein „speichern als“ ist gesetzt. Wenn beiden nicht da ist dann wird der offizielle Typ des Objekts genommen. So sollte es sein. `
Ja, das scheint auch so zu sein. Bis getern 18:45 hat er aber unter Number gespeichert. Und auch gelesen.
Ab dann hat er sich für String entschieden. Was ja auch funktioniert. Mich hat es nur gewundert, das es nur für diese Wert so ist.
-
Ich habe immer folgende Fehlermeldung. Jemand eine Idee wie ich das Objekt mit der id=593 finde? Vielleicht finde ich dann die Ursache?
sql.0 2018-05-22 11:30:29.219 error Cannot delete DELETE FROM `ioBroker`.undefined WHERE id=593 AND ts < 1495445400200;: Error: ER_NO_SUCH_TABLE: Table 'ioBroker.undefined' doesn't exist
-
Es gibt die Tabelle iobroker.datapoints (glaube ich mich zu entsinnen oder leicht anders) wo die ids zu Objekt-IDs zugeordnet sind. Da findest du die Info.
-
Es gibt die Tabelle iobroker.datapoints (glaube ich mich zu entsinnen oder leicht anders) wo die ids zu Objekt-IDs zugeordnet sind. Da findest du die Info. `
Danke für den Tipp. Kannst du mir grob sagen wo ich suchen kann nach dieser Tabelle? In einem der Ordner unter /opt/iobroker/ oder unter Objekte? -
In deiner sql-datenbank! Ist eine Datenbank tabelle
-
In deiner sql-datenbank! Ist eine Datenbank tabelle `
Ja, gefunden. War tatsächlich datapoints.Da ich mein Passwort nicht mehr wusste für die Datenbank, habe ich neues erstellen müssen. Nun kriege ich leider sql nicht mehr ans Laufen, vorher ging immer "sudo mysqladmin flush-hosts"… nun hat root kein Zugriff mehr 'Acces denied for user 'root'@'localhost' (using password : no).... morgen probiere ich weiter...