SQLite's documentation about its durability properties is unclear
SQLite и надёжность: бардак в настройках
Надёжность (durability) — гарантия, что после COMMIT изменения сохранятся даже при падении ОС или отключении питания. На Linux это обеспечивается вызовом fsync. Цена — производительность, поэтому СУБД дают «ручки» для настройки. Главное, чтобы документация чётко объясняла, что включено по умолчанию.
У SQLite всё запутано. Два ключевых параметра:
journal_mode(DELETE | WAL …)synchronous(EXTRA, FULL, NORMAL, OFF)
По документации:
- По умолчанию
journal_mode=DELETE,synchronous=FULL. - В режиме DELETE
FULLне гарантирует надёжность; нуженEXTRA. - В режиме WAL
FULLуже достаточно.
Вывод: «из коробки» SQLite не надёжна; переключившись на WAL — становится.
Однако Ричард Хипп (автор SQLite) в комментарии на HN утверждает прямо противоположное:
- «В конфигурации по умолчанию SQLite надёжна».
- «Если включить WAL, по умолчанию надёжность теряется».
Документация и автор расходятся.
Дополнительные ловушки:
- Обертки могут переопределять
synchronous. Популярный драйвер Go для SQLite ставитNORMALв WAL-режиме — надёжности нет. - На macOS
fsyncработает не как на Linux, что тоже снижает гарантии.
Итого: чтобы быть уверенным, явно задайте
PRAGMA journal_mode = WAL; PRAGMA synchronous = FULL;
Комментарии (51)
- Участники спорят, что «durability» в SQLite зависит от комбинации journal_mode и synchronous, а не от единого определения.
- По-умолчанию (DELETE + FULL) SQLite не гарантирует durability при сбое ОС/питания, потому что fsync не всегда успевает закрепить журнал.
- WAL по умолчанию защищает от краха приложения, но не от краха ОС; для полной durability нужно synchronous=FULL.
- Некоторые считают документацию ясной, другие — запутанной и просят примеров выбора режимов.
- Поднимаются вопросы надёжности fsync, файловых систем и дисков, а также желание «SQLite 4» с новыми умолчаниями.
SQLite (with WAL) doesn't do `fsync` on each commit under default settings
SQLite в режиме WAL по умолчанию не вызывает fsync после каждого COMMIT.
- Параметр
PRAGMA synchronous=NORMAL(значение по умолчанию) не гарантирует сохранность транзакции при внезапном отключении питания. - В этом режиме
fsyncвыполняется лишь:
– перед контрольной точкой WAL;
– после завершения контрольной точки;
– при повторном использовании WAL-файла. - Для жёсткой гарантии сохранности нужно:
Тогда после каждогоPRAGMA synchronous = FULL;COMMITбудет вызыватьсяfsyncWAL-файла.
Комментарии (70)
- По умолчанию SQLite компилируется с
synchronous=FULL, но дистрибутивы или обёртки могут изменить это. - Не стоит полагаться на умолчания — явно задавайте параметры, особенно если нужна надёжность.
- WAL-режим ускоряет работу, но требует общей памяти и нарушает ACID для attached БД.
- На macOS для гарантированной надёжности нужен
F_FULLFSYNC, но Apple использует собственную реализацию. - Litestream рекомендует
synchronous=NORMAL, так как и так делает регулярные бэкапы.