Я пишу непрерывно в файл db, который имеет PRAGMA journal_mode = WAL, PRAGMA journal_size_limit = 0. Моя программа на C++ имеет два потока, один читатель (запросы с интервалом 15 секунд) и один сценарий (вставки с интервалом 5 секунд).SQLAL размер файла wal продолжает расти
Каждые 3 минуты я приостанавливаю вставку для запуска sqlite3_wal_checkpoint_v2() из потока записи с параметром mode как SQLITE_CHECKPOINT_RESTART. Чтобы гарантировать, что в данный момент не происходит активных операций чтения, я устанавливаю флаг, который должен пройти контрольная точка, и ждать завершения чтения (соединение все еще открыто) перед запуском контрольной точки. После завершения контрольной точки я снова указываю читателям, что можно возобновить запрос.
sqlite3_wal_checkpoint_v2() возвращает SQLITE_OK, а pnLog и Ckpt равны (около 4000), указывая на то, что полный файл wal был синхронизирован с основным db-файлом. Поэтому следующая запись должна начинаться с начала в соответствии с документацией. Однако, похоже, это не происходит, поскольку последующие записи заставляют файл WAL расти неограниченно, в конечном итоге до нескольких ГБ.
Я искал и обнаружил, что эти читатели могут вызвать сбой контрольной точки из-за открытых транзакций. Тем не менее, единственный читатель, которого я использую, заканчивает свою транзакцию до начала контрольной точки. Что еще может препятствовать тому, чтобы файл WAL не увеличивался?
Другие обсуждения этого и по размеру файла WAL: на [SO] (http://stackoverflow.com/questions/20969996/is-it-safe-to-delete-sqlites-wal-file), a [ ошибка] (https://bugzilla.mozilla.org/show_bug.cgi?id=609122) для mozilla; a [второй] (https://bugzilla.mozilla.org/show_bug.cgi?id=608422). – fedino