SQLite 3.51.3 с исправлением возможного повреждения базы данных в режиме WAL

good-penguin.png

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.
  • Другие незначительные исправления.

>>> Страница загрузки

>>> Подробности на sqlite.org

©  Linux.org.ru