SQLite и файлы с именами 8+3
По умолчанию SQLite предполагает, что основная файловая система поддерживает длинные имена файлов.
SQLite не накладывает никаких требований к именованию файлов баз данных. SQLite без проблем будет работать с файлом базы данных, имеющим любое расширение имени файла или вообще без расширения. Когда для журнала отката, журнала предварительной записи или одного из других типов временных файлов на диске нужны вспомогательные файлы, имя вспомогательного файла обычно строится путем добавления суффикса к имени файла базы данных. Например, если исходная база данных называется "app.db", то журнал отката будет называться "app.db-journal", а журнал предварительной записи — "app.db-wal". Этот подход к именованию вспомогательных файлов отлично работает на системах, поддерживающих длинные имена файлов. Но на системах, которые накладывают ограничения на имена файлов в формате 8+3, вспомогательные файлы не соответствуют формату 8+3, даже если исходный файл базы данных этому формату соответствует.
Изменение файловой системы
Рекомендуемое решение этой проблемы — выбор другой файловой системы. В наши дни существует огромный выбор высокопроизводительных, надёжных и свободных от патентов файловых систем, поддерживающих длинные имена файлов. В тех случаях, где это возможно, рекомендуется, чтобы встроенные устройства использовали одну из этих других файловых систем. Это позволит избежать проблем совместимости и опасности повреждения базы данных, вызванного несогласованным использованием имён файлов в формате 8+3.
Настройка SQLite для использования имён файлов в формате 8+3
Некоторые устройства вынуждены использовать более старую файловую систему с ограничениями на имена файлов в формате 8+3 для обеспечения обратной совместимости или по другим причинам, не относящимся к технической стороне вопроса. В таких ситуациях SQLite можно заставить использовать вспомогательные файлы, которые соответствуют шаблону 8+3, следующим образом:
-
Скомпилируйте библиотеку SQLite с опциями компиляции SQLITE_ENABLE_8_3_NAMES=1 или SQLITE_ENABLE_8_3_NAMES=2. Поддержка имён файлов в формате 8+3 по умолчанию не включена в SQLite, так как это увеличивает нагрузку. Нагрузка небольшая, но тем не менее, мы не хотим обременять миллиарды приложений SQLite, которым не требуется поддержка имён файлов в формате 8+3.
-
Если используется опция SQLITE_ENABLE_8_3_NAMES=1, то SQLite способно использовать имена файлов в формате 8+3, но эта возможность отключена и должна быть включена отдельно для каждого подключения к базе данных, используя URI-имена файлов при открытии или прикреплении файлов базы данных и включив параметр запроса "
8_3_names=1" в URI. Если SQLite скомпилировано с SQLITE_ENABLE_8_3_NAMES=2, то имена файлов в формате 8+3 включены по умолчанию, и этот шаг можно пропустить. -
Убедитесь, что имена файлов базы данных следуют формату имени файла 8+3 и что у них нет пустого имени или расширения. Другими словами, имя файла базы данных должно содержать от 1 до 8 символов в имени файла и от 1 до 3 символов в расширении. Пустые расширения не допускаются.
При использовании вышеуказанных шагов SQLite будет сокращать расширения имен файлов, используя только последние 3 символа расширения. Таким образом, например, файл, который обычно назывался "app.db-journal", сократится до просто "app.nal". Аналогично, "app.db-wal" станет "app.wal", а "app.db-shm" станет "app.shm".
Обратите внимание, что очень важно, чтобы файл базы данных имел какое-либо расширение. Если расширения нет, то SQLite создаёт вспомогательные имена файлов, добавляя их к имени файла. Таким образом, база данных с именем "db01" будет иметь файл журнала отката с именем "db01-journal". Поскольку у этого имени файла нет расширения, которое можно сократить до 3 символов, оно будет использоваться как есть и нарушит правила именования 8+3.
Предупреждение о повреждении базы данных
Если к файлу базы данных осуществляется доступ с использованием именования 8+3 вместо стандартного длинного имени, то к нему должен быть последовательно осуществлён доступ с использованием именования 8+3 каждым подключением к базе данных при каждом открытии, иначе существует риск повреждения базы данных. Вспомогательные файлы журнала отката и журнала предварительной записи являются важными компонентами SQLite для восстановления после сбоя. Если приложение использует имена 8+3 и аварийно завершается, то информация, необходимая для безопасного восстановления после сбоя, хранится в файлах с расширением ".nal" или ".wal". Если следующее приложение для открытия базы данных не указывает параметр URI "8_3_names=1", то SQLite будет использовать длинные имена файлов для поиска файлов журнала отката или журнала предварительной записи. Оно их не найдёт, так как они были сохранены с использованием имен 8+3 приложением, которое аварийно завершилось, и, следовательно, база данных не будет должным образом восстановлена и, вероятно, будет повреждена.
Использование файла базы данных с именами в формате 8+3 в одних случаях и длинных имён в других эквивалентно удалению активного журнала.
Эта страница была в последний раз изменена 08.01.2022 05:02:57 UTC
SQLite is in the Public Domain.
https://sqlite.org/shortnames.html