Hacker News Digest

Тег: #fsync

Постов: 2

SQLite's documentation about its durability properties is unclear (agwa.name)

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;

by ciconia • 29 августа 2025 г. в 17:30 • 132 points

ОригиналHN

#sqlite#durability#journal-mode#fsync#wal#database#pragmas

Комментарии (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 (avi.im)

SQLite в режиме WAL по умолчанию не вызывает fsync после каждого COMMIT.

  • Параметр PRAGMA synchronous=NORMAL (значение по умолчанию) не гарантирует сохранность транзакции при внезапном отключении питания.
  • В этом режиме fsync выполняется лишь:
    – перед контрольной точкой WAL;
    – после завершения контрольной точки;
    – при повторном использовании WAL-файла.
  • Для жёсткой гарантии сохранности нужно:
    PRAGMA synchronous = FULL;
    
    Тогда после каждого COMMIT будет вызываться fsync WAL-файла.

by Bogdanp • 24 августа 2025 г. в 15:40 • 97 points

ОригиналHN

#sqlite#wal#fsync#database#acid#macos#litestream

Комментарии (70)

  • По умолчанию SQLite компилируется с synchronous=FULL, но дистрибутивы или обёртки могут изменить это.
  • Не стоит полагаться на умолчания — явно задавайте параметры, особенно если нужна надёжность.
  • WAL-режим ускоряет работу, но требует общей памяти и нарушает ACID для attached БД.
  • На macOS для гарантированной надёжности нужен F_FULLFSYNC, но Apple использует собственную реализацию.
  • Litestream рекомендует synchronous=NORMAL, так как и так делает регулярные бэкапы.