Контрольная сумма для базы данных SQLite? - PullRequest
3 голосов
/ 09 января 2011

Я бы хотел сказать, обновлялся ли файл базы данных SQLite каким-либо образом.Как мне реализовать это?

Первое решение, о котором я думаю, это сравнение контрольных сумм, но у меня нет никакого опыта работы с контрольными суммами.

Ответы [ 3 ]

6 голосов
/ 17 февраля 2011

В соответствии с http://www.sqlite.org/fileformat.html SQLite3 поддерживает file change counter в байте 24..27 файла базы данных.Он не зависит от времени изменения файла, которое, например, может измениться после двоичного восстановления или отката, при этом ничего не изменилось:

$ sqlite3 test.sqlite 'create table test ( test )'
$ od --skip-bytes 24 --read-bytes=4 -tx1  test.sqlite | sed -n '1s/[^[:space:]]*[[:space:]]//p' | tr -d ' '
00000001
$ sqlite3 test.sqlite "insert into test values ( 'hello world');"
$ od --skip-bytes 24 --read-bytes=4 -tx1  test.sqlite | sed -n '1s/[^[:space:]]*[[:space:]]//p' | tr -d ' '
00000002
$ sqlite3 test.sqlite "delete from test;"
$ od --skip-bytes 24 --read-bytes=4 -tx1  test.sqlite | sed -n '1s/[^[:space:]]*[[:space:]]//p' | tr -d ' '
00000003
$ sqlite3 test.sqlite "begin exclusive; insert into test values (1); rollback;"
$ od --skip-bytes 24 --read-bytes=4 -tx1  test.sqlite | sed -n '1s/[^[:space:]]*[[:space:]]//p' | tr -d ' '
00000003

Чтобы быть уверенным, что два файла базы данных «равны», вы можетебыть уверенным только после выгрузки файлов (.dump), сокращения вывода до операторов INSERT и сортировки результата для сравнения (возможно, с помощью некоторой криптографической безопасной контрольной суммы).Но это просто излишество.

1 голос
/ 18 июня 2011

Если одна из баз данных sqlite используется только как копия (только для чтения), и вы хотите проверить, был ли обновлен исходный файл базы данных, чтобы вы могли обновить копию (например, из Интернета, не загружая изначально, если он не отличается от копии), то вы можете просто сравнить первые 100 байтов обоих файлов базы данных (заголовки базы данных) http://www.sqlite.org/fileformat.html

Для байтов 24..27 заголовка базы данных, SQlite doc говорит:

24..27 4
Счетчик изменений файла. Каждый раз, когда транзакция базы данных фиксируется, значение 32-разрядного целого числа без знака, хранящегося в этом поле, увеличивается

После некоторого тестирования кажется, что счетчик изменений файла не увеличивается, когда транзакция базы данных фиксируется, а содержит только операторы select, что является желаемым поведением в случае, когда вы заключаете выборки в транзакцию и подтверждаете завершение транзакции.

1 голос
/ 09 января 2011

В зависимости от размера базы данных, непрерывный опрос и генерация контрольной суммы могут быть слишком интенсивными для машины.

Рассматривали ли вы мониторинг последних измененных метаданных, хранящихся в файловой системе ОС?

...