2013-07-31 3 views
1

Если база данных SQLite, использующая запись на основе записи, прервана транзакциями без проверки (из-за сбоя питания или чего-то еще), то при повторном открытии временного файла-пробела база данных будет открыта в чисто состоянии до последнего состояния контрольная точка, или она будет повреждена каким-либо образом?Последствия -wal-файла, исчезающего в SQLite?

Мы пытаемся заставить SQLite работать с iCloud (да, мы знаем, что вы не должны этого делать, но мы также делаем Windows и приложение для Android и нуждаемся в кросс-платформенном решении базы данных), и мы что WAL предоставляет потенциальный способ избежать поддержки двух копий нашей базы данных - мы сохранили бы -wal-файл за пределами iCloud, но сохраним в нем основную базу данных, тем самым избегая проблемы с резервными журналами отката iCloud (или поддержкой до середины транзакций без этих журналов).

ответ

3

file format documentation упоминает «горячий файл WAL», но это относится только к незафиксированным данным.

Файл базы данных сам по себе не содержит никакой информации об зафиксированных данных в файле -wal, то есть транзакции до того, как контрольная точка обычно вообще не изменяет основной файл базы данных. Таким образом, удаление файла -wal просто приведет к восстановлению базы данных до состояния, которое было после последней контрольной точки (которая устарела, но последовательна); все транзакции, совершенные позднее, будут просто потеряны.

1

См. Раздел «Контрольная точка» в разделе SQLite Write-Ahead Logging. Насколько я понимаю, данные в файле WAL просто не будут зафиксированы.

Другими словами, вы потеряете данные в файле .WAL, который еще не был зафиксирован, но основная база данных должна быть в порядке.

0

Это может привести к повреждению db, когда файл WAL будет удален во время операции контрольной точки. В случае незавершенной модификации db для завершения изменений необходим WAL-файл, в противном случае db-файл находится в переходном состоянии.
DB и файл WAL создают полную картину состояния db.
В https://www.sqlite.org/howtocorrupt.html#delhotjrnl также явно указано, что «SQLite должен видеть файлы журнала для восстановления после сбоя или сбоя питания».

Смежные вопросы