Aufwändige DB Operationen blockieren Fhem

Begonnen von maddinthebrain, 06 Juni 2019, 19:45:00

Vorheriges Thema - Nächstes Thema

maddinthebrain

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
Viele Grüße
Martin

Futro mit Proxmox und Debian: FHEM, Signalduino 433MHz & 868MHz, MAX!, WeeWX, FHEM2FHEM,
Raspi 4 mit ConBee mit deCONZ und Phoscon für ZigBee Aktoren und Sensoren

DS_Starter

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
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

maddinthebrain

#2
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
Viele Grüße
Martin

Futro mit Proxmox und Debian: FHEM, Signalduino 433MHz & 868MHz, MAX!, WeeWX, FHEM2FHEM,
Raspi 4 mit ConBee mit deCONZ und Phoscon für ZigBee Aktoren und Sensoren

DS_Starter

#3
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.
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

maddinthebrain

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
Viele Grüße
Martin

Futro mit Proxmox und Debian: FHEM, Signalduino 433MHz & 868MHz, MAX!, WeeWX, FHEM2FHEM,
Raspi 4 mit ConBee mit deCONZ und Phoscon für ZigBee Aktoren und Sensoren

DS_Starter

Hi Martin,

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

Grüße,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

maddinthebrain

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
Viele Grüße
Martin

Futro mit Proxmox und Debian: FHEM, Signalduino 433MHz & 868MHz, MAX!, WeeWX, FHEM2FHEM,
Raspi 4 mit ConBee mit deCONZ und Phoscon für ZigBee Aktoren und Sensoren

DS_Starter

#7
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".
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

maddinthebrain

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
Viele Grüße
Martin

Futro mit Proxmox und Debian: FHEM, Signalduino 433MHz & 868MHz, MAX!, WeeWX, FHEM2FHEM,
Raspi 4 mit ConBee mit deCONZ und Phoscon für ZigBee Aktoren und Sensoren

DS_Starter

#9
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
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter