Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Database Plugin

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Hallo bmx,

    war eigentlich bis jetzt auch kein Problem.
    Habe 2660 Items.
    In der Datenbank steht:
    Die folgenden 727 Items sind dieser Instanz des Database Plugins zugewiesen, 419 Items haben ein maxage. - (Die Datenbank enthält Daten zu 609 Items )
    Was mich etwas wundert ist das 419 Items jetzt schon ein maxage haben? Habe den Docker Container aber erst ca 3 Tage.

    Habe jetzt die "struct: darksky.weather" in "darksky.weather_current_nodb" geändert. Das sind schon mal 425 Datenbank abfragen weniger.

    Danke schon mal. Aktuell keine Meldungen

    Gruß Danny


    Kommentar


      Ich hab die Meldung auch immer wieder sporadisch. Meist so 2-5 Einträge am Stück. Zeitlich eigentlich wild verteilt. Oftmals im Minutentakt mit der gleichen Sekundenangabe. Geht's hier um Datenbanklesen oder -schreiben? Den letzten zwei Einträgen zufolge am ehesten um beides?

      Kommentar


        Hallo Zusammen,

        nachdem ich meine RPI mit der 1.81 Image betankt habe und dann auch die Konfigurationen gefüllt habe bekomme ich nun folgende Meldungen im log.

        Code:
        2021-02-04 09:16:04 ERROR lib.db Can not execute query: UPDATE log SET duration = ?, val_str = ?, val_num = ?, val_bool = ?, changed = ? WHERE item_id = ? AND time = ?; (args [161806, None, 1.0, 1, 1612426559480, 1, 1612426387150]): database is locked
        
        2021-02-04 09:16:04 ERROR plugins.database Database: Error for query UPDATE log SET duration = 161806, val_str = None, val_num = 1.0, val_bool = 1, changed = 1612426559480 WHERE item_id = 1 AND time = 1612426387150;: database is locked
        
        2021-02-04 09:16:04 WARNING plugins.database Problem dumping env.core.scheduler.active_threads: database is locked
        
        2021-02-04 09:16:09 ERROR lib.db Can not execute query: UPDATE log SET duration = ?, val_str = ?, val_num = ?, val_bool = ?, changed = ? WHERE item_id = ? AND time = ?; (args [176498, None, 0.2, 1, 1612426564495, 6, 1612426387154]): database is locked
        
        2021-02-04 09:16:09 ERROR plugins.database Database: Error for query UPDATE log SET duration = 176498, val_str = None, val_num = 0.2, val_bool = 1, changed = 1612426564495 WHERE item_id = 6 AND time = 1612426387154;: database is locked
        
        2021-02-04 09:16:09 WARNING plugins.database Problem dumping env.system.load: database is locked
        
        2021-02-04 09:16:14 ERROR lib.db Can not execute query: UPDATE log SET duration = ?, val_str = ?, val_num = ?, val_bool = ?, changed = ? WHERE item_id = ? AND time = ?; (args [176498, None, 552046592.0, 1, 1612426569512, 7, 1612426387153]): database is locked
        
        2021-02-04 09:16:14 ERROR plugins.database Database: Error for query UPDATE log SET duration = 176498, val_str = None, val_num = 552046592.0, val_bool = 1, changed = 1612426569512 WHERE item_id = 7 AND time = 1612426387153;: database is locked
        
        2021-02-04 09:16:14 WARNING plugins.database Problem dumping env.system.memory.used: database is locked
        
        2021-02-04 09:16:19 ERROR lib.db Can not execute query: UPDATE log SET duration = ?, val_str = ?, val_num = ?, val_bool = ?, changed = ? WHERE item_id = ? AND time = ?; (args [176498, None, 69.5, 1, 1612426574527, 8, 1612426387154]): database is locked
        
        2021-02-04 09:16:19 ERROR plugins.database Database: Error for query UPDATE log SET duration = 176498, val_str = None, val_num = 69.5, val_bool = 1, changed = 1612426574527 WHERE item_id = 8 AND time = 1612426387154;: database is locked
        
        2021-02-04 09:16:19 WARNING plugins.database Problem dumping env.system.memory.percent: database is locked
        
        2021-02-04 09:16:24 ERROR lib.db Can not execute query: UPDATE log SET duration = ?, val_str = ?, val_num = ?, val_bool = ?, changed = ? WHERE item_id = ? AND time = ?; (args [176497, None, 0.0, 0, 1612426579544, 9, 1612426387153]): database is locked
        
        2021-02-04 09:16:24 ERROR plugins.database Database: Error for query UPDATE log SET duration = 176497, val_str = None, val_num = 0.0, val_bool = 0, changed = 1612426579544 WHERE item_id = 9 AND time = 1612426387153;: database is locked
        
        2021-02-04 09:16:24 WARNING plugins.database Problem dumping env.system.swap: database is locked
        
        2021-02-04 09:16:29 ERROR lib.db Can not execute query: UPDATE log SET duration = ?, val_str = ?, val_num = ?, val_bool = ?, changed = ? WHERE item_id = ? AND time = ?; (args [176498, None, 19.76, 1, 1612426584558, 10, 1612426387155]): database is locked
        
        2021-02-04 09:16:29 ERROR plugins.database Database: Error for query UPDATE log SET duration = 176498, val_str = None, val_num = 19.76, val_bool = 1, changed = 1612426584558 WHERE item_id = 10 AND time = 1612426387155;: database is locked
        
        2021-02-04 09:16:29 WARNING plugins.database Problem dumping env.system.diskusagepercent: database is locked
        
        2021-02-04 09:16:34 ERROR lib.db Can not execute query: DELETE FROM log WHERE (item_id = ? ) AND (time = ? OR 1 = ? ) AND (time > ? OR 1 = ? ) AND (time < ? OR 1 = ? ) AND (changed = ? OR 1 = ? ) AND (changed > ? OR 1 = ?) AND (changed < ? OR 1 = ? ); (args [2, None, 1, None, 1, 1609748169511, 0, None, 1, None, 1, None, 1]): database is locked
        
        2021-02-04 09:16:34 ERROR plugins.database Database: Error for query DELETE FROM log WHERE (item_id = 2 ) AND (time = None OR 1 = 1 ) AND (time > None OR 1 = 1 ) AND (time < 1609748169511 OR 1 = 0 ) AND (changed = None OR 1 = 1 ) AND (changed > None OR 1 = 1) AND (changed < None OR 1 = 1 ); : database is locked
        
        2021-02-04 09:16:34 ERROR plugins.database.Remove old Method plugins.database.Remove old exception: database is locked

        Kann jemand damit was anfangen? Wahrscheinlich habe ich da nur irgendetwas falsch konfiguriert oder hinkopiert :-(

        Grüße und Danke

        Marco

        Kommentar


          Nach dem Update von älteren Versionen findet ein aufräumen für eine Reihe von Items in der Datenbank statt (die Items, bei denen maxage gesetzt ist (Prominentes Beispiel: Darksky Daten). Solande dieser Update Job läuft, können Veränderungen nicht direkt in die DB geschrieben werden. Dann wird die Warnung

          Code:
          2021-02-02  06:04:03 WARNING  plugins.database    Skipping dump, since an other database operation running! Data is buffered and dumped later.
          geloggt. Daten gehen keine verloren (es sei denn der Rechner stürtzt ab). Wie der Logeintrag besagt, werden die Daten später geschrieben.


          Der andere Fall
          Code:
          2021-02-04 09:16:29 WARNING plugins.database Problem dumping env.system.diskusagepercent: database is locked
          klingt entweder nach einer defekten Datenbank oder die SQLite Datenbank ist von einem anderen Tool (oder einer weiteren laufenden SmartHomeNG Instanz) geöffnet.
          Viele Grüße
          Martin

          There is no cloud. It's only someone else's computer.

          Kommentar


            Ich hab noch Probleme beim Säubern der Datenbank entdeckt. Kann es sein, dass die cleanup Routine case sensitive ist, wohingegen das bei der Datenbank offenbar wurscht ist..?
            Sprich - ich hatte früher zB ein Item Test.OG, das jetzt test.og heißt. In der MySQL DB gibt es aber (Gott sei Dank) nur ein "gemeinsames" Item. Das hat zwar den alten Namen, bekommt aber aktuelle Daten vom Item mit dem neuen (lowcase) Namen. Also das DB Plugin schreibt Daten für die alte ID, was schon mal super ist.

            Ich hab jetzt aber mal ein Datenbank Cleaning angestoßen, da kommt's zu 2 Phänomenen:
            Auf Grund der Vielzahl der Daten ist der Clean Vorgang leider hängen geblieben. Hauptproblem scheint hier zu sein, dass das Löschen der Daten wohl sehr lange dauern kann, währenddessen aber noch sämtliche Operation vom Plugin munter weiter laufen. Das führte dazu, dass die Threads über den Threshold von 70 kletterten und SHNG neu gestartet hat. Die Threads kamen vom clean_max_age. Vermutlich ist es nicht gut, alle Operationen anzuhalten, zumal ja sowieso ein Buffering der Daten gemacht wird. Aber zumindest die Cleaning Threads sollten vielleicht vorübergehend deaktiviert werden?

            Größeres Thema aber.. sämtliche Einträge in der Log Tabelle für besagtes Item wurden gelöscht. Die Löschung fand - so behaupte ich - nur drum statt, weil Groß/Kleinschreibung nicht übereinstimmten. Kann das überhaupt sein oder sehe ich Gespenster?

            Hab jetzt nochmals mit eingeschaltetem Debuglog einen Löschvorgang losgetreten. Und zwar von einem Item, das keine Einträge mehr in der Datenbank hat, weil ich sie manuell gelöscht habe. Auch mit genau einem einzigen Eintrag geht's nicht weiter. Dann hängt die Prozedur leider auf ewig mit dieser Query fest:
            Code:
            Fetch DELETE FROM log WHERE (item_id = 6                                      ) AND (time    = None          OR 1 = 1         ) AND (time    > None    OR 1 = 1   ) AND (time    < None      OR 1 = 1     ) AND (changed = None       OR 1 = 1      ) AND (changed > None OR 1 = 1) AND (changed < None   OR 1 = 1  );
            Zuletzt geändert von Onkelandy; 04.02.2021, 20:09.

            Kommentar


              Onkelandy

              Ich pflege meine mysql DB mittlerweile von "Hand". Dazu stoppe ich shNG (da sonst auch die Threadanzahl aufgrund nicht möglicher Zugriffe steigt) und arbeite dann direkt über die mysql Konsole oder über die Konsole von phpmyadmin.

              Bspw für das Bereinigen der Tabelle "log" kopiere ich erst alle Einträge, deren ID nicht in der Tabelle "item" ist, in eine andere Tabelle und lösche dann diese Werte aus "log".

              Befehl für Tabelle erstellen
              Code:
              create log_aussortiert like log;
              Befehl für Kopieren:
              Code:
              INSERT INTO log_aussortiert SELECT * FROM `log` WHERE item_ID NOT IN(SELECT DISTINCT id FROM `item`;
              Befehl für Löschen
              Code:
              delete FROM `log` WHERE item_ID NOT IN(SELECT DISTINCT id FROM `item`
              Was auch wichtig ist, die DB nach solch einer Aktion zu optimieren. Dabei wird die Tabelle neu erstellt und Speicher freigegeben.

              Beste Grüße

              Kommentar


                Danke für den Tipp. Es ist vermutlich wirklich das Schlauste, das Ganze mal ganz akribisch manuell durchzuspielen über die Commandozeile.
                Meine Datenbank ist aktuell leider so riesig, dass das Restore nun schon fast 8 Stunden auf dem NAS läuft Da werde ich jetzt aber einige Datensätze mal killen
                Bei deinem ersten Befehl müsste es CREATE TABLE heißen und danach fehlt die eine oder andere Klammer.

                Es ist ein guter Start. Zuerst muss ich natürlich in der item Tabelle auch die Einträge raus löschen, die ich nicht mehr haben will Der "Clean Database" Befehl hingegen würde vermutlich alle Einträge von Items löschen, die aktuell kein database: yes Attribut haben, liege ich da richtig psilo ? Sowas lässt sich natürlich nicht wirklich über einen SQL Befehl abdecken, hehe. Aber da es eh nicht so viele Items betrifft, geh ich da mal rüber. Und schreibe mal alle Items in der DB mit lowercase, um da auf Nummer sicher zu gehen beim nächsten Cleanversuch über das Plugin.

                Kommentar


                  Onkelandy welcher "Clean Database" Befehl??? Ich hab bei dem Ding nur das WebIF dazugebaut.

                  Kommentar


                    Ah okay.. im WebIF gibt es oben zwei Buttons und einer ist eben dazu da, die Datenbank aufzuräumen. Was da 100% genau gemacht wird, ist mir nicht klar, aber ich gehe mal davon aus, dass es so ist wie oben beschrieben.

                    Kommentar


                      Cleanup ruft die Methode cleanup() im Plugin auf:
                      1. DB sperren
                      2. alle Einträge löschen, für die im DB-Plugin derzeit kein Item hinterlegt ist
                      3. DB freigeben
                      Also so ähnlich wie die Lösung von sisamiwe, aber auf Grundlage der derzeitigen Plugin-Konfiguration, nicht der DB-Inhalte.

                      Kommentar


                        Zitat von Onkelandy Beitrag anzeigen
                        Es ist ein guter Start. Zuerst muss ich natürlich in der item Tabelle auch die Einträge raus löschen, die ich nicht mehr haben will
                        Ich habe das so gemacht, dass ich mir einfach anschaue, wann ein Item das letzte mal in der Tabelle "item" aktualisiert wurde. Damit sollte man den Großteil finden.

                        Kommentar


                          Perfekt, so werde ich das machen.

                          Hast du mir vielleicht auch noch einen Tipp, wie ich Daten mergen kann?
                          Wenn ich also die Hierarchie geändert habe, z.B. früher hieß ein Item wp.leistung und jetzt heißt es heizung.wp.leistung.
                          Gibt's da n schönen SQL Befehl dazu? Würde das natürlich für jedes Item einzeln machen.

                          Müsste das so in die Richtung klappen?
                          Code:
                          MERGE log t
                          USING log s
                          ON (t.item_id = <neu> AND s.item_id = <alt>)
                          INSERT (time, item_id, duration, val_str, val_num, val_bool, changed)
                          VALUES (s.time, s.item_id, s.duration, s.val_str, s.val_num, s.val_bool, s.changed)
                          Deutlich praktischer wäre natürlich eine entsprechende Automatisierung mit SELECT %Like% oder so, da es doch eine Menge Items mit dem selben Muster betrifft..
                          Zuletzt geändert von Onkelandy; 05.02.2021, 14:32.

                          Kommentar


                            Zitat von Onkelandy Beitrag anzeigen
                            Hast du mir vielleicht auch noch einen Tipp, wie ich Daten mergen kann?
                            Du meinst mergen in der Tabelle log?
                            Ich habe dann einfach in der Tabelle Log die ItemID geändert. Also wenn bspw. das Item wp.leistung die Item_ID 50 hatte und das Item heizung.wp.leistung die Item_ID 100, dann habe ich im der Tabelle log bei allen Einträgen mit Item_ID von 50 auf diese auf 100 geändert.

                            mysql Befehl kann ich heute abend mal raussuchen.

                            Kommentar


                              Sisamiwe Hättest mir den SQL Befehl noch parat?

                              Kommentar


                                Zitat von Onkelandy Beitrag anzeigen
                                Hättest mir den SQL Befehl noch parat?

                                Ja klar. Hier mal meine Befehle für mySQL DB Pflege:

                                Löschen von Einträgen mit der Dauer NULL:
                                Code:
                                DELETE FROM `log` WHERE `duration` IS NULL
                                Selektieren der Datensätze in der Tabelle 'log', wenn es keine passende ID in der Tabelle 'item' gibt:
                                Code:
                                SELECT * FROM `log` WHERE item_ID NOT IN(SELECT DISTINCT id FROM `item`)
                                Kopieren der Datensätz von der Tabelle 'log', wenn es keine passende ID in der Tabelle 'item' gibt, in die Tabelle log_aussortiert:
                                Code:
                                INSERT INTO log_aussortiert SELECT * FROM `log` WHERE item_ID NOT IN(SELECT DISTINCT id FROM `item`)
                                Löschen der Datensätze in der Tabelle 'log', wenn es keine passende ID in der Tabelle 'item' gibt:
                                Code:
                                DELETE FROM `log` WHERE item_ID NOT IN(SELECT DISTINCT id FROM `item`)
                                Daten einer Spalte anzeigen ohne Dubletten:
                                Code:
                                SELECT DISTINCT item_id FROM log_aussortiert
                                Werte in Spalte einer Tabelle ändern:
                                Code:
                                UPDATE `<TabellenName>` SET `<FeldName>` = <neuer Wert> WHERE <Bedingung>
                                Beispiel dazu "Ändern der item_id aller Einträge mit item_id = 50 auf 100":
                                Code:
                                UPDATE 'log' SET 'item_id'= 100 WHERE 'item_ID' = 50;
                                Beispiel dazu "Offset von 5 auf alle Werte in val_num bei item_id = 50":
                                Code:
                                UPDATE 'log' SET 'val_num' = 'val_num' + 5 WHERE 'item_ID' = 50;
                                Damit bin ich weit gekommen.

                                Vielleicht hilft es.

                                PS: Für neues Mapping kannst Du auch shNG stoppen und in der Tabelle item die id ändern.

                                Kommentar

                                Lädt...
                                X