Ah ja, ich verstehe. Und gibt es keine Möglichkeit, dies regelmäßig durchzuführen, um zu vermeiden, dass man enorm viele Daten auf einmal löschen muss?
In meinem Fall habe ich 68 GB Festplattenspeicher, 22 GB Datenbank und 22 GB freien Speicher. Allerdings wird der VACUUM nie beendet, weil auf der Festplatte kein Platz mehr ist.
Ich habe eine .db-wal-Datei von fast 10 GB zusätzlich zu den 22 GB der Datenbank. Ich weiß nicht mehr, was ich tun soll.
Das manuelle Ausführen der Aufgabe funktioniert nicht, ich erhalte eine Fehlermeldung « Datenbank gesperrt ». Selbst wenn ich einen anderen TMPDIR-Pfad angeben, der über 800 GB freien Speicher verfügt.
In meinem Fall musste ich ein wal_checkpoint(TRUNCATE); ausführen, damit die Datei .db-wal geleert wird, die genauso groß wie die DB geworden ist.
Und dann das VACUUM.
Macht Gladys normalerweise regelmäßig einen Checkpoint?
[EDIT]
Wenn Gladys eine « Aufräum »-Aufgabe (also ein VACUUM) startet, wird die Datei .db-wal immer größer, bis sie die gleiche Größe wie die DB erreicht.
Ich lande also mit zwei riesigen Dateien (Aufgabe läuft gerade hier):
Was ich gemacht habe, ist, dass ich die Datenbank verschoben habe, auf eine Partition mit mehr Platz.
Aber ich verstehe nicht, was als nächstes kommt
Retention nicht gelöscht?
Meine Datenbank ist 22 GB groß, mit unbegrenzter Retention für alle meine Geräte. Um die Größe zu verringern, habe ich eine Retention von 6 Monaten für die Zustände und unbegrenzt für die aggregierten Werte eingerichtet.
Trotzdem, selbst mit einem VACUUM nach allen Löschaufgaben von Gladys, bin ich bei 17 GB. Beim Suchen habe ich eine Abfrage gefunden, um die Namen der Werte pro Tabelle aufzulisten, und ich verstehe nicht, warum es so wenig Unterschied zwischen den aggregierten Werten und den Rohwerten gibt.
Wenn du 3 Monate Statusdaten und 6 Monate aggregierte Statusdaten behältst, bedeutet das:
1 Zeile für jeden Status jeder Funktion jedes Geräts für die letzten 3 Monate
1 Zeile für jede Minute (Stundenansicht), 1 Zeile für jede 5 Minuten (Tagesansicht), 1 Zeile für jeden Tag (Wochen-, Monats-, 3-Monats-, Jahresansichten) für die letzten 6 Monate für jede Funktion jedes Geräts
Daher erzeugen die aggregierten Status trotzdem viele Zeilen
Dieser Befehl zeigt dir, welche Geräte/Funktionen die meisten Statusdaten speichern.
SELECT COUNT(*) as total, tdf.id, tdf.name, td.name
FROM t_device_feature_state tdfs
JOIN t_device_feature tdf ON tdf.id = tdfs.device_feature_id
JOIN t_device td ON td.id = tdf.device_id
GROUP BY device_feature_id ORDER BY total DESC;
PS: Hast du mit nur 6 Monaten mehr Reduktion erwartet?
GROUP BY device_feature_id ORDER BY total DESC;
4081384|8ede0b40-31b8-42a1-b6d8-fdfceaea35e1|Formaldehyd (Dezimal)|capteurQualitéDeLair
2426183|631724ce-6fca-48c8-8588-5598f5a736ee|COV (Dezimal)|capteurQualitéDeLair
2425895|b1289ec3-87f7-4dfc-bc95-80a9fa2bd840|CO2-Level|capteurQualitéDeLair
2000636|b0eb1e68-2b18-4c9d-b20b-0547a0641698|Signalstärke|PriseBureau
941126|30d10a22-d247-49b9-873e-9aec623f886f|Verbrauchte Leistung|PriseBureau
785583|2c8ced8b-e581-497d-b247-e6cb884d45da|Verbrauchte Stromstärke|PriseBureau
611299|c1a94fd6-3413-46ef-86df-33214fb74328|Verbrauchte Leistung|PriseOnduleur
544435|4d88bc30-dbf3-4165-919d-fba0c54b728e|Signalstärke|PriseVideoproj
512281|6f91c791-fd31-43ad-89d6-91418fffdaf1|Verbrauchte Leistung|PriseFrigoTS0121
313060|6b907ebe-c011-4dd1-af54-339b51add63f|Signalstärke|InterrupteurSalon
302039|d9d990a1-6b0a-4d58-bc19-9a7c591ecf71|Signalstärke|CapteurFumeeEntree
278423|3cf063a8-8ced-4134-954f-e1b81f930a16|Bewegungserkennung Ja/Nein|CapteurMouvementEntree
Bei genauerer Betrachtung habe ich tatsächlich Zustände, die älter als die vorgesehenen 3 Monate sind. Sollte die Aufgabe „Aufräumen“ nicht alles löschen?
Letztlich habe ich durch die manuelle Durchführung wahrscheinlich bereits 3,3 GB gespart, wenn man der .db-wal-Datei glaubt, die angewachsen ist.
sqlite> DELETE FROM t_device_feature_state WHERE device_feature_id = "8ede0b40-31b8-42a1-b6d8-fdfceaea35e1" AND created_at < "2023-12-31 00:00:00.000";
Ich habe 3 Monate Retention und meine letzten Status sind tatsächlich vom 28. Dezember.
Ich habe 6 Monate aggregierte Retention und meine letzten aggregierten Status sind tatsächlich vom 27. September.
Und deine Aufgabe Reinigung alter Gerätestatus ist tatsächlich erfolgreich
Wir sollten uns das mal ansehen Write-Ahead Logging
Ein WAL-Datei von mehreren Gigabyte erscheint mir komisch.
Du kannst immer noch den Docker gladys neu starten, um die Verbindung zu schließen, die Änderungen zu übernehmen und die WAL-Datei zu bereinigen.
Ich hatte vor ein paar Monaten ein Problem mit einer vollen Partition und meine Lösung war es… den db-wal zu löschen, der größer war als die DB…
Radikal, aber ich hatte danach keine Probleme…
Edit: Ich sehe, dass dein db-wal tatsächlich gelöscht wurde, also bin ich raus. Entschuldigung…
Ich glaube, es gibt ein Missverständnis darüber, wie das Löschen in Gladys funktioniert.
Du sprichst über zwei verschiedene Dinge:
Datenbankbereinigung: Dieser Button ist nur ein Shortcut für den SQLite-Befehl VACUUM. Der Befehl VACUUM rekonstruiert die Datenbankdatei, um den von gelöschten Tupeln belegten Speicherplatz freizugeben. Für weitere Informationen ist die SQLite-Dokumentation sehr klar: VACUUM
Wenn du die Aufbewahrungsdauer in der UI änderst, erfolgt die Bereinigung der alten Zustände erst bei der nächsten Ausführung um 4 Uhr morgens (um deine Produktion nicht zu sehr zu stören).
Das könnte in der Benutzeroberfläche angezeigt werden, denke ich…
Wenn du also ein VACUUM ausführst, während die Zustände noch vorhanden sind, wird nichts gelöscht, das ist normal
Man muss bis 4 Uhr morgens warten und dann das VACUUM ausführen.
Mist, ich hatte vermutet, dass es das ist, aber ich war wohl zu ungeduldig ^^
Lass uns heute Morgen mal sehen, was passiert! Danke, dass du dir die Zeit genommen hast zu antworten
Ich grabe dieses Thema wieder aus, weil ich ein Problem mit wenig Festplattenspeicher habe.
Dabei habe ich überhaupt keine Lust, an meiner Datenbank herumzubasteln, oder mein Terminal zu benutzen, weil ich Angst habe, alles zu zerstören (und nebenbei gesagt, weil das immer so zeitaufwendig ist!)
Kann mir einer von euch eine einfachere Anleitung geben? Falls es eine gibt?
Setze etwas Kleineres als das, was du aktuell hast.
Dann wird Gladys um 4 Uhr morgens die alten Zustände, die älter sind als die gewählte Dauer, bereinigen.
Allerdings, da du bereits einen ziemlich « ernsten » Zustand erreicht hast (kein Festplattenspeicher mehr..), kann es sein, dass das fehlschlägt. Dann musst du leider manuell Speicherplatz freimachen. Das Problem liegt dann nicht mehr bei Gladys, sondern beim Linux-System ^^