FHEM Forum

FHEM => Sonstiges => Thema gestartet von: maddinthebrain am 06 Juni 2019, 19:45:00

Titel: Aufwändige DB Operationen blockieren Fhem
Beitrag von: maddinthebrain am 06 Juni 2019, 19:45:00
Hallo zusammen,
Bei meinem Fhem läuft bei einem dbrep Device gerade ein optimizetable. Nun hatte ich den Fehler gemacht, eine Raumseite öffnen zu wollen mit  einem Plot dabei. Nun hängt Fhem, bzw wartet halt darauf, dass die optimize table fertig wird.

Warum läuft Fhem dann nicht beim Aufruf der Plot Daten in in einen Timeout? Kann man so was einstellen?

Mein DbLog ist im asynchronen Modus.
Grüße Martin
Titel: Antw:Aufwändige DB Operationen blockieren Fhem
Beitrag von: DS_Starter am 06 Juni 2019, 20:26:19
Hallo Martin,

ich führe optimizeTable auch aus und kann trotzdem die SVG's problemlos während dieser Zeit generieren lassen.

Tipp: schließt du vor dem Befehl die DB für DbLog ? Das macht man mit den Attributen executeBeforeProc, executeAfterProc im DbRep.

attr Rep.LogDBShort.OptimizeTable executeAfterProc set LogDBShort reopen
attr Rep.LogDBShort.OptimizeTable executeBeforeProc set LogDBShort reopen 7200


Damit wird die DB vor dem Lauf für 2 Stunden geschlossen und danach wieder geöffnet. DbLog ist im asynch Mode und cached während dieser Zeit die Daten.

Grüße,
Heiko
Titel: Antw:Aufwändige DB Operationen blockieren Fhem
Beitrag von: maddinthebrain am 06 Juni 2019, 21:28:49
Guter Tipp, fürs nächste Mal. Jetzt muss ich halt warten...

Das ShortDbLog ist DbLog Device, richtig?

Wenn es wieder funzt, da posten ich mal ein listing.

Grüße Martin
Titel: Antw:Aufwändige DB Operationen blockieren Fhem
Beitrag von: DS_Starter am 06 Juni 2019, 21:42:17
ZitatDas ShortDbLog ist DbLog Device, richtig?
Ja, genau.

Welche Datenbnk und Version nutzt du ?
Ich nutze MySQL/MariaDB. Habe es aber auch mit SQLite getestet. Klappt auch damit.

Ach und noch ein Tipp. In dem FHEMWEB-Device setzen:


plotfork = 1


Üblicherweise dauern Leseoperationen während optimizetable auch länger. Dieses Attribut verlagert die Plotgenerierung auf einen nebenläufigen Prozess.
Titel: Antw:Aufwändige DB Operationen blockieren Fhem
Beitrag von: maddinthebrain am 07 Juni 2019, 10:52:39
Ich verwende eine MySQL Datenbank. Das mit dem plot fork habe ich jetzt mal implementiert. Klappt das dann auch wenn das DB device geschlossen ist? Nicht dass er dann wieder bis zum Sankt Nimmerleinstag wartet.

Grüße Martin
Titel: Antw:Aufwändige DB Operationen blockieren Fhem
Beitrag von: DS_Starter am 07 Juni 2019, 12:39:43
Hi Martin,

ja das klappt. Das Schließen bezieht sich nur auf den Schreibprozess. SVG kann Daten beziehen.

Grüße,
Heiko
Titel: Antw:Aufwändige DB Operationen blockieren Fhem
Beitrag von: maddinthebrain am 07 Juni 2019, 13:52:35
Hallo Heiko,
OK,
attr Rep.LogDBShort.OptimizeTable executeAfterProc set LogDBShort reopen
attr Rep.LogDBShort.OptimizeTable executeBeforeProc set LogDBShort reopen 7200


Muss da in der ersten Zeile nicht statt reopen ein close hin?

Grüße Martin
Titel: Antw:Aufwändige DB Operationen blockieren Fhem
Beitrag von: DS_Starter am 07 Juni 2019, 14:07:56
ZitatMuss da in der ersten Zeile nicht statt reopen ein close hin?
nein, passt so. Close gibt es nicht (außerdem soll ja nach dem Optimize die DB geöffnet und nicht geschlossen werden). Das reopen macht eigentlich ein close und gleich danach ein open. Wird also für unseren Zweck "missbraucht" da die DB-Verbindung ja schon zu ist. Tut abr nichts. Mit "reopen 7200" wird das reopen eben nicht gleich ausgeführt, sondern erst nach 7200 Sekunden. Im Prinzip braucht man das reopen nach der OPeration nicht, müsste dann allerdings die 7200 Sekunden warten obwohl optimize schon ängst fertig ist. Deswegen danach gleich das "reopen".

MySQL ist schön. Welche Engine hast du ?
Das bekommmst du mit DbRep "get tableinfo" heraus -> dort das Reading "INFO_history.engine".
Titel: Antw:Aufwändige DB Operationen blockieren Fhem
Beitrag von: maddinthebrain am 09 Juni 2019, 21:56:28
Hier kommt "MyISAM" als Ergebnis.

Ich Räume die Datenbank alle 4 Wochen auf. Dabei lösche ich alles was älter ist als 90 Tage.  Dennoch ist die Datenbank mit 20 Mio Zeilen recht umfangreich. Dazu trägt vorallem mein Stromzähler bei. Der haut halt alle 3 - 4 einen Wert raus. Und Fhem loggt das. Eigentlich könnte man dessen Daten ja schon nach 7 Tagen eindampfen. Nur hatte ich noch keine Zeit, mich näher damit zu befassen.

Grüße Martin
Titel: Antw:Aufwändige DB Operationen blockieren Fhem
Beitrag von: DS_Starter am 09 Juni 2019, 22:28:13
Hallo Martin,

MyISAM ist seit MySQL 5.5 nicht mehr als Standardengine eingesetzt, sondern InnoDB. Und man sollte m.M. nach auf jeden Fall InnoDB einsetzen. Es gibt ein paar Unterschiede zwischen den beiden Engines. Für uns ist vor allem wichtig dass bei Schreiboperationen nicht die ganze Tabelle gesperrt wird, sondern nur der betroffene Datensatz. Falls du dich etwas dafür interessierst findest due hier eine kurze Gegenüberstellung -> https://spacehost.de/innodb-oder-myisam/ (ausführlicher) und hier noch direkt aus dem MySQL Manual.

Du kannst einfach auf InnoDB umstellen:


alter table history ENGINE=innodb


Entsprechend für die current Tabelle. Vermutlich musst du diese Operation als User mit root Berechtigung am Besten auf der Kommandozeile ausführen oder zum Beispiel mit phpMyAdmin. Backup sollte natürlich vorhanden sein.

EDIT: Aber musst nicht gleich umstellen. Wenn die vorgeschlagenen EInstellungen im DbRep zum Erfolg führen und du sonst zufrieden bist kannst du natürlich auch bei MyISAM bleiben.

Grüße,
Heiko