DbLog & deleteOldDays

Begonnen von StefanW, 14 Juni 2015, 07:45:41

Vorheriges Thema - Nächstes Thema

StefanW

Hallo zusammen...

Ich habe da mal eine Frage bezüglich DbLog und der Funktion deleteOldDays.
In der commandref steht diesbezüglich folgendes drin:
set <name> deleteOldDays <n>

    Löscht Datensätze, die älter sind als <n> Tage. Die Anzahl der gelöschten Datensätze wird in das Reading lastRowsDeleted geschrieben.


Nur leider funktioniert das bei mir wohl nicht.
Ich bekomme auch das Reading lastRowsDeleted nicht geschrieben.
Im Log ist auch nix zu finden.

Die Datenbank ist SQLite und mittlerweile knapp 1,3GB groß.

Hat zufällig jemand eine Idee, warum das bei mir nicht funktioniert?

Gruß
Stefan

igami

Hier schließe ich mich an.
Habe auch das Problem, dass die DB zu groß wird, mittlerweile 9 GB. Der letze count ist noch vom 25.11.2014 versuche ich den zu aktualisieren bleibt der Browser dabei die Seite zu laden. Htop zeigt mir an, dass das System nicht mehr Auslastung hat als vorher. Auch ein deleteOldDays funktioniert nicht.

Grüße
igami
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

DerFrickler

#2
funktioniert bei mir wunderbar

lastRowsDeleted 478 2015-06-15 00:00:31

getriggert wird das bei mir über ein "at", alles älter 90 Tage verschwindet aus der Datenbank...

DerFrickler

Zitat von: StefanW am 14 Juni 2015, 07:45:41
Hallo zusammen...

Ich habe da mal eine Frage bezüglich DbLog und der Funktion deleteOldDays.
In der commandref steht diesbezüglich folgendes drin:
set <name> deleteOldDays <n>

    Löscht Datensätze, die älter sind als <n> Tage. Die Anzahl der gelöschten Datensätze wird in das Reading lastRowsDeleted geschrieben.


Nur leider funktioniert das bei mir wohl nicht.
Ich bekomme auch das Reading lastRowsDeleted nicht geschrieben.
Im Log ist auch nix zu finden.

Die Datenbank ist SQLite und mittlerweile knapp 1,3GB groß.

Hat zufällig jemand eine Idee, warum das bei mir nicht funktioniert?

Gruß
Stefan

wie alt ist Deine Datenbank und welchen Zeitraum (n-Tage) hast du gewählt?

StefanW

Also, die Datenbank ist knapp 4 Monate alt.

Ich löse das deleteOldDays noch von Hand aus, dabei ist egal ob ich 10, 20 oder 30 Tage eingebe.
Das Ergebnis bleibt leider das gleiche.

mago0211

Hallo zusammen,

konnte das gleiche Verhalten beobachten. Wenn ich deleteOldDays mache wird das Reading zwar aktualisiert
lastRowsDeleted 177560 2015-06-22 04:10:29

Aber die Datenbankgröße bleibt unverändert?

Gruß
Markus

Jorge3711

Datenbankgröße prüfen:


SELECT
    table_schema 'Data Base Name',
    SUM(data_length + index_length) / 1024 / 1024 'Data Base Size in MB',
    SUM(data_free) / 1024 / 1024 'Free Space in MB'
FROM
    information_schema.TABLES
GROUP BY table_schema;

+--------------------+----------------------+------------------+
| Data Base Name     | Data Base Size in MB | Free Space in MB |
+--------------------+----------------------+------------------+
| fhem               |           9.10937500 |       0.00000000 |
| fhem_test          |           6.10937500 |       0.00000000 |
| information_schema |           0.00390625 |       0.00000000 |
| mysql              |           0.54202366 |       0.00017548 |
+--------------------+----------------------+------------------+




Mach mal ein

mysql> optimize table history;
+--------------+----------+----------+----------+
| Table        | Op       | Msg_type | Msg_text |
+--------------+----------+----------+----------+
| fhem.history | optimize | status   | OK       |
+--------------+----------+----------+----------+


auf die Datenbank und prüfe die DB Größe danach nochmal:


SELECT
    table_schema 'Data Base Name',
    SUM(data_length + index_length) / 1024 / 1024 'Data Base Size in MB',
    SUM(data_free) / 1024 / 1024 'Free Space in MB'
FROM
    information_schema.TABLES
GROUP BY table_schema;

+--------------------+----------------------+------------------+
| Data Base Name     | Data Base Size in MB | Free Space in MB |
+--------------------+----------------------+------------------+
| fhem               |           7.10937500 |       0.00000000 |
| fhem_test          |           6.10937500 |       0.00000000 |
| information_schema |           0.00390625 |       0.00000000 |
| mysql              |           0.54202366 |       0.00017548 |
+--------------------+----------------------+------------------+


Jetzt kleiner?

mago0211

Hallo Jorge,

erstmal Danke für deine Antwort.

der Befehl:
sudo sqlite3 fhem.db "VACUUM;"
brachte bei mir Abhilfe.

Bedeutet also das ich nach jedem deleteOldDays am besten den VACUUM Befehl hinterher ausführe?

Gruß
Markus

Jorge3711

Das bedeutet, dass durch deleteOldDays in der Datenbank die entsprechenden Einträge als gelöscht markiert werden. Die Datenbankdateien selbst werden deshalb nicht kleiner und ist bei den Datenbanken die ich kenne normal. Das erreichst Du erst durch deinen genannten Befehl. Wenn dass Deine Erwartung war, musst Du den Befehl jedes Mal ausführen.

mago0211

Ah Ok,

Danke für deine Antwort.

Wäre es sinnvoll das in die Doku zu schreiben? Es scheint ja noch ein paar andere SQL unerfahrenen User zu geben die das nicht wissen.

Gruß
Markus

betateilchen

Das Problem tritt nur bei sqlite Datenbanken auf.
Und das mit dem Vacuum steht - wenn ich mich recht erinnere - auch irgend schon in einer Doku.

Man kann das als Pragma direkt beim ersten Anlegen der sqlite-Datenbank angeben, dann macht sqlite das automatisch.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

AitschPi

Zitat von: betateilchen am 26 Juni 2015, 09:24:03
Und das mit dem Vacuum steht - wenn ich mich recht erinnere - auch irgend schon in einer Doku.
Steht auf jeden Fall in der Referenz zu configDB - da habe ich das heute gesehen und dann google befragt, was das macht und ob ich das in mySQL auch brauche... ;o)
Echte Männer essen keinen Honig, sie kauen Bienen.

rapster

#12
In der commandRef steht allerdings autovacuum = 2;

Das bedeutet ohne zusätzlichem setzen des "incremental_vacuum pragma" wird hier nix automatisch ausgeführt.

Wenn die Datenbank automatisch verkleinert werden soll muss autovacuum = 1 gesetzt werden.

EDIT:
- nach Ändern des autovacuum pragmas, nicht vergessen 1x "VACUUM;" manuell auszuführen damit dies übernommen wird.