[GELÖST] configDB: Migration schlägt fehl, fhem crasht

Begonnen von MrTom, 18 Juli 2021, 15:05:32

Vorheriges Thema - Nächstes Thema

MrTom

Hallo zusammen

ich wollte die Migration zu configDB angehen. Dazu habe ich neu fhem in einem Dockercontainer am Laufen. Gleich dazu läuft auch ein mariadb-Container für die configDB. Das Ganze als docker-compose. Meine bestehende Config konnte ist bestens in den Container umziehen und fhem läuft problemlos. Die Versuche zur Migration mit der "Standardkonfiguration" vom fhem-Container funktionierten einwandfrei. Das Problem stellt sich (nur) mit meiner eigenen Konfiguration bzw. States.

Jedoch schlägt der Versuch, die config von fhem.cfg in die configDB zu migrieren mit der folgenden Meldung fehl: (fhem lief im debug-modus zur Fehlereingrenzung)
021.07.18 14:28:52.451 4: configdb: migration requested.
2021.07.18 14:28:52.451 4: Starting migration
2021.07.18 14:28:52.451 4: Processing: cfgDB_Init
2021.07.18 14:28:52.466 4: Processing: cfgDB_SaveCfg
2021.07.18 14:28:54.858 4: Processing: cfgDB_SaveState
2021.07.18 14:28:55.101 1: PERL WARNING: DBD::mysql::st execute failed: Incorrect string value: '\xF0\x9F\x87\xB1\xF0\x9F...' for column `configDB`.`fhemstate`.`stateString` at row 1 at configDB.pm line 569.
DBD::mysql::st execute failed: Incorrect string value: '\xF0\x9F\x87\xB1\xF0\x9F...' for column `configDB`.`fhemstate`.`stateString` at row 1 at configDB.pm line 569.
2021.07.18 14:28:55.101 1: PERL WARNING: Issuing rollback() due to DESTROY without explicit disconnect() of DBD::mysql::db handle database=configDB;host=mariadb;port=3306 at configDB.pm line 569.


Ich habe auch bereits die MariaDB angepasst bei der Collation:
[mysqld]
collation-server = utf8mb4_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8mb4


Im forum habe ich diese Themen gefunden, brachten aber keine Lösung: https://forum.fhem.de/index.php/topic,91690.0.html und https://forum.fhem.de/index.php/topic,114734.0.html

Ein list -r .* brachte auch nicht die Lösung, da der fehlerhafte Text nicht ersichtlich wird.

Wie kann ich das betroffene Reading finden? Hat jemand eine Lösung?

Besten Dank
Thomas
RPi2: FHEM 5.8 mit Jeelink (ATTiny) und AliRF (PIR's)
KNX/EIB: alix3d3 als IP-GW, div. Sensoren und Aktoren (Licht, Jalousien und Markisen)
Mysensors: Temp/Hum/Lux-Sensoren, PIR's, Türkontakte,
verschiedene RGB-Aktoren, Vantage 2, Fritzbox, Vu+ Duo

rudolfkoenig

ZitatIncorrect string value: '\xF0\x9F\x87\xB1\xF0\x9F...' for column `configDB`.`fhemstate`.`stateString`
Die Spalte zeigt, dass die Ursache in einem Statuswert zu suchen ist, diese sind in der Datei /opt/fhem/log/fhem.save (Voreinstellung von attr global statefile) zu finden. Womoeglich kann man den Wert da loeschen.

\xF0\x9F\x87\xB1... klingt nach einem UTF-Zeichen: https://www.fileformat.info/info/unicode/char/1f1f1/index.htm
Warum MariaDB sie trotzt Einstellung nicht nimmt, kann ich leider nicht beantworten.

MrTom

Genau auf die richtige Spur gebracht. Da waren doch beim Device-Namen eines Handy die Flaggen drin, die  haben die Probleme gemacht. Besten Dank!

Durch das Löschen der 4 UTF-Zeichen und erneutem Startem vom FHEM war die Migration möglich.

Wie du erwähnt hast, wäre es aber sicher interessant zu wissen, weshalb diese Zeichen die Probleme machen. Ich gehe davon aus, dass diese Zeichen bei mir zumindest mal wieder reinkommen. Bin gespannt, ob ich dann wieder das Problem haben.

In diesem Sinne... nochmals vielen Dank
Thomas
RPi2: FHEM 5.8 mit Jeelink (ATTiny) und AliRF (PIR's)
KNX/EIB: alix3d3 als IP-GW, div. Sensoren und Aktoren (Licht, Jalousien und Markisen)
Mysensors: Temp/Hum/Lux-Sensoren, PIR's, Türkontakte,
verschiedene RGB-Aktoren, Vantage 2, Fritzbox, Vu+ Duo

sinemeter

Hallo zusammen,

bei mir ergibt sich ein ähnliches Problem aber ich denke an einer anderen Stelle.


Mein Setup:
Fhem im Docker Container auf Raspi4  (alles frisch aufgesetzt und eine laufende fhem.cfg zusammengebaut)
MariaDB  läuft als 2. separater Container (Logging SVG etc. läuft alles sauber.
Auch der configcheck von DBLogging zeigt alles ok inkl. der Treiberversionen und UTF8 support.

nun möchte ich mitels configdb migrate umsteigen.

configDB.conf ist schon angepasst:


%dbconfig= (
        connection => "mysql:database=fhem;host=raspi4.fritz.box;port=3306",
        user => "fhemuser",
        password => "xxx",
        utf8 => 1,
);



Es kommt folgende Fehlermeldung im Log des COntainers und der crasht komplett und bootet neu.


2023.02.05 17:22:00.069 3: DbLog DBLogging - SubProcess connected to fhem

2023.02.05 17:22:13.619 1: PERL WARNING: DBD::mysql::st execute failed: Incorrect string value: '\xF0\x9F\x8C\xA1 T...' for column `fhem`.`fhemconfig`.`P2` at row 1 at configDB.pm line 756.

DBD::mysql::st execute failed: Incorrect string value: '\xF0\x9F\x8C\xA1 T...' for column `fhem`.`fhemconfig`.`P2` at row 1 at configDB.pm line 756.

2023.02.05 17:22:13.619 1: PERL WARNING: Issuing rollback() due to DESTROY without explicit disconnect() of DBD::mysql::db handle database=fhem;host=raspi4.fritz.box;port=3306 at configDB.pm line 756.

/entry.sh: line 621: kill: (4763) - No such process

Abrupt daemon termination, starting 10s countdown .../entry.sh: line 625: kill: (4763) - No such process

10/entry.sh: line 625: kill: (4763) - No such process


Ich sehe hier im Post den Verweis auf das fhem-state file das scheint es bei mir aber nicht zu sein.
In welchem File muss ich nach den Werten/Sonderzeichen suchen?

LG  sinemeter

betateilchen

#4
Zitat von: sinemeter am 05 Februar 2023, 17:33:59
In welchem File muss ich nach den Werten/Sonderzeichen suchen?

In Deiner laufenden Konfiguration. Entweder in einem define oder bei einem Attributwert.
(ich tippe eher auf einen Attributwert)

Noch ein Tipp: verwende bitte für DbLog und configDB getrennte Datenbanken in Deinem MariaDB Container.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

sinemeter

Hi!

Danke für die schnelle Antwort.
Attributwerte könnte das richtige Stichwort sein.

Ich verwende bei einigen Devices im stateformat Emoji Zeichen (Sonne,Regenschirm, etc.) weil ich finde das einige davon netter aussehen als die Fhem Icons.

Heißt das ich kann diese Zeichen garnicht verwenden wenn ich auf configDB umstellen will?
Kann man die evtl. irgendwie escapen?

betateilchen

Keine Ahnung, wie man mit solchen karierten Maiglöckchen umgeht und ob man das unbedingt in Attributen machen muss.

Aber Du kannst in FHEM auf jeden Fall auch eigene icon-Sets anlegen und diese Bildchen als icons verwenden.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

sinemeter

#7
Danke nochmals an Dich betateilchen!

Für Nachahmer meiner Maiglöckchenidee:

Es waren die Emojis die ich im Stateformat verwendet hatte.
Diese machen wohl in SQL/ MariaDB Probleme.


An Betateilchen, ich habe dann aber doch nochmal eine Frage;
Zitat von: betateilchen am 05 Februar 2023, 17:45:21
Noch ein Tipp: verwende bitte für DbLog und configDB getrennte Datenbanken in Deinem MariaDB Container.

Habe Deinen Tipp befolgt und auf dem gleichen Server eine 2. separate DB eingerichtet nur für configDB.
Ich verwende zum Loggen der Readings ja eine DBLogging Instanz:

defmod DBLogging DbLog /opt/fhem/db.conf .*:.*
attr DBLogging DbLogSelectionMode Include
attr DBLogging alias Datenbank Logging
attr DBLogging asyncMode 1
attr DBLogging group Logging
attr DBLogging insertMode 1
attr DBLogging room Log


und zum nächtlichen Backup eine DBRep die darauf zeigt:


defmod DBLogging_DbRep DbRep DBLogging
attr DBLogging_DbRep DbLogExclude .*
attr DBLogging_DbRep DbLogInclude state,DumpFileCreatedSize,DumpRowsHistory,background_processing_time
attr DBLogging_DbRep alias Datenbank Logging DbRep
attr DBLogging_DbRep dumpFilesKeep 1
attr DBLogging_DbRep event-on-update-reading state,DumpFileCreatedSize,DumpRowsHistory,background_processing_time,DumpFileCreated
attr DBLogging_DbRep executeAfterProc {backupSqlFiles("DBLogging_DbRep")}
attr DBLogging_DbRep executeBeforeProc set Pibot _msg SQL Dump beginnt
attr DBLogging_DbRep group Logging
attr DBLogging_DbRep icon file_pod
attr DBLogging_DbRep optimizeTablesBeforeDump 1
attr DBLogging_DbRep room Log


Um auch ein automatisches Backup der configDB zu bekommen benötige ich ein 2. DBRep das auf ein zweite DBLogging zeigt?
Wie muss das define dieser 2. DBLogging Instanz aussehen?
Ich will damit ja eigentlich nichts loggen.

betateilchen

DbLog und configDB haben absolut nichts miteinander zu tun.
Und DbRep gehört zu DbLog - und hat somit auch nichts mit configDB zu tun.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!