Am 13. März wurde die korrigierte Version 3.51.3 des kompakten, eingebetteten DBMS veröffentlicht. SQLiteDer Projektcode ist in C geschrieben und wird als Gemeingut (Public Domain) verbreitet.
Aufgrund von Kompatibilitätsproblemen mit einigen neuen Funktionen wurde die Version 3.52.0 (die am 6. März veröffentlicht wurde) zurückgezogen.
Änderungsprotokoll für Version 3.51.3:
- Am 3. März entdeckte und behob einer der Entwickler von SQLite (Dan) einen Fehler, der in seltenen Fällen zu Datenbankbeschädigungen führen konnte, und der als "WAL-reset Bug":
- bezeichnet wird. Dieser Fehler tritt nur in Datenbanken im WAL-Modus auf, wenn mehr als eine Verbindung zu derselben Datei in verschiedenen Threads oder Prozessen geöffnet ist und wenn diese beiden Verbindungen versuchen, gleichzeitig zu schreiben oder einen Checkpoint zu erstellen.
- Der Fehler ist mit einem Zugriffskonflikt unter strengen Zeitbeschränkungen verbunden. Unter normalen Betriebsbedingungen tritt er äußerst selten auf. Den Entwicklern ist es nicht gelungen, diesen Fehler unter natürlichen Bedingungen zu reproduzieren, weshalb sie spezielle Testlogik in SQLite hinzufügen mussten, die absichtlich Bedingungen erschafft, unter denen der Fehler auftritt, um sicherzustellen, dass das Problem behoben ist.
- Der Fehler tritt auf, wenn:
- Eine Verbindung führt die Überprüfung des Checkpoints durch. Diese erste Überprüfung muss abgeschlossen sein. Anders ausgedrückt, während der Überprüfung muss der gesamte Inhalt der WAL-Datei erfolgreich in die Datenbank kopiert und die WAL-Datei in einen Zustand versetzt werden, in dem sie zurückgesetzt werden kann.
- Unmittelbar nach Abschluss der ersten Kontrolle beginnt die zweite.
- Während die zweite Kontrolle aus Schritt 2 gestartet wird, zeichnet eine andere Verbindung zur Datenbank eine Transaktion auf, die die WAL-Datei zurücksetzt und neuen Inhalt an den Anfang der WAL-Datei schreibt.
- Aufgrund eines Konflikts beim Datenzugriff ignoriert die zweite Kontrolle aus Schritt 2, dass die WAL-Datei aufgrund der Transaktionsfixierung aus Schritt 3 zurückgesetzt wurde. Die zweite Kontrolle setzt einen falschen Wert für eines der Felder im WAL-Indexkopf fest. Dieses Feld gibt an, dass ein Teil der WAL-Datei bereits im Checkpoint festgehalten wurde, obwohl das in Wirklichkeit nicht der Fall ist.
- Das Festhalten zusätzlicher Transaktionen führt zu einer Zunahme der Seiten in der WAL-Datei, die die Anzahl der Seiten überschreitet, die zum Zeitpunkt des ersten Checkpoints aus Schritt 1 existierten.
- Später, wenn der dritte Kontrollpunkt erreicht wird, überspringt er die gesamte oder einen Teil der Transaktion, die in Phase 3 aufgezeichnet wurde. Dadurch gelangen Teile der Transaktion aus Phase 3 nicht in die Datenbankdatei, was zu einer Beschädigung der Datenbankdatei führt.
- Der Fehler tritt wahrscheinlich in allen Versionen von SQLite auf, beginnend mit 3.7.0 (21.07.2010) bis hin zu 3.51.2. Korrekturen wurden auch für einige frühere Versionen veröffentlicht: 3.44.6 и 3.50.7.
- Weitere kleinere Korrekturen.
Quelle: linux.org.ru
