Чтобы ответить полностью, нам нужно знать, на что установлена PRAGMA synchronous
, поскольку это влияет на то, когда вызывается fdatasync()
и, следовательно, когда на физическом диске сбрасываются буферы.
Когда вы цитируете «пока приложение готово пожертвовать долговечностью после потери питания», это означает наличие synchronous=NORMAL
. Здесь WAL синхронизируется только с диском, когда происходит контрольная точка (одна fdatasync()
для WAL и одна для основной БД после ее объединения). Вы должны быть защищены от коррупции довольно хорошо, но могут быть некоторые записи, которые так и не попали на блюдо и, таким образом, потерялись: отсюда и потеря прочности. Тем не менее, положительный эффект от медленной функции fdatasync () для синхронизации данных намного меньше.
Чтобы обеспечить наилучшую устойчивость к потере данных, вам может потребоваться synchronous=FULL
. Это восстанавливает долговечность, но стоимость составляет одну fdatasync()
за транзакцию записи. Однако это все же лучше, чем в режиме без WAL, когда будет два fdatasync()
вызова - один для журнала транзакций и один для основной БД.