Hallo!
Ich habe auf meinem Fhem Server eine MariaDB Datenbank.
Da ich nie Probleme hatte, habe ich nie nachgesehen, aber jetzt ist das Problem, dass mir der Speicherplatz am Server ausgeht.
Die Datenbank hat eine Größe von ca 9GB. Die Tabelle history beinhaltet über 34 Mio Datensätze.
Ich wollte nun direkt in der Datenbank, nachdem ich mich mit mysql -u ... eingeloggt habe, alte Datensätze löschen. Hätt mal begonnen mit dem Löschen der Datensätze zB vom August 2021. Doch kurze Zeit nachdem ich den Befehl abgesetzt habe, bekomme ich die Meldung: Lost connection to MySQL server during query.
Einen Dump der Datenbank macht er auch nicht mehr. Der letzte erfolgreiche war am 8. Jänner 2025.
Wer weiß einen Rat, wie ich die Anzahl der Datensätze reduzieren kann?
Das sich die Datenbank verabschiedet kann daran liegen dass zu wenig Plattenplatz für temporäre Daten zur Verfügung steht, welche sich aus dem Selektionszeitraum beim Löschen ergeben. Üblicherweise ist /tmp der relevante Ordner in dem Platz benötigt wird. (glaube ich).
Möglich ist auch ein zu kleiner Wert des Parameters max_allowed_packet (siehe https://matomo.org/faq/troubleshooting/faq_183/).
Wahrscheinlich musst du schrittweise vorangehen und zum Beispiel erstmal monatsweise löschen.
Dazu kannst du ein DbRep-Device mit Einschränken über die Zeit-Attribute nutzen.
Siehe dazu auch das Wiki (https://wiki.fhem.de/wiki/DbRep_-_Reporting_und_Management_von_DbLog-Datenbankinhalten#(regelm%C3%A4%C3%9Figes)_L%C3%B6schen_von_Datenbanks%C3%A4tzen).
Ich vermute, dass der restl. Plattenplatz von 2,6 GB nicht mehr ausreicht um bei der 9GB grossen Tabelle viel zu machen.
Hätte versucht die Parameter in mariadb Datenbank in my.cnf zu setzen, aber das verweigert der Server.
Da kommt dann "unknown variable ..." in der error log und der Server startet nicht mehr.
evtl. hat es auch damit zu tun, weil bei meiner Datenbank 2 verschiedene Files als Einstellung dienen.
Da gibt es ein Verzeichnis /etc/mysql/conf.d/ und ein Verzeichnis /etc/mysql/mariadb.conf.d
In den Verzeichnissen gibt es dann mehrere Einstellungsdateien
In der conf.d sind dies mysql.cnf (die aber leer ist) und die mysqldump.cnf.
Im Verzeichnis mariadb.conf.d sind 4 Dateien 50-client.cnf, 50-mysql-clients.cnf, 50-mysql_safe.cnf und 50-server.cnf.
In letzterer habe ich auch versucht, das bringt evtl dass, dass ich die jede Abfrage sofort zu einen Abbruch führt.
Ich habe es derzeit mal in der my.cnf nach den Aufruf der beiden Verzeichnisse hinzugefügt.
Hier ändert das aber auch nichts am Verhalten.
Wenn ich im Netz suche, findet man sehr sehr viel, aber entweder ändert es nichts, oder der Server startet nicht mehr.
Derzeit ratlos. :'(
Um dir mehr Platz für temporäre Daten zu schaffen könntest du ein LW mounten und tmpdir der MySQL dorthin legen. Ist hier beschrieben: https://www.ibm.com/docs/en/strategicsm/10.1.3?topic=esads-assigning-directory-that-is-not-tmp-mysql-temporary-files
Moin zusammen,
ich würde mal einen externen Client zum Aufräumen verwenden, bzw damit eine Datensicherung zu machen.
Hierdurch wird der Backup nicht auch noch auf die volle Disk geschrieben.
Eventuell sollte man das auch in kleineren Stücken machen.
Das reine löschen von Datensätzen bringt jedoch nicht sofort mehr Plattenplatz, sondern erst nach einem reorg der Datenbank.
Die lost connection ist ein Timeout für die Rückmeldung. Also beim Löschen lieber kleinere Datenmengen selectieren.
VG Christian
Ich berichte was ich gemacht habe:
Bei den Wichtiges Logs die weiter zurück verfolge habe ich mir ein FileLog zusätzlich eingerichtet.
Jetzt nach etwa 2 Wochen habe ich, nach dem kein Versuch eines Fileexports funktioniert hat, die Tabelle history gelöscht und neu angelegt.
Dann habe ich mir von den FileLog Dateien die Werte geholt und ein csv Datei zum Import in die Datenbank gebastelt.
Diese dann Importiert. Nun läuft wieder alles.
Damit mir das aber nicht mehr passiert, möchte ich die DB Werte immer beobachten.
Daher lese ich mir mal alles was hier im Forum und im Wiki so steht.
Mein Ziel ist, dass in der Datenbank künftig die Werte nach 30 Tagen ausgedünnt werden. (zb. 1 Wert je Stunde)
Und Werte die älter 500 Tage sind (ca 1,5 Jahre), sollen gelöscht werden.
Oder wie macht ihr das?
Zitat von: maci am 09 März 2025, 20:22:55Mein Ziel ist, dass in der Datenbank künftig die Werte nach 30 Tagen ausgedünnt werden. (zb. 1 Wert je Stunde)
Und Werte die älter 500 Tage sind (ca 1,5 Jahre), sollen gelöscht werden.
Oder wie macht ihr das?
In etwa genau so mit Hilfe von DbRep-Devices.
Erstmal versuchen zu verhindern, dass überhaupt zu viel in der Db landet. Die Leistungsfähigkeit des DB-Servers ist da zumindest bei mir umgekehrt proportional zum Aufwand den ich damit betreibe :-D
Mit
- delSeqDoublets - lösche ich aufeinanderfolgende identische Einträge (mit unterschiedlichem Zeitstempel. kommt mit "event-on-change-reading" normal nicht vor, aber mit event-min-interval halt manchmal schon
- reduceLog - reduziere ich auf stündliche Durchschnittswerte
- delEntries - lösche ich alte Werte außerhalb der Aufbewahrungsfrist
Du kannst die verschiedene DbRep Devices für die unterschiedlichen Tasks anlegen. Ich lasse sie dann nachts sequentiell über "executeAfterProc" laufen.
Achte auf die richtigen Attribute und einstellungen. Gelöscht, ist gelöscht - außer du hast einen Dump oder deine csv noch zur Hand.