2014-12-18 1 views
1

Я пишу непрерывно в файл 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 не увеличивался?

ответ

0

Это слишком поздно в качестве ответа, но может быть полезно другим людям.

В соответствии с SQLite documentation, ваши ожидания должны быть правильными, но если вы читаете этот SO post, проблемы возникают и в случае нефинализированных утверждений. Поэтому, если вы просто sqlite3_reset() ваше заявление, есть шансы в любом случае, что db может выглядеть занят или заблокирован для контрольно-пропускного пункта. Обратите внимание, что это может случиться и с более высокими уровнями SQLITE_CHECKPOINT_values.

Кроме того, значение SQLITE_CHECKPOINT_TRUNCATE, если проверка успешно завершена, обрезает файл -wal на нулевую длину. Это может помочь вам проверить, что все страницы были вставлены в db.

Другое обсуждение, в котором файлы -wal становятся все больше и больше из-за незавершенных заявлений this.

+0

Другие обсуждения этого и по размеру файла 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