Erst mal vorab - ich bin mit DbLog und DbRep höchst zufrieden.
Umgebung:
- fhem auf einer CuBox
- MariaDB10 auf Synology
- Struktur der history Tabelle:
TIMESTAMP: timestamp(2)
DEVICE: varchar(64), utf8_bin
TYPE: varchar(64), utf8_bin
EVENT: varchar(512), utf_8bin
READING: varchar(64), utf8_bin
VALUE: varchar(128), utf8_bin
UNIT: varchar(64), utf8_bin
Und hier mein Problemchen:
Mein EMS_Boiler schickt ab und an (über MQTT) ein ungültiges Zeichen (0xFC) im Event.
Dies führt dazu, dass beim Schreiben in die Datenbank ein Fehler auftritt:
2022.12.02 00:10:30.444 5: DbLog logdb -> Start DbLog_PushAsync
2022.12.02 00:10:30.445 5: DbLog logdb -> DbLogType is: Current/History
2022.12.02 00:10:30.457 4: DbLog logdb -> AutoCommit mode: ON, Transaction mode: ON
2022.12.02 00:10:30.457 4: DbLog logdb -> Insert mode: Array
2022.12.02 00:10:30.496 4: DbLog logdb -> Primary Key used in history: none
2022.12.02 00:10:30.497 4: DbLog logdb -> Primary Key used in current: DEVICE,READING
...
2022.12.02 00:10:30.506 5: DbLog logdb -> processing event Timestamp: 2022-12-02 00:10:06, Device: EMS_Boiler, Type: MQTT2_DEVICE, Event: serviceCode: 0<FC>, Reading: serviceCode, Value: 0<FC>, Unit:
2022.12.02 00:10:30.506 5: DbLog logdb -> processing event Timestamp: 2022-12-02 00:10:06, Device: Verbrauch.Homeoffice, Type: EC3000, Event: power: 167.075975574276, Reading: power, Value: 167.075975574276, Unit:
2022.12.02 00:10:30.506 5: DbLog logdb -> processing event Timestamp: 2022-12-02 00:10:06, Device: EMS_Boiler, Type: MQTT2_DEVICE, Event: serviceCode: 0Y, Reading: serviceCode, Value: 0Y, Unit:
...
2022.12.02 00:10:31.556 2: DbLog logdb -> Error table history - DBD::mysql::st execute_array failed: executing 54 generated 1 errors at ./FHEM/93_DbLog.pm line 2904.
2022.12.02 00:10:31.602 5: DbLog logdb -> DbLog_PushAsync finished
2022.12.02 00:10:31.657 5: DbLog logdb -> Start DbLog_PushAsyncDone
2022.12.02 00:10:31.673 5: DbLog logdb -> DbLog_PushAsyncDone finished
Der weitere Effekt ist der, das der DbLog-Cache auf Grund des commit gelöscht wird, allerdings der MemCache unverändert bleibt und beim nächsten Commit genau das gleiche Problem auftritt.
Passiert das während einer längeren Abwesenheit sind die Daten fort (außer man betreibt DbLog im loglevel 5

)
Ja, ich kann diesen speziellen Fehler mit "DbLogValueFN" in der Griff bekommen.
Aber das Problem bleibt bestehen das bei einem Datenbank-Fehler der Cache verloren ist, jedoch der MemCache immer weiter anwächst.
Selbst ein "reopen" purged den MemCache nicht.
Was ich mir DbLog-seitig vorstelle wäre ein Enhancement, welches in einem derartigen Fehlerfall den MemCache (ähnlich dem cache_dblog_*) wegschreibt und den MemCache purged.