Что такое расширения .db-shm и .db-wal в базах данных Sqlite? - PullRequest
50 голосов
/ 15 октября 2011

Я вижу странное поведение с моим приложением и состоянием его файла базы данных после запуска некоторых тестов, которые закрывают базу данных, удаляют ее и заменяют ее тестовым прибором.Когда я проверяю файл базы данных с помощью инструмента на моем компьютере, на котором выполняется отладка, он не совпадает с тем, что, по-видимому, сообщает само приложение.Возможно, это странное поведение связано с этой ошибкой .

. Я заметил, что есть два файла с тем же базовым именем, что и у базы данных (с нормальным расширением .db).Расширения файлов: .db-shm и .db-wal, каждое из которых новее, чем отметка времени файла .db.

Я предполагаю, что это временные файлы.Тем не менее, мне интересно, если приложение закрыто, не должны ли они быть удалены?Что еще более важно, я предполагаю, что все данные, хранящиеся в них, обновляются в файле .db до того, как приложение будет завершено операционной системой.Это правильно?

Ответы [ 2 ]

29 голосов
/ 15 октября 2011

Вы правы, это временные файлы, созданные SQLite.Если вы удаляете основную базу данных вручную, вы, вероятно, должны удалить их тоже.Из того, что я могу собрать, WAL является заменой журнала отката, который позволяет SQLite откатывать изменения в случае сбоя транзакции.Как SQLite использует их и почему они хранятся так долго, зависит от авторов SQLite, но в целом SQLite выглядит довольно солидно, поэтому я бы не стал слишком беспокоиться о них.Для получения дополнительной информации посмотрите здесь:

http://www.sqlite.org/fileformat2.html#walindexformat

Эти файлы являются новой функцией SQLite 3.7.Я не уверен, что их существование связано с указанной вами ошибкой, но в отчете об ошибках все равно предлагается обходной путь.

4 голосов
/ 03 июня 2019

У меня пока нет достаточной репутации, чтобы просто добавить комментарий к ответу satur9nine, поэтому я добавлю сюда.

Согласно документам SQLite , файл DB-SHMфайл общей памяти, присутствует только в том случае, если SQLite работает в режиме WAL (запись в журнал записи).Это связано с тем, что в режиме WAL соединения базы данных, совместно использующие один и тот же файл базы данных, должны обновлять ту же область памяти, которая используется в качестве индекса для файла WAL, для предотвращения конфликтов.

Что касается файла WAL, как указано выше, этозапись журнала / журнала, полезная для фиксации / отката.Если БД не работает, то этот файл вполне можно удалить, и фактически он будет автоматически удален при перезапуске БД, если таковой существует (поскольку это полезно, только когда БД активно записывает / фиксирует данные).

...