Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Off Topic
    4. SQL Disk Full

    NEWS

    • ioBroker goes Matter ... Matter Adapter in Stable

    • 15. 05. Wartungsarbeiten am ioBroker Forum

    • Monatsrückblick - April 2025

    SQL Disk Full

    This topic has been deleted. Only users with topic management privileges can see it.
    • S
      stfan1409 last edited by

      Hallo Forum,
      ich habe lange gesucht, aber nichts zum Thema SQL-Datenbank und Festplatte voll gefunden.
      Leider kenne ich mich mit sql-Datenbanken nicht aus.
      Nun habe ich seit einiger Zeit folgenden Fehler im ioBroker-LOG (mit diversen Variablen):

      sql.0	2021-06-07 18:30:52.470	info	(2275) enabled logging of s7.0.DBs.DB1.Arduino_M2560_OG_Störung_Lebensbit, Alias=false
      sql.0	2021-06-07 18:30:48.228	error	(2275) Error: ER_DISK_FULL: Disk full (/tmp/#sql_35ae_3.MAI); waiting for someone to free some space... (errno: 28 "No space left on device")
      sql.0	2021-06-07 18:30:45.688	info	(2275) enabled logging of s7.0.DBs.DB1.Arduino_M2560_K_Störung_Lebensbit, Alias=false
      sql.0	2021-06-07 18:30:41.515	error	(2275) Error: ER_DISK_FULL: Disk full (/tmp/#sql_35ae_3.MAI); waiting for someone to free some space... (errno: 28 "No space left on device")
      sql.0	2021-06-07 18:30:38.530	info	(2275) enabled logging of s7.0.DBs.DB1.Arduino_M2560_G_Störung_Lebensbit, Alias=false
      sql.0	2021-06-07 18:30:13.266	error	(2275) Error: ER_DISK_FULL: Disk full (/tmp/#sql_35ae_3.MAI); waiting for someone to free some space... (errno: 28 "No space left on device")
      

      Ich habe ein Synology NAS und nutze MariaDB 10 als "sql-Datenbank". Meine Information ist bisher, dass so eine Datenbank keine größenbeschränkung hat - außer die Fesplatte ist voll. Auf meinem NAS ist aber noch freier Speicherplatz vorhanden.
      Was mich auch verwundert ist, dass Variablen(alle???) aktuell in der Datenbank aufgezeichnet werden. Anscheinend kann ich aber keine neuen Hinzufügen?
      Wie kann ich den Fehler einkreisen? Wie gesagt, ich kenne mich mit SQL nicht aus und hoffe auf Eure Unterstützung.

      kurz zum System:
      Linux/Ubuntu; Node.js v15.6.0; NPM 7.4.0; js-controller 3.1.6
      Synology NAS MariaDB 10

      Gruß, Tobias

      Thomas Braun OliverIO 2 Replies Last reply Reply Quote 0
      • Thomas Braun
        Thomas Braun Most Active @stfan1409 last edited by Thomas Braun

        @stfan1409

        Node.js v15.6.0; NPM 7.4.0

        Unglückliche Konstellation. node immer in geraden Versionen fahren (im Moment wird node12 empfohlen, max node14), npm (im Moment zumindest) in Version 6 verwenden.

        Zum Problem:

        df
        

        sagt?

        S 1 Reply Last reply Reply Quote 0
        • S
          stfan1409 @Thomas Braun last edited by

          @thomas-braun sagte in SQL Disk Full:

          @stfan1409

          Node.js v15.6.0; NPM 7.4.0

          Unglückliche Konstellation. node immer in geraden Versionen fahren (im Moment wird node12 empfohlen, max node14), npm (im Moment zumindest) in Version 6 verwenden.

          Kann ich denn von Version 15 runter auf 12?

          Zum Problem:

          df
          

          sagt?

          Was ist df?

          Thomas Braun 1 Reply Last reply Reply Quote 0
          • Thomas Braun
            Thomas Braun Most Active @stfan1409 last edited by

            @stfan1409
            Ja, man kann die node-Version downgraden.

            df
            

            ist ein Konsolenbefehl und zeigt wie voll die Partition ist.

            S 1 Reply Last reply Reply Quote 0
            • S
              stfan1409 @Thomas Braun last edited by

              @thomas-braun
              so hab mich mal mit der Konsole vom NAS verbunden und "df" eingegeben. scheint einiges frei zu sein:
              7002c9de-ce45-4a77-a6f8-85c98b1daa6c-grafik.png

              Thomas Braun 1 Reply Last reply Reply Quote 0
              • Thomas Braun
                Thomas Braun Most Active @stfan1409 last edited by

                @stfan1409

                Du musst in die VM oder in den Container rein, in dem die Datenbank läuft.

                S 1 Reply Last reply Reply Quote 0
                • S
                  stfan1409 @Thomas Braun last edited by

                  hmmmm...also ich hab das Synology NAS, auf dem MariaDB läuft.
                  Wenn ich auf der NAS-Oberfläche "MariaDB" öffne, steht hier noch etwas von:
                  Domain-Socket: /run/mysqld/mysqld10.sock
                  Ich weiß aber nicht, wie ich dahin komme oder was das ist.

                  1 Reply Last reply Reply Quote 0
                  • OliverIO
                    OliverIO @stfan1409 last edited by

                    @stfan1409 sagte in SQL Disk Full:

                    Error: ER_DISK_FULL: Disk full (/tmp/#sql_35ae_3.MAI)

                    was für sql statements laufen da?
                    hast du die selber erstellt?

                    Der Fehler
                    Error: ER_DISK_FULL: Disk full (/tmp/#sql_35ae_3.MAI);
                    sag aus, das die Disk full ist.
                    da hier der Pfad tmp angegeben wurde, gehe ich davon aus,
                    das da eine schlecht formulierte sql-anweisung läuft, die die datenbank dazu zwingt die daten in eine datei (im ordner tmp) auszulagern um dort dann die Operation durchzuführen.
                    da die datei nach erfolg oder abbruch sofort wieder gelöscht werden, siehst du nicht das die tempoorär voll läuft.
                    die partition auf der tmp liegt ist auch nicht auf der haupt partition, wo massig platz ist. aber das ist grundsätzlich ok. es könnte auch eine ram-disk sein, die nicht unendlich erweiterbar ist.

                    S 1 Reply Last reply Reply Quote 0
                    • S
                      stfan1409 @OliverIO last edited by

                      @oliverio
                      Hallo, also ich habe die Benutzeroberfläche "phpMyAdmin". Da habe ich eine neue Datenbank angelegt und diese in ioBroker eingetragen. Mehr nicht. Welche Statements da laufen? Da kenne ich mich nicht mit aus.
                      Wenn ich nun den Namen der Datenbank ändere - z.b. "daten-alt" und eine neue mit dem vorherigen namen, müsste iobroker die doch einfach so weiter nutzen. Kann ich dann die Daten aus der alten Datenbank in die neue verschieben?

                      OliverIO 1 Reply Last reply Reply Quote 0
                      • OliverIO
                        OliverIO @stfan1409 last edited by OliverIO

                        @stfan1409 sagte in SQL Disk Full:

                        @oliverio
                        Hallo, also ich habe die Benutzeroberfläche "phpMyAdmin". Da habe ich eine neue Datenbank angelegt und diese in ioBroker eingetragen. Mehr nicht. Welche Statements da laufen? Da kenne ich mich nicht mit aus.
                        Wenn ich nun den Namen der Datenbank ändere - z.b. "daten-alt" und eine neue mit dem vorherigen namen, müsste iobroker die doch einfach so weiter nutzen. Kann ich dann die Daten aus der alten Datenbank in die neue verschieben?

                        ist das dann deine einzige datenbank und du nutzt nur den sql-adapter?
                        dann zeige mal bitte die tabellen übersicht aus myphpadmin.
                        interessant daraus wäre da der tabellenname, die anzahl der datensätze und die daraus resultierende größe

                        du hattest oben geschrieben:

                        Was mich auch verwundert ist, dass Variablen(alle???) aktuell in der Datenbank aufgezeichnet werden.

                        meinst du das du "alle" datenpunkte aufzeichnen lässt?

                        S 1 Reply Last reply Reply Quote 0
                        • S
                          stfan1409 @OliverIO last edited by stfan1409

                          @oliverio sagte in SQL Disk Full:

                          phpMyAdmin

                          Ich nutze SQL zum ersten Mal. Ich habe nur eine Datenbank für ioBroker angelegt.
                          b0c2508f-6a78-48c4-9a0b-c291cba33604-grafik.png

                          e37179ad-e6e2-43da-ac70-5c223feab757-grafik.png

                          du hattest oben geschrieben:

                          Was mich auch verwundert ist, dass Variablen(alle???) aktuell in der Datenbank aufgezeichnet werden.

                          meinst du das du "alle" datenpunkte aufzeichnen lässt?

                          Ich wollte damit sagen, dass z.B. die Außentemperatur weiter aufgezeichnet wird. Im Graphen sehe ich die aktuelle Tageskurve. Neue Variablen dagenen kann ich nicht aufzeichnen bzw. bekomme die Fehlermeldung Speicher voll. Ich zeichne nur bei Änderungen auf.

                          OliverIO 1 Reply Last reply Reply Quote 0
                          • OliverIO
                            OliverIO @stfan1409 last edited by

                            @stfan1409

                            das sind nicht die richtigen ansichten.
                            klicke links in der baumstruktur auf iobroker
                            dann siehst du so etwas

                            df00229c-ff7d-418f-a0ff-8c8367054aa9-image.png

                            dort stehe die anzahl datensätze je tabelle und die speichergröße.
                            wenn da jetzt keine riesigen zahlen stehen, dann weiß ich nicht weiter.

                            dann hat es wohl mit dem nas und der platzzuweisung dort zu tun.
                            bei mir läuft die datenbank auf einem nuc in einem docker container.
                            aber grundsätzlich muss das bei dir schon funktionieren.

                            wenn sonst niemand mehr was weiß, evtl. auf der nas die datenbank nochmal deinstallieren und neu installieren

                            S 1 Reply Last reply Reply Quote 0
                            • S
                              stfan1409 @OliverIO last edited by stfan1409

                              @oliverio
                              jetzt wird es interessant - ich vergleiche mal ts_number:
                              also bei dir: ###570.702 geteilt durch##34,2MiB ---------> 0,0000599
                              und bei mir: 93.784.196 geteilt durch 4,5GiB (4500Mib?) -> 0,0000479

                              wenn ich den Speicher pro Wert nehme komme ich auf das Selbe oder?

                              78c0425d-ead8-44be-9e56-50fcea1180ca-grafik.png

                              Frage 1: warum habe ich soviele Werte?
                              Frage 2: ist 4,6GB eine Grenze?
                              Frage 3: kann ich die Werte jetzt einmalig von Hand "glätten" / reduzieren?

                              und hier hab ihc noch eine Info gefunden:
                              679b7dd7-a8d3-473a-90bc-ca735dfb5529-grafik.png

                              Dr. Bakterius OliverIO 2 Replies Last reply Reply Quote 0
                              • Dr. Bakterius
                                Dr. Bakterius Most Active @stfan1409 last edited by

                                @stfan1409 sagte in SQL Disk Full:

                                Frage 1: warum habe ich soviele Werte?

                                Das kannst nur du beantworten. Wie viele Datenpunkte lässt du aufzeichnen? Wie lange speicherst du die Aufzeichnungen? Wie oft ändern sich die aufgezeichneten Werte? Werden nur Änderungen gespeichert? Wie lange befüllst du die Datenbank schon. Hast du alte Werte gespeichert die du schon lange nicht mehr brauchst?

                                Meine läuft jetzt schon einige Jahre und neben Stromverbrauch diverser Steckdosen und des Stromzählers, werden Raum- und Außentemperaturen, Luftfeuchtigkeit, CO2, Regenmengen und Windstärke aufgezeichnet. Dann auch noch einige Systemwerte, die Wassertemperatur vom Aquarium und den Status der Alarmanlage. Alles nur bei Änderung und unterschiedliche Behaltedauer. Und ich habe nicht einmal 10% deiner Datenbankgröße!

                                Du kannst selektiv unnötige Werte oder auch zu alte Werte per Datenbankabfragen löschen und die Datenbank danach optimieren lassen. Wird aber eine Weile dauern bei der Größe.

                                1 Reply Last reply Reply Quote 0
                                • OliverIO
                                  OliverIO @stfan1409 last edited by OliverIO

                                  @stfan1409 sagte in SQL Disk Full:

                                  @oliverio
                                  jetzt wird es interessant - ich vergleiche mal ts_number:
                                  also bei dir: ###570.702 geteilt durch##34,2MiB ---------> 0,0000599
                                  und bei mir: 93.784.196 geteilt durch 4,5GiB (4500Mib?) -> 0,0000479

                                  wenn ich den Speicher pro Wert nehme komme ich auf das Selbe oder?

                                  78c0425d-ead8-44be-9e56-50fcea1180ca-grafik.png

                                  Frage 1: warum habe ich soviele Werte?
                                  Frage 2: ist 4,6GB eine Grenze?
                                  Frage 3: kann ich die Werte jetzt einmalig von Hand "glätten" / reduzieren?

                                  und hier hab ihc noch eine Info gefunden:
                                  679b7dd7-a8d3-473a-90bc-ca735dfb5529-grafik.png

                                  Aha, da haben wir es ja.
                                  Zu jeder Tabelle gehören mindestens ein Index.
                                  Wenn Werte hinzugefügt werden, muss der Index aktualisiert werden.
                                  Das passiert nicht immer gleich, sondern meist etwas zeitversetzt. Das ist aber das Geheimnis der Datenbankoptimierer der Hersteller.
                                  Allein der Index ist dann größer wie der freie Speicher, da dieser erst als neue Datei angelegt wird und erst zum Schluss umkopiert wird, um ja einen Ausfall zu verhindern.

                                  Ich habe bei mir im sql-Adapter eingestellt, das ich die Werte nur ein Jahr zurück benötige. Das könntest du einmal für alle Datenpunkte tun.
                                  ausserdem, das nur veränderte Werte gespeichert. Aber ich kenne deinen konkreten Anwendungsfall nicht was da aufgezeichnet wird
                                  Ich glaub das muss man für jeden DP separat machen, ansonsten musst du mal im Hilfethread für den sql-adapter nachfragen.

                                  Zur Sicherheit kannst du auch die ganze Datenbank in myphpAdmin wegsichern. Allerdings dauert das bei dieser Datenmenge ein wenig.

                                  S 1 Reply Last reply Reply Quote 0
                                  • S
                                    stfan1409 @OliverIO last edited by stfan1409

                                    @oliverio
                                    kann ich auch sehen, von welcher Variable die größte Datenmenge ist? Nicht das ich bei einer Variable sehr viel abspeichere, weil ich einen Haken vergessen/übersehen habe?
                                    Wie finde ich die Variable in ioBroker wieder(um dann dort die Einstellungen zu überprüfen)?
                                    Ich bin der Meinung, dass die Datenbank noch nicht ein ganzes Jahr läuft...

                                    1 Reply Last reply Reply Quote 0
                                    • OliverIO
                                      OliverIO last edited by

                                      @stfan1409 sagte in SQL Disk Full:

                                      @oliverio
                                      kann ich auch sehen, von welcher Variable die größte Datenmenge ist? Nicht das ich bei einer Variable sehr viel abspeichere, weil ich einen Haken vergessen/übersehen habe?
                                      Wie finde ich die Variable in ioBroker wieder(um dann dort die Einstellungen zu überprüfen)?
                                      Ich bin der Meinung, dass die Datenbank noch nicht ein ganzes Jahr läuft...

                                      die variablen nennen sich hier datenpunkte.
                                      nicht das jemand in zukuft das mit den variablen aus javascript verwechselt

                                      gehe in phpmyadmin
                                      klicke links in baumstruktur auf die datenbank iobroker
                                      wähle oben den reiter SQL aus
                                      trage den folgenden text ein

                                      SELECT dp.name,count(val.val) FROM ts_number as val INNER JOIN datapoints as dp ON val.id = dp.id  GROUP BY val.id
                                      

                                      als ergebnis kommt die anzahl datensätze je datenpunkt

                                      S 1 Reply Last reply Reply Quote 0
                                      • S
                                        stfan1409 @OliverIO last edited by

                                        @oliverio sagte in SQL Disk Full:

                                        SELECT dp.name,count(val.val) FROM ts_number as val INNER JOIN datapoints as dp ON val.id = dp.id GROUP BY val.id

                                        wie lange kann das denn dauern? Ich hab den Text reinkopiert und "ok" angeklickt. Dann steht da "Laden..."
                                        oder muss ich den Text noch anpassen?

                                        OliverIO 1 Reply Last reply Reply Quote 0
                                        • OliverIO
                                          OliverIO @stfan1409 last edited by OliverIO

                                          @stfan1409 sagte in SQL Disk Full:

                                          SELECT dp.name,count(val.val) FROM ts_number as val INNER JOIN datapoints as dp ON val.id = dp.id GROUP BY val.id

                                          ich habe 570 Tausend Datensätze, da hat es 0,3 Sekunden gedauert.

                                          du hast knapp 100 Millionen Datensätze!!!

                                          Es kann sein, das du mit deinen System da schon an den Grenzen bist.
                                          Um rauszufinden, ob das abgebrochen ist oder noch läuft, müsste man in die logs reinschauen.

                                          oder du kannst auf den Namen einen Index setzen
                                          Wenn das nicht funktioniert, dann sollte man mal daran denken, alle oder viele Datensätze zu löschen.
                                          Evtl kannst du auch die Tabelle mit den 100 Millionen einfach mal als Sicherung in eine 2. Tabelle kopieren.
                                          Datenbank auswählen->Tabelle auswählen->Reiter Operationen->Kopiere Tabelle nach (Datenbank.Tabellenname)

                                          Aber bei der Datenmenge dauert das kopieren, anlegen eines Index einfach eine Weile. (kopieren der Tabelle mit 570K dauerte bei mir ca 3-4 Sekunden)

                                          S 1 Reply Last reply Reply Quote 0
                                          • S
                                            stfan1409 @OliverIO last edited by stfan1409

                                            @oliverio sagte in SQL Disk Full:

                                            ich habe 570 Tausend Datensätze, da hat es 0,3 Sekunden gedauert.

                                            irgend etwas ist da defekt. Ich habe 426 Tausend Datensätze in eine neue Datenbank kopiert und es hat 21 Sekunden gedauert, d.h. für die 95Mio benötige ich 80 Min. Aber es klappt einfach nicht.

                                            Jetzt hab ich nur noch eine Hoffnung, dass ich die Daten vielleicht halbieren kann, indem ich jeden zweiten Datensatz lösche.
                                            In einem anderen Forum hab ich das gelesen, ich weiß aber nicht, wie ich es hier eingeben muss.
                                            Hier die Infos:
                                            https://www.selfphp.de/forum/showthread.php?t=23644

                                             AW: DB verkleinern: jeden 2. Datensatz löschen
                                            Hi,
                                            
                                            das geht auch mit mysql.
                                            
                                            1. Primary key löschen (created)
                                            Code:
                                            
                                            ALTER TABLE `tabelle1` DROP PRIMARY KEY
                                            
                                            2. Spalte id Primary auto increment erstellen
                                            Code:
                                            
                                            ALTER TABLE `tabelle1` ADD `id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST ;
                                            
                                            3. Jede 2. Zeile löschen
                                            Code:
                                            
                                            DELETE FROM `tabelle1` WHERE id%2=0
                                            
                                            4. Spalte id löschen
                                            Code:
                                            
                                            ALTER TABLE `tabelle1` DROP `id`
                                            
                                            5. Primary key anlegen (created)
                                            Code:
                                            
                                            ALTER TABLE `tabelle1` ADD PRIMARY KEY ( `created` )
                                            
                                            fertig. 
                                            

                                            Wie geht das in "phpMyAdmin"? Sonst sehe ich nur die Möglichkeit, die Datenbank zu löschen...

                                            OliverIO 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            675
                                            Online

                                            31.6k
                                            Users

                                            79.5k
                                            Topics

                                            1.3m
                                            Posts

                                            5
                                            29
                                            1588
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo