Festplatte voll / Hilfe bei der Datenbankbereinigung

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.

Ich habe dieses Thema in ein neues Thema verschoben :slight_smile:

Nein, denn VACUUM ist langsam auf großen Datenbanken/langen Disks, selbst wenn es kürzlich ausgeführt wurde.

In deinem Fall würde ich Folgendes tun:

  • Gladys stoppen
  • Deine DB auf deinen PC oder auf eine leistungsfähigere Disk mit mehr Speicherplatz kopieren
  • Ein Tool wie TablePlus verwenden, um einen SQLite-Befehl auf deiner DB auszuführen
  • „VACUUM;“ ausführen
  • Sobald das erledigt ist, die DB auf deinen Gladys-Server zurückkopieren
  • Gladys neu starten

:slight_smile:

Ich habe gezögert, ein eigenes Thema zu erstellen, danke!

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):
Bildschirmfoto 2024-03-27 162440

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 :thinking:

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.

Vacuum nicht funktionell?

Sobald die Vacuum-Aufgabe abgeschlossen ist, habe ich zwei riesige Dateien, die nicht gelöscht werden.

Die Aufgabe ist aber abgeschlossen:

Capture d'écran 2024-03-27 163129

Erst wenn ich Gladys zwinge, zu stoppen oder neu zu starten, wird die Datei .db-wal gelöscht. Aber ich habe immer noch 17 GB belegt.

Capture d'écran 2024-03-27 163222

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 :sweat:

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?

Danke für deine Nachricht und die Anfrage.

Hier ist das Ergebnis:

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?

sqlite> SELECT * FROM t_device_feature_state WHERE device_feature_id = "8ede0b40-31b8-42a1-b6d8-fdfceaea35e1" ORDER BY created_at ASC LIMIT 10;
id|device_feature_id|value|created_at|updated_at
afee0e90-6084-4571-bfec-1acd4b7d4a8e|8ede0b40-31b8-42a1-b6d8-fdfceaea35e1|3.0|2023-08-31 01:23:29.486 +00:00|2023-08-31 01:23:29.486 +00:00
4b836770-b2da-47a0-bc5f-abd2c24f65ee|8ede0b40-31b8-42a1-b6d8-fdfceaea35e1|3.0|2023-08-31 01:23:33.090 +00:00|2023-08-31 01:23:33.090 +00:00
c1b9ec79-663a-4730-8de6-1f226d39c336|8ede0b40-31b8-42a1-b6d8-fdfceaea35e1|3.0|2023-08-31 01:23:36.497 +00:00|2023-08-31 01:23:36.497 +00:00
a7697c08-c7b5-4282-8a54-b98071e56deb|8ede0b40-31b8-42a1-b6d8-fdfceaea35e1|3.0|2023-08-31 01:23:40.002 +00:00|2023-08-31 01:23:40.002 +00:00
927c202e-fae5-4c8a-9e97-efe9db7a01d5|8ede0b40-31b8-42a1-b6d8-fdfceaea35e1|3.0|2023-08-31 01:23:43.512 +00:00|2023-08-31 01:23:43.512 +00:00
423cdb73-33a6-4dac-a0e2-a397184f7277|8ede0b40-31b8-42a1-b6d8-fdfceaea35e1|3.0|2023-08-31 01:23:47.010 +00:00|2023-08-31 01:23:47.010 +00:00
c7114d81-8740-4c42-bcde-790ec4ecbe02|8ede0b40-31b8-42a1-b6d8-fdfceaea35e1|3.0|2023-08-31 01:23:50.638 +00:00|2023-08-31 01:23:50.638 +00:00
59a722ee-71c2-44a9-ae8b-a9912d79a3b3|8ede0b40-31b8-42a1-b6d8-fdfceaea35e1|3.0|2023-08-31 01:23:54.175 +00:00|2023-08-31 01:23:54.175 +00:00
91435e9b-3c4f-4866-9940-4d360949d099|8ede0b40-31b8-42a1-b6d8-fdfceaea35e1|3.0|2023-08-31 01:23:57.655 +00:00|2023-08-31 01:23:57.655 +00:00
9a2f224f-16dc-4752-84bf-735823ec9303|8ede0b40-31b8-42a1-b6d8-fdfceaea35e1|3.0|2023-08-31 01:24:01.066 +00:00|2023-08-31 01:24:01.066 +00:00

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 :thinking:

Wieder einmal ist meine Datenbank nicht kleiner geworden, obwohl sich die WAL-Datei weiterentwickelt hat.

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…

Hallo @lmilcent :slight_smile:

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
  • Löschen alter Gerätezustände: Diese Aufgabe wird täglich um 4 Uhr morgens ausgeführt und löscht alle Sensordaten, die älter als die gewählte Aufbewahrungsdauer sind. (Siehe Code: Gladys/server/config/scheduler-jobs.js at master · GladysAssistant/Gladys · GitHub)

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 :slight_smile:

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 :slight_smile:

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?

Jetzt wird es kritisch ^^

Hallo @guim31 :slight_smile:

Du kannst zu « Systeme » gehen und diesen Parameter bearbeiten:

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 ^^

Ich habe mich am Ende doch durchgebissen und meine Partitionen neu partitioniert! :grin: Von 60 GB auf 200 GB, um Luft zu haben