Defekte Datenbank

little.yoda

Betreff:

Defekte Datenbank

 ·  Gepostet: 06.08.2025 - 11:59 Uhr  ·  #178278
Hi

ich habe unfreiwillig einen Weg gefunden, die Hibiscus-Datenbank (zumindest unter Linux) zu beschädigen.

  • Erste Instanz durch jameica.sh starten und Pwd eingeben
  • Zweite Instanz versuchen zu starten. (Nicht erfolgreich, da erkannt wird, dass eine Instanz aktiv ist)
  • Erneut versuchen eine Instanz zu starten, diesmal wird die laufende Instanz nicht erkannt. Pwd eingeben.
  • Es laufen nun zwei Instanzen von jameica
  • Erste Instanz beenden
  • Zweite Instanz beenden

Wenn man danach versucht jameica neuzustarten, bekommt man beigefügte Fehlermeldung und man muss auf das Backup zurückgreifen.


Gruß
Der an diesem Beitrag angefügte Anhang ist entweder nur im eingeloggten Zustand sichtbar oder die Berechtigung Deiner Benutzergruppe ist nicht ausreichend.

hibiscus

Betreff:

Re: Defekte Datenbank

 ·  Gepostet: 06.08.2025 - 16:02 Uhr  ·  #178290
Kannst du das reproduzieren?
Das ist merkwürdig. Jameica erzeugt auf ~/.jameica/jameica.lock ein Lock. Und das hängt am Prozess. Eigentlich kann Prozess 2 nicht das Lock von Prozess 1 aufheben. Dachte ich bisher jedenfalls.

little.yoda

Betreff:

Re: Defekte Datenbank

 ·  Gepostet: 06.08.2025 - 16:48 Uhr  ·  #178292
ja, ich kann es reproduzieren.

Ich habe mir es nach deinem Hinweis auf den Lock nochmal angeschaut.
Der Lock wird im Schritt 2 (Instanz beendet sich direkt wieder) gelöscht.
Und danach fehlt dann der Schutz.

Bachsau

Betreff:

Re: Defekte Datenbank

 ·  Gepostet: 06.08.2025 - 17:33 Uhr  ·  #178295
Unixoide Systeme ermöglichen das Löschen einer Datei, auch wenn diese exklusiv geöffnet ist. Sie bleibt "schwebend" vorhanden, so lange sie offen ist, wird aber aus dem Verzeichnis entfernt. Man kann prüfen, ob eine Datei gesperrt ist, so lange sie im Verzeichnis existiert. Wenn man sie jedoch löscht, ist sie weg.

hibiscus

Betreff:

Re: Defekte Datenbank

 ·  Gepostet: 07.08.2025 - 13:41 Uhr  ·  #178343
Zitat geschrieben von little.yoda

ja, ich kann es reproduzieren.

Ich habe mir es nach deinem Hinweis auf den Lock nochmal angeschaut.
Der Lock wird im Schritt 2 (Instanz beendet sich direkt wieder) gelöscht.
Und danach fehlt dann der Schutz.


Ich hab den Code jetzt so geändert, dass das Lock-File nur noch von der Instanz gelöscht werden kann, die das Lock aus selbst erzeugt hat. Damit konnte ich den Fehler jetzt auch nicht mehr reproduzieren. Alle Folgestarts erkennen das Lock-File, zeigen den Hinweis an und lassen es beim Shutdown unberührt. Ist ab morgen im Nightly-Build.

little.yoda

Betreff:

Re: Defekte Datenbank

 ·  Gepostet: 08.08.2025 - 10:27 Uhr  ·  #178362
danke.
Der Fehler ist weg.

hibiscus

Betreff:

Re: Defekte Datenbank

 ·  Gepostet: 08.08.2025 - 10:29 Uhr  ·  #178363
Prima. Danke für die Rückmeldung.

little.yoda

Betreff:

Re: Defekte Datenbank

 ·  Gepostet: 19.08.2025 - 16:15 Uhr  ·  #178544
Ich habe gerade noch einen Weg gefunden die Datenbank zu beschädigen. [getestet mit der aktuellen nightly]

Datenbank über h2-1.4.199.jar öffnen.
Während die Verbindung zur Datenbank ist, Jameica parallel starten.

Code
[Tue Aug 19 16:00:31 CEST 2025][INFO][main][de.willuhn.jameica.hbci.server.DBSupportH2Impl.getJdbcUrl] jdbc url: jdbc:h2:/home/XXXX/.jameica/hibiscus/h2db/hibiscus;CIPHER=XTEA
[Tue Aug 19 16:00:31 CEST 2025][INFO][main][de.willuhn.util.Base64.<clinit>] using base64 encoder/decoder: JavaEncoder
[Tue Aug 19 16:00:31 CEST 2025][WARN][main][de.willuhn.jameica.hbci.server.HBCIDBServiceImpl.checkConsistency] unable to determine database version - database probably empty, recreating
[Tue Aug 19 16:00:31 CEST 2025][INFO][main][de.willuhn.util.I18N.<init>] loading resource bundle lang/hibiscus_messages for locale de_DE
[Tue Aug 19 16:00:31 CEST 2025][WARN][pool-1-thread-1][de.willuhn.jameica.services.BackupService$Consumer.handleMessage] detected error: java.rmi.RemoteException: connection to database.jdbc:h2:/home/XXXX/.jameica/hibiscus/h2db/hibiscus;CIPHER=XTEA failed; nested exception is: 
        org.h2.jdbc.JdbcSQLNonTransientConnectionException: Datenbank wird wahrscheinlich bereits benutzt: "/home/XXX/.jameica/hibiscus/h2db/hibiscus.h2.db". Mögliche Lösungen: alle Verbindungen schliessen; Server Modus verwenden
Database may be already in use: "/home/XXXX/.jameica/hibiscus/h2db/hibiscus.h2.db". Possible solutions: close all other connection(s); use the server mode [90020-199]
[Tue Aug 19 16:00:31 CEST 2025][WARN][pool-1-thread-1][de.willuhn.jameica.services.BackupService$Consumer.handleMessage] detected error: java.rmi.RemoteException: connection to database.jdbc:h2:/home/XXXX/.jameica/hibiscus/h2db/hibiscus;CIPHER=XTEA failed; nested exception is: 
        org.h2.jdbc.JdbcSQLNonTransientConnectionException: Datenbank wird wahrscheinlich bereits benutzt: "/home/XXX/.jameica/hibiscus/h2db/hibiscus.h2.db". Mögliche Lösungen: alle Verbindungen schliessen; Server Modus verwenden
Database may be already in use: "/home/XXXX/.jameica/hibiscus/h2db/hibiscus.h2.db". Possible solutions: close all other connection(s); use the server mode [90020-199]


Wenn ich dann h2.jar und jameica beende, ist die Datenbank defekt.
Code

[Tue Aug 19 16:01:08 CEST 2025][ERROR][main][de.willuhn.jameica.hbci.HBCI.call] unable to init db service
java.rmi.RemoteException: connection to database.jdbc:h2:/home/XXXX/.jameica/hibiscus/h2db/hibiscus;CIPHER=AES failed; nested exception is: 
        org.h2.jdbc.JdbcSQLNonTransientConnectionException: Verschlüsselungsfehler in Datei "/home/XXXX/.jameica/hibiscus/h2db/hibiscus.h2.db"
Encryption error in file "/home/XXX/.jameica/hibiscus/h2db/hibiscus.h2.db" [90049-199]


Der Fehler ist reproduzierbar. Er tritt bei mir gerade leider häufiger aus, da ich für einige Auswertungen über python direkt auf die h2-Datenbank zugreifen. Mir ist klar, dass es keine normale Nutzung der Datenbank ist, aber die Datenbank sollte doch nicht "zerstört" werden, nur weil sie von einem anderen Programm geöffnet wurde.

hibiscus

Betreff:

Re: Defekte Datenbank

 ·  Gepostet: 19.08.2025 - 16:19 Uhr  ·  #178545
Das Problem ist aber, dass mir hier kein Mechanismus bekannt ist, mit dem man das verhindern könnte, da ich ja nicht erkennen kann, ob die Datenbank durch ein anderes Programm geöffnet ist.

little.yoda

Betreff:

Re: Defekte Datenbank

 ·  Gepostet: 20.08.2025 - 08:15 Uhr  ·  #178548
Ich habe das Problem für mich über das Feature "auto_mixed_mode" von H2 lösen können.
https://h2database.com/html/features.html#auto_mixed_mode

In der de.willuhn.jameica.hbci.rmi.HBCIDBService.properties folgenden Eintrag ergänzt:
database.driver.h2.parameters=AUTO_SERVER=TRUE

Damit kann ich dann mit anderen Programmen auf die gleiche Datenbank zugreifen, wenn ich im Connection String AUTO_SERVER=TRUE ergänze.

hibiscus

Betreff:

Re: Defekte Datenbank

 ·  Gepostet: 20.08.2025 - 08:18 Uhr  ·  #178549
Aber genau dadurch wird das Problem doch ausgelöst, oder? Denn normalerweise verhindert die Datenbank ja, dass sie von einem zweiten Prozess geöffnet wird und meldet, dass sie gesperrt ist.

Vielleicht wäre es in deinem Fall besser, eine gemeinsame MySQL/MariaDB zu verwenden?

little.yoda

Betreff:

Re: Defekte Datenbank

 ·  Gepostet: 20.08.2025 - 08:56 Uhr  ·  #178550
Den Overkill mysql würde ich gerne vermeiden

Mit dem Feature auto_mixed_mode unterstützt H2 explizit mehrere Datenbankverbindungen von verschiedenen Programmen.

Von der Webseite:
Automatic Mixed Mode
Multiple processes can access the same database without having to start the server manually.
[...]
Use the same URL for all connections to this database. Internally, when using this mode, the first connection to the database is made in embedded mode, and additionally a server is started internally (as a daemon thread). If the database is already open in another process, the server mode is used automatically. The IP address and port of the server are stored in the file .lock.db, that's why in-memory databases can't be supported.

The application that opens the first connection to the database uses the embedded mode, which is faster than the server mode. Therefore the main application should open the database first if possible. The first connection automatically starts a server on a random port. This server allows remote connections, however only to this database (to ensure that, the client reads .lock.db file and sends the random key that is stored there to the server). When the first connection is closed, the server stops. If other (remote) connections are still open, one of them will then start a server (auto-reconnect is enabled automatically).

All processes need to have access to the database files.

emmi

Betreff:

Re: Defekte Datenbank

 ·  Gepostet: 20.08.2025 - 15:06 Uhr  ·  #178551
Zitat geschrieben von little.yoda

Ich habe gerade noch einen Weg gefunden die Datenbank zu beschädigen. [getestet mit der aktuellen nightly]

Datenbank über h2-1.4.199.jar öffnen.
Während die Verbindung zur Datenbank ist, Jameica parallel starten.

Code
[Tue Aug 19 16:00:31 CEST 2025][INFO][main][de.willuhn.jameica.hbci.server.DBSupportH2Impl.getJdbcUrl] jdbc url: jdbc:h2:/home/XXXX/.jameica/hibiscus/h2db/hibiscus;CIPHER=XTEA
[Tue Aug 19 16:00:31 CEST 2025][INFO][main][de.willuhn.util.Base64.<clinit>] using base64 encoder/decoder: JavaEncoder
[Tue Aug 19 16:00:31 CEST 2025][WARN][main][de.willuhn.jameica.hbci.server.HBCIDBServiceImpl.checkConsistency] unable to determine database version - database probably empty, recreating
...


Wenn ich dann h2.jar und jameica beende, ist die Datenbank defekt.
Code

[Tue Aug 19 16:01:08 CEST 2025][ERROR][main][de.willuhn.jameica.hbci.HBCI.call] unable to init db service
java.rmi.RemoteException: connection to database.jdbc:h2:/home/XXXX/.jameica/hibiscus/h2db/hibiscus;CIPHER=AES failed; nested exception is: 
        org.h2.jdbc.JdbcSQLNonTransientConnectionException: Verschlüsselungsfehler in Datei "/home/XXXX/.jameica/hibiscus/h2db/hibiscus.h2.db"
Encryption error in file "/home/XXX/.jameica/hibiscus/h2db/hibiscus.h2.db" [90049-199]


Was auch immer hier passiert ist, mir fällt das CIPHER=XTEA und dann das CIPHER=AES auf. Ich vermute einmal, die bestehende (alte) Datenbank ist mit XTEA verschlüsselt. Dass dann die "zerstörte" Datenbank mit AES nicht entschlüsselt werden kann, ist irgendwie verständlich. Es sieht für mich so aus, als habe Hibiscus die Datei de.willuhn.jameica.hbci.rmi.HBCIDBService.properties für eine neue Datenbank aktualisiert oder neu angelegt. Und da ist jetzt AES "default". Im ersten Log steht ja, "recreating". wg. "unable to determine database version - wo auch immer das herkommt. Wenn der "Connect" zur Datenbank fehlschlägt. weil sie in Benutzung ist, sollte aus meiner Sicht (und wird vermutlich) kein "Recreate" versucht werden.

OK, alles nur Beobachtungen eines interessierten Benutzers, der mit der h2 Shell und sql auf die Datenbank zugreift und nicht weiss, ob und was beim Zugriff mit Python anders ist. Bei mir lief aber Hibiscus nicht, wenn ich mit sql 'rumhantiert habe und umgekehrt. Das AUTO_SERVER=TRUE hatte ich auch entdeckt aber bisher nicht eingebaut.

hibiscus

Betreff:

Re: Defekte Datenbank

 ·  Gepostet: 20.08.2025 - 15:45 Uhr  ·  #178552
Das stimmt. Dass da zwei verschiedene Cipher in den Logs auftauchen, war mir noch gar nicht aufgefallen.