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 (Дан) откри и отстрани грешка, която в редки случаи можеше да доведе до повреждане на базата данни и беше наречена грешка "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