校验和SQLite数据库?

c00*_*ter 3 sqlite checksum

我希望能够判断SQLite数据库文件是否已经以任何方式更新.我该如何实施呢?

我想到的第一个解决方案是比较校验和,但我没有任何使用校验和的经验.

Tin*_*ino 6

根据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
Run Code Online (Sandbox Code Playgroud)

为了真正确保两个数据库文件的转储文件(在"平等",你才能确定.dump),减少输出到INSERT报表和排序该结果进行比较(也许是一些加密安全校验和).但这显然有点矫枉过正.


Dan*_*ath 1

根据数据库的大小,连续轮询和生成校验和可能对机器来说有点过于密集。

您是否考虑过监视存储在操作系统文件系统上的最后修改的元数据?