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