3
A
回答
1
根据数据库的大小,连续轮询和生成校验和可能对机器来说过于密集。
您是否考虑过监视操作系统文件系统上存储的上次修改元数据?
6
根据http://www.sqlite.org/fileformat.html SQLite3在数据库文件的字节24..27
中维护file change counter
。它是独立的文件更改时间,其中,例如,可以二进制后更改,而没有任何改变都恢复或回滚:
$ 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
如果其中一个sqlite数据库仅用作副本(只读),并且您想要检查原始数据库文件是否已更新,以便您可以更新副本(例如从Web上进行更新,而无需下载那么你可以比较两个数据库文件(数据库头文件)的前100个字节http://www.sqlite.org/fileformat.html
对于数据库头的字节24..27,SQlite doc说:
24..27 4
文件更改计数器。每一个数据库事务提交时,存储在这一领域的32位无符号整数的值增加
看来,当一个数据库事务提交的文件更改计数器不增加,但只有经过一些测试包含select语句,这是您在事务中包装选择并提交结束事务时所需的行为。
+1以我没有想到的方式使用od。 – 2011-02-17 13:25:08