SQLite, WAL Mode und Netzlaufwerke.

Wenn ein GeoPackage (es handelt sich dabei um eine SQLite Datenbank) von einem Netzlaufwerk geöffnet wird die im "journal_mode=WAL" ist, kann es zu einer schwerwiegenden Fehlersituation kommen.

Diese Ausführungen betreffen alle SQLite basierten Formate, bei GeoPackage wurde dies offensichtlich, da die in cardo eingebundenen Dateien auch in QGIs geöffnet waren.

Vorab: Wir sind nicht in der Lage das Problem programmtechnisch zu lösen.

Auswirkung

Es folgen sehr technische Hinweise, mit Bezug auf die SQLite API

Beim Schließen der Datenbankverbindung (Close) wird innerhalb der Methode winShmPurge der Block winClose((sqlite3_file *)&p->hFile); aufgerufen, der dort enthaltene Aufruf an die WinAPI Methode CloseHandle versetzt den gesamten Prozess in einen Zustand, der nur durch einen Neustart des Betriebssystems behoben werden kann.

Dies führt zudem noch dazu, dass ein SQLite globaler Mutex gesperrt bleibt, was alle anderen SQLite Datenbankoperationen in dem Prozess blockiert (bspw. auch das Schreiben in das Iwan7-Tracefile)

Im Prozessmonitor ist dabei zu beachten, dass im Takt von wenigen Millisekunden WriteFile Ereignisse ausgelöst werden, die alle mit Status FILE LOCK CONFLICT beendet werden.

Jegliche Versuche den Prozess zu beenden führen zu einer "Zugriff verweigert" ("Access Denied") Meldung (das ist der Punkt, wo der Systemneustart erforderlich ist).

Es ist uns derzeit nicht klar, ob dies ein Fehler in dem VFS Modul von SQLite ist, oder ob es sich um ein Problem im Betriebssystem handelt.

Implementierte Schutzmaßnahme

Wenn zu der zu öffnenden Datei eine entsprechende -wal oder -shm Datei vorhanden ist, dann wird jetzt eine Fehlermeldung ausgelöst und das Öffnen der Datei wird verhindert.

Um diesen Schutz zu deaktivieren, kann die Umgebungsvariable IDUIT_ALLOWS_SQLITE_SHMNW mit dem Wert true gesetzt werden (auf dem Server, als Systemumgebungsvariable)

Dies betrifft sowohl Iwan als auch IduIT.GeoLib.Net.

Maßnahmen, die der Betreiber durchführen sollte

  • Wir empfehlen generell für zu bearbeitenden Daten die Datenhaltung in einem Datenbankserver vorzusehen (bspw. PostgreSQL, SQL Server, Oracle).

  • Die (GeoPackage-)Dateien sollten nur lesend verwendet werden.

  • Der Journal-Mode WAL muss deaktiviert werden

    Bei mit cardo oder älteren QGis Versionen (siehe auch Geopackage in WAL mode freezes QGIS) erstellten/bearbeiteten Dateien ist der WAL-Modus standardmäßig aktiviert, setzten Sie diesen durch pragma journal_mode=DELETE wieder zurück.

    Mit pragma journal_mode=TRUNCATE haben wir Schreibfehler mit QGIS bemerkt, daher hier jetzt die Empfehlung auf DELETE

    Eine empfehlenswerte Seite für die Beschreibung der unterschiedlichen Journal-Modes finden Sie hier (english)

    Tip: Sie können SQLite Datenbanken bspw. mit SQLiteSpy öffnen und dort das SQL Statement ausführen.


Zuletzt geändert: 28.02.2025 09:00:37 (erstmals erstellt 20.02.2025) // Alias: "sqliteNetshare"