SQLite 3.51.3 с поправка на възможно повреждане на базата данни в режим WAL

SQLite 3.51.3 с поправка на възможно повреждане на базата данни в режим WAL

На 13 март беше направено коригиращо издание 3.51.3 на компактната вградена СУБД. SQLite. Проектният код е написан на C и се разпространява като обществено достояние (public domain).

Поради проблеми с обратната съвместимост, свързани с някои нови функции, версията 3.52.0 (излязла на 6 март) беше отзована.

Списък на промените в версия 3.51.3:

  • На 3 март един от разработчиците на SQLite (Dan) откри и отстрани грешка, която в редки случаи можеше да доведе до повреждане на базата данни и наречена «WAL-reset bug»:
    • Тази грешка възниква само в бази данни, работещи в режим WAL, ако към един и същи файл са отворени две или повече връзки в различни нишки или процеси, и ако тези две връзки се опитват да извършат запис или да създадат контрольна точка едновременно.
    • Грешката е свързана с конфликт на достъп до данни при строги времеви ограничения. В нормални условия на експлоатация тя възниква изключително рядко. Разработчиците не успяха да възпроизведат тази грешка в естествени условия и им се наложи да добавят в SQLite специална логика за тестване, която умишлено създава условия за възникване на грешката, за да се уверят, че проблемът е отстранен.
    • Грешката възниква, когато:
      1. Едно свързване извършва проверка на контрольна точка. Тази първа проверка трябва да бъде завършена. С други думи, по време на проверката трябва успешно да бъде копирано съдържанието на файла WAL обратно в базата данни и файлът WAL да бъде приведен в състояние, в което да може да бъде сброшен.
      2. Непосредствено след завършване на работата на първата контрольна точка стартира втора.
      3. Докато стартира втората контрольна точка от стъпка 2, друга връзка към базата данни фиксира транзакция, която сбросва файла WAL и записва ново съдържание в началото на файла WAL.
      4. Поради конфликта на достъп до данни, втората контрольна точка от стъпка 2 не отчита, че файлът WAL е бил сброшен в резултат на фиксирането на транзакцията от стъпка 3. Втората контрольна точка установява неверно значение за едно от полетата в заглавката на WAL. Това поле показва, че част от файла WAL вече е била фиксирана в контрольна точка, макар че всъщност не е.
      5. Фиксирането на допълнителни транзакции води до увеличаване на количеството страници в файла WAL, което надвишава броя на страниците, съществували към момента на първата контрольна точка от стъпка 1.
      6. По-късно, когато възникне третата контрольна точка, тя пропуска цялата или част от транзакцията, записана на етап 3. По този начин части от транзакцията на етап 3 не попадат във файла на базата данни, в резултат на което файлът на базата данни се поврежда.
    • Грешката вероятно присъства във всички версии на SQLite, започващи от 3.7.0 (21.07.2010) до 3.51.2. Също така са издадени поправки за някои по-стари версии: 3.44.6 и 3.50.7.
  • Други незначителни корекции.

Източник: linux.org.ru

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster