Home Assistant hat täglich eine korrupte Datenbank

Moin zusammen.
Ich kämpfe mit meiner Home Assistant Installation.
Jede Nacht wird neuerdings die Datenbank als korrupt markiert und neu erstellt.
Früher war das alle 14 Tage. Immer Nachts so um 03:00 Uhr.
Dann habe ich die recorder.yaml angepasst und es lief nun 6 Monate ohne Fehler.
Jetzt passiert es, wie gesagt, täglich :frowning:
Dadurch sind natürlich alle historischen Daten verloren.
Ich setze dann die VM zurück. Dann läuft das System erstmal wieder.

Leider habe ich von der Materie (Datenbanken) absolut null Ahnung und die Fehlermeldungen sagen mir nichts.

Wäre nett, wenn mir jemand einen Tipp geben könnte, was ich als “DAU” jetzt machen kann. Jeden Tag die VM zurücksetzen, kann ja nicht die Lösung sein.

Ich habe mal die Fehlermeldungen und meine recorder.yaml bei Pastebin hochgeladen.

recorder.yaml

https://pastebin.com/UcL6DUPp

Fehlermeldungen

https://pastebin.com/0pKL0Htw
https://pastebin.com/vrnc0FjP
https://pastebin.com/ih6FZnRG

Danke Euch.

Eventuell kein oder wenig Speicherplatz auf der Festplatte verfügbar?

Edit: Pastebin ist doof.

  1. geht der zweite Link nicht und
  2. findet ein später Suchender nicht die Lösung, wenn er der gleichen Fehler haben sollte.

Hier die zweite Fehlermeldung.
Ich hatte nur gedacht, das durch Pastebin das übersichtlicher wird.

HA zeigt mir an das von den 30.8GB gesamt 19.3GB belegt sind.

Logger: homeassistant.components.recorder.core
Quelle: components/recorder/core.py:899
Integration: Recorder (Dokumentation, Probleme)
Erstmals aufgetreten: 11:49:22 (1 Vorkommnis)
Zuletzt protokolliert: 11:49:22

Unrecoverable sqlite3 database corruption detected: (sqlite3.DatabaseError) database disk image is malformed [SQL: SELECT state_attributes.attributes_id, state_attributes.shared_attrs FROM state_attributes WHERE state_attributes.hash IN (?)] [parameters: (300827175,)] (Background on this error at: https://sqlalche.me/e/20/4xp6)
Traceback (most recent call last):
  File "/usr/local/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 1963, in _exec_single_context
    self.dialect.do_execute(
    ~~~~~~~~~~~~~~~~~~~~~~~^
        cursor, str_statement, effective_parameters, context
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/local/lib/python3.13/site-packages/sqlalchemy/engine/default.py", line 943, in do_execute
    cursor.execute(statement, parameters)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
sqlite3.DatabaseError: database disk image is malformed

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/recorder/core.py", line 899, in _process_one_task_or_event_or_recover
    self._process_one_event(task)
    ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/recorder/core.py", line 1046, in _process_one_event
    self._process_state_changed_event_into_session(event)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/recorder/core.py", line 1166, in _process_state_changed_event_into_session
    attributes_id := state_attributes_manager.get(
                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        shared_attrs, hash_, session
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/homeassistant/homeassistant/components/recorder/table_managers/state_attributes.py", line 76, in get
    return self.get_many(((shared_attr, data_hash),), session)[shared_attr]
           ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/recorder/table_managers/state_attributes.py", line 97, in get_many
    return results | self._load_from_hashes(missing_hashes, session)
                     ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/recorder/table_managers/state_attributes.py", line 110, in _load_from_hashes
    for attributes_id, shared_attrs in execute_stmt_lambda_element(
                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        session, get_shared_attributes(hashs_chunk), orm_rows=False
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ):
    ^
  File "/usr/src/homeassistant/homeassistant/components/recorder/util.py", line 190, in execute_stmt_lambda_element
    executed = session.connection().execute(stmt)
  File "/usr/local/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 1415, in execute
    return meth(
        self,
        distilled_parameters,
        execution_options or NO_OPTIONS,
    )
  File "/usr/local/lib/python3.13/site-packages/sqlalchemy/sql/lambdas.py", line 594, in _execute_on_connection
    return connection._execute_clauseelement(
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        self, distilled_params, execution_options
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/local/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 1637, in _execute_clauseelement
    ret = self._execute_context(
        dialect,
    ...<8 lines>...
        cache_hit=cache_hit,
    )
  File "/usr/local/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 1842, in _execute_context
    return self._exec_single_context(
           ~~~~~~~~~~~~~~~~~~~~~~~~~^
        dialect, context, statement, parameters
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/local/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 1982, in _exec_single_context
    self._handle_dbapi_exception(
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        e, str_statement, effective_parameters, cursor, context
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/local/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 2351, in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
  File "/usr/local/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 1963, in _exec_single_context
    self.dialect.do_execute(
    ~~~~~~~~~~~~~~~~~~~~~~~^
        cursor, str_statement, effective_parameters, context
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/local/lib/python3.13/site-packages/sqlalchemy/engine/default.py", line 943, in do_execute
    cursor.execute(statement, parameters)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
sqlalchemy.exc.DatabaseError: (sqlite3.DatabaseError) database disk image is malformed
[SQL: SELECT state_attributes.attributes_id, state_attributes.shared_attrs 
FROM state_attributes 
WHERE state_attributes.hash IN (?)]
[parameters: (300827175,)]
(Background on this error at: https://sqlalche.me/e/20/4xp6)

Was sagt ls -lah homeassistant/ | grep v2? Bzw. wie groß ist deine Datenbankdatei? Bei mir ist sie 2GB groß.

Bei mir hat sie eine Größe von 9.2 GB

Moin,

was hast Du bei der recorder Einstellungen verbrochen, bist Du auch dem Irrglauben verfallen, dass durch die Einstellungen für den Recorder Du Historiendaten bekommst?

Also HA kann seit Mitte 2023 von Haus aus Langzeitstatistiken, dazu muss man am Recorder nicht herumbasteln!

Das was geht, steht hier

Dann, zu den Uhrzeiten, was laufen da noch für Automationen, Backups usw.?
Auf welchem System läuft Dein HA, sollte das eine SD-Karte sein, dann kann es damit Probleme geben!
Ok, sehe gerade Du setzt eine VM ein, dann ist es kein RasPI mit SD-Karte :slight_smile:

Es ist möglich, die SQLite Datenbank auch zu reparieren, dann verliert man nicht immer die Daten, ob das noch alles so funktioniert :man_shrugging:

Nein, deswegen kann man alles Text, Bilder hier ins Forum packen, wenn Du es ordentlich machen willst, dann kannst Du dazu die Funktion `Details Ausblenden nutzen, zusammen mit Code-Tags hast Du das was Du möchtest :wink:

VG
Bernd

1 „Gefällt mir“

Wenn man dem Link folgt, erscheint

Exception raised for errors that are related to the database itself, and not the interface or data being passed.
This error is a DBAPI Error and originates from the database driver (DBAPI), not SQLAlchemy itself.

Bernd, kannst du das Technische für Laien übersetzen?

Moin,

ganz grob gesprochen ist das so, wer an den Recordern herumspielt, ohne zu wissen was er da macht, handelt fahrlässig, denn die Macher von Home Assistant, gehen nicht davon aus, dass daran herum gestellt wird.
Wenn also die Einstellungen für die Recorder ändert, weil man glaubt sich dadurch mehr Langzeitdaten zu verschaffen, handelt dort halt falsch, denn es werden die nicht aggregierten Daten, also alles was da sekündlich eintrifft, aufgehoben, also alle Events und jede kleine Temperaturänderung wird dann in ganz hoher Auflösung für genau diese anzahl an Tagen gehalten.
Ok, lange vorrede, die Standardeinstellung der SQLite Datenbank ist aber dafür nicht ausgelegt, somit werden Jobs, z.B. Prune, also das Löschen von veralteten Daten, nicht mehr ausgeführt, weil die Abfrage nicht mehr in den vom Datenbank Manager bereitgestellten Speicher (Memory) passt, somit bricht die Abfrage ab, es wird nicht gelöscht, beim nächsten und nächsten, usw. das Gleiche, weil ja nicht mehr gelöscht werden kann, das ist auch das was diese Fehlermeldung aussagt

sqlalchemy.exc.DatabaseError: (sqlite3.DatabaseError) database disk image is malformed
[SQL: SELECT state_attributes.attributes_id, state_attributes.shared_attrs 
FROM state_attributes 
WHERE state_attributes.hash IN (?)]
[parameters: (300827175,)]

Einfach ausgedrückt, ich vermute, dass die Parameterliste dieses (300827175, …) zu lang geworden ist.
Des Weiteren, vermute ich, dass auch schon die Backups eine Korrupte Datebank haben, es also auch nicht weitergehen wird, selbst wenn man da ein Backup einspielt.

Was ich mir vorstellen kann, ist eine ganz saubere Installation, die Recorder wieder auf den Standard setzen, also löschen :slight_smile:
Vorher die alten SQLite Datenbankfiles sichern, denn man könnte versuchen die Statistikdaten noch zu retten.
Die Datenbankparameter anpassen, dass die vielen Daten bei der Abfrage hineinpassen, von Hand in kleineren Häppchen löschen.

VG
Bernd

1 „Gefällt mir“

Hallo Bernd,

die recorder.yaml hatte ich so angepasst, weil am Anfang immer im 14 Tage Rhythmus die korrupte DB auftrat. Immer um 3:00 Uhr. Nicht für Historiendaten.
Im Inet hatte ich das als “Lösung” erlesen.
Und es war ja auch Ruhe, bis jetzt halt :frowning:
Ich habe HA auch bereits dreimal frisch installiert, aber leider taucht das Problem jedes mal wieder auf. Erst durch die Anpassung der recorder.yaml war Ruhe.

Ich werde mal deinen Vorschlag noch einmal umsetzen.
HA neu installieren und keine Änderungen an dem Recorder.
Ich hoffe das das Problem dann gelöst ist. Sonst würde ich das Thema hier wieder öffnen.

Lieben Dank.

VG
Marco

Moin,

was ja noch fehlt, ist, worauf läuft Dein HA, oder habe ich das überlesen?
Welche Einstellungen waren das, die Du gemacht hast?
Warum ist denn dann das Datenbankfile 9,2 GB groß? Mein Datenbankfile ist gerade einmal ~ 2 GB groß :thinking:

VG
Bernd

Das läuft bei mir auf einem ThinkCentre M720q i5 mit 16GB Speicher unter Windows 11 Pro.
Das Ganze in VirtualBox 7.1.4 als VM. Zugeordnet sind 6GB Speicher und 32GB als Disk.
Hier noch meine recorder.yaml

  # Anzahl der Tage, wie lange Daten gespeichert werden
  purge_keep_days: 365

  # Zuerst: Was NICHT aufgezeichnet werden soll
  exclude:
    domains:
      - sensor               # Wird später über entity_globs wieder gezielt einbezogen
      - binary_sensor
      - device_tracker
      - camera
      - media_player
      - select
      - button
    entities:
      - sensor.mshomefb_externe_ip
      - vacuum.robi
    event_types:
      - service_executed
    entity_globs:
      - switch.*_internet_access

  # Dann: Was explizit aufgezeichnet werden soll
  include:
    domains:
      - light
      - switch
      - zone

    entities:
      # ⚡ Stromverbraucher / Haushaltsgeräte
      - sensor.eisschrank
      - sensor.kuhlschrank_hwr
      - sensor.trockner
      - sensor.waschmaschine
      - sensor.airfreyer
      - sensor.fernseher_kuche
      - sensor.fernseher_sz
      - sensor.geschirrspuler
      - sensor.kaffeemaschine
      - sensor.microwelle
      - sensor.robi
      - sensor.pool_pumpe
      - sensor.nachttischlampe

      # 🔋 Energieverbrauch / Erzeugung / Batteriesysteme
      - sensor.load_power
      - sensor.signed_battery_power
      - sensor.sonstiger_verbrauch
      - sensor.netzbezug_trotz_pv_und_akku
      - sensor.lichter_zahlen

      # 🌡️ Klima / Umgebungsdaten
      - sensor.klima_schlafzimmer

      # 🖥️ Mediengeräte & Drucker
      - sensor.media_2_wohnzimmer
      - sensor.media_wohnzimmer
      - sensor.mfc_7360n
      - sensor.system_state
      - sensor.poolpumpe_laufzeit

      # 🚗 Fahrzeuge
      - sensor.x1_sdrive18d_verbleibender_kraftstoff

      # ⛽ Tankstellenpreise
      - sensor.aral_stedinger_strasse_174_diesel

      # 📱 Geräte-Tracker
      - device_tracker.danny_s22_ultra_von_salametro
      - device_tracker.note10_von_jasmina
      - device_tracker.schmidtke_iphone16promax

      # 🧠 System- und Hilfssensoren
      - binary_sensor.dashboard
      - sensor.surface7_surface7_marco_batterie_charge_remaining_percentage

    entity_globs:
      # 🪟 Fenster / Türen / Briefkasten
      - binary_sensor.fenster*
      - binary_sensor.tur*
      - binary_sensor.briefkasten_*

      # ⚡ Leistungsdaten allgemein
      - sensor.*_leistung

      # 🎛️ Eingabefelder, Slider, Input-Boolean etc.
      - input*

      # 🔋 Batteriestände & Batterie-Status
      - sensor.*batter*

      # 📊 Energiezähler (Strom, Gas, Wasser – automatisch erkannt)
      - sensor.gas*
      - sensor.wasser*
      - sensor.daily_*
      - sensor.erzeugung_*
      - sensor.export_*
      - sensor.import_*
      - sensor.monthly_*
      - sensor.stromverbrauch_*
      - sensor.total_*
      - sensor.yearly_*
      - sensor.ernergy_*
      - sensor.energy_*

      # 🌡️ Temperatur, Luftfeuchtigkeit, Druck
      - sensor.*temp*
      - sensor.*_luftfeuchtigkeit
      - sensor.*_pressure

      # 📱 iPhone-Details
      - sensor.schmidtke_iphone16promax_*

      # 🌡️ Heizungs-/Klimageräte
      - climate.*

      # ⛽ Tankstellenpreis-Erkennung
      - sensor.*_super_e10

VG
Marco

Warum so eine Einstellung? Es ist grundsätzlich vollkommen unsinnig.

was wäre denn “sinnig”?
Die 365 Tage waren im Inet als Beispiel genannt.

Moin,

das bitte jetzt nicht als Blame auffassen, aber genau da liegt meiner Meinung das Problem begraben, denn VirtualBox ist mir in diesem Zusammenhang, mit korrupten Daten unter Windows schon öfter untergekommen.
Ohne es jetzt genau belegen zu können, beißt sich da wohl die Speicherverwaltung von Windows und VirtualBox mit einem Linux darin, gerade wenn Windows irgendwelche Updates durchführt.

ich dachte, Du hast keine Verlängerung der historischen Daten gemacht, genau das ist das, was ich oben beschrieben habe, das bewahrt Dir alle unsinnigen Daten für 365 Tage auf.
Zumal alle Daten die Du da includest von Haus aus schon Langzeitdaten sind und es da keiner Recorder Einstellung bedarf!

Macht man wirklich alles, was man liest und nicht versteht, diesen Vorschlag würde ich gern einmal selbst sehen, ich kann mir das nicht vorstellen, dass so ein Blödsinn verzapft wird!

Den Standard von HA 10 Tage, deswegen ja auch von mir der Hinweis, alles wegschmeißen und sauber neu anfangen!

VG
Bernd

1 „Gefällt mir“

Würdest Du statt VirtualBox dann lieber Hyper-V nehmen?
Ich fand das automatische Erstellen von Snapshot ganz nice.

Moin,

muss mich gleich wieder entschuldigen, nein kein Windows :slight_smile:
Bei mir läuft alles unter Proxmox, entweder in LXC oder wie HAOS als VM.

Ich halte Windows für kein gutes Serverbetriebssystem, da ist Linux alle mal besser, ist natürlich Geschmackssache und jeder hat da andere Präferenzen :wink:
Ich kenne nur Linux, egal ob Server, oder Desktop, wenn es das erst brauchbare Handy mit Linux gibt, bin ich auch von Android wech :slight_smile:

VG
Bernd

Du Glücklicher.
Ich kenne nur Windows. Von klein auf.
Linux und Co sind böhmische Dörfer für mich. :pensive:

Setzt dich mit Proxmox auseinander:)

Da momentan auch noch andere Dinge laufen, werde ich mir das demnächst mal ansehen. Aber was ich bis jetzt gelesen habe, ist das auch nicht ganz so einfach zu handhaben.

Moin,

ein Proxmox zu installieren, ist in 15 Minuten erledigt :wink:

Alles, was man dann installieren möchte, geht am einfachsten über die Helferskripte,

Da ist alles Mögliche dabei, einfach mal stöbern.

Da Proxmox Web-UI basiert ist und wenn man nicht ganz exotische Ansprüche hat, sollte das alles mehr oder minder selbsterklärend sein.

Aber um auch noch objektiv zu sein, es gibt auch sehr viele User hier, die Unraid nutzen, welches sicherlich auch einen Blick wert ist.

VG
Bernd